Когда я запускаю команды в своей оболочке, как показано ниже, она возвращает expr: non-integer argument
ошибку. Может кто-нибудь, пожалуйста, объясните мне это?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Когда я запускаю команды в своей оболочке, как показано ниже, она возвращает expr: non-integer argument
ошибку. Может кто-нибудь, пожалуйста, объясните мне это?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Ответы:
Эти переменные являются переменными оболочки. Чтобы расширить их как параметры для другой программы ( т.е. expr
), вам нужно использовать $
префикс:
expr $x / $y
Причина, по которой он жаловался, заключается в том, что он думал, что вы пытаетесь оперировать буквенными символами ( т.е. не целыми числами)
Если вы используете оболочку Bash, вы можете достичь того же результата, используя синтаксис выражения:
echo $((x / y))
Или:
z=$((x / y))
echo $z
man bash
в командной строке ( q
для выхода)
Я считаю, что это уже упоминалось в других темах:
calc(){ awk "BEGIN { print "$*" }"; }
тогда вы можете просто набрать:
calc 7.5/3.2
2.34375
В вашем случае это будет:
x=20; y=3;
calc $x/$y
или, если хотите, добавьте его как отдельный скрипт и сделайте его доступным в $ PATH, чтобы он всегда был в локальной оболочке:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Почему бы не использовать let; Я нахожу это намного проще. Вот пример, который вы можете найти полезным:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Еще один простой пример - подсчитать количество дней с 1970 года:
let days=$(date +%s)/86400
Оболочкой по умолчанию в большинстве дистрибутивов Linux является Bash. В Bash переменные должны использовать префикс знака доллара для расширения параметров . Например:
x=20
y=5
expr $x / $y
Конечно, Bash также имеет арифметические операторы и специальный синтаксис арифметического расширения , поэтому нет необходимости вызывать двоичный файл expr как отдельный процесс. Вы можете позволить оболочке выполнять всю работу следующим образом:
x=20; y=5
echo $((x / y))
expr
не приветствуется в 2013 году.
давайте предположим
x=50
y=5
затем
z=$((x/y))
это будет работать правильно. Но если вы хотите использовать / оператор в операторах case, то он не может решить это. В этом случае используйте простые строки, такие как div или devide или что-то еще. См код
/
отлично работает как метка оболочки Что не работает - это использовать *
для умножения без цитирования, что может быть тем, что вы на самом деле сделали; это приводит к тому, что он эффективно переопределяет все последующие элементы в кейсе, который в вашем примере является «devide» и «modulo»
Чтобы получить числа после десятичной точки, вы можете сделать это: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div