Когда я запускаю команды в своей оболочке, как показано ниже, она возвращает ошибку 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
Почему бы не использовать 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
По умолчанию для большинства дистрибутивов Linux используется Bash. В Bash переменные должны использовать префикс знака доллара для расширения . Например:
x=20
y=5
expr $x / $y
Конечно, Bash также имеет арифметические операторы и специальный арифметический синтаксис расширения, так что нет необходимости ссылаться на двоичный код expr как отдельный процесс. Вы можете позволить оболочке выполнить всю работу следующим образом:
x=20; y=5
echo $((x / y))
Я считаю, что это уже упоминалось в других потоках:
calc(){ awk "BEGIN { print "$*" }"; }
то вы можете просто ввести:
calc 7.5/3.2
2.34375
В вашем случае это будет:
x=20; y=3;
calc $x/$y
или, если хотите, добавьте это как отдельный script и сделайте его доступным в $PATH, чтобы вы всегда имели его в своей локальной оболочке:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
Вы можете использовать подстановку команд следующим образом:
z="$(expr $x / $y)"
echo "$z"
Удостоверьтесь, что места, указанные выше,