Ожидаемая ошибка целочисленного выражения в оболочке script
Я новичок в оболочках, поэтому у меня есть вопрос. Что я делаю неправильно в этом коде?
#!/bin/bash
echo " Write in your age: "
read age
if [ "$age" -le "7"] -o [ "$age" -ge " 65" ]
then
echo " You can walk in for free "
elif [ "$age" -gt "7"] -a [ "$age" -lt "65"]
then
echo " You have to pay for ticket "
fi
Когда я пытаюсь открыть этот script, он спрашивает меня о моем возрасте, а затем говорит
./bilet.sh: line 6: [: 7]: integer expression expected
./bilet.sh: line 9: [: missing `]'
Я не знаю, что я делаю неправильно. Если бы кто-нибудь мог сказать мне, как это исправить, я был бы благодарен, извините за моего бедного английского, надеюсь, вы, ребята, можете меня понять.
Ответы
Ответ 1
Вы можете использовать этот синтаксис:
#!/bin/bash
echo " Write in your age: "
read age
if [[ "$age" -le 7 || "$age" -ge 65 ]] ; then
echo " You can walk in for free "
elif [[ "$age" -gt 7 && "$age" -lt 65 ]] ; then
echo " You have to pay for ticket "
fi
Ответ 2
Если вы используете -o
(или -a
), он должен находиться внутри скобок команды test
:
if [ "$age" -le "7" -o "$age" -ge " 65" ]
Однако их использование устарело, и вы должны использовать отдельные команды test
, соединенные с помощью ||
(или &&
):
if [ "$age" -le "7" ] || [ "$age" -ge " 65" ]
Убедитесь, что закрывающим скобкам предшествует пробел, так как они технически являются аргументами [
, а не просто синтаксисом.
В bash
и некоторых других оболочках вы можете использовать выражение [[
, как показано в ответе kamituel. Вышеупомянутое будет работать в любой POSIX-совместимой оболочке.
Ответ 3
./bilet.sh: line 6: [: 7]: integer expression expected
Будьте осторожны с " "
./bilet.sh: line 9: [: missing `]'
Это потому, что вам нужно иметь место между скобками типа:
if [ "$age" -le 7 ] -o [ "$age" -ge 65 ]
посмотреть: добавлено пространство, а не " "
Ответ 4
Эта ошибка может также произойти, если переменная, которую вы сравниваете, имеет скрытые символы, которые не являются цифрами/цифрами.
Например, если вы извлекаете целое число из стороннего script, вы должны гарантировать, что возвращенная строка не содержит скрытые символы, например "\ r" или "\n" .
Например:
#!/bin/bash
# Simulate a string returned from a script, which is "1234\r"
a='1234
'
if [ "$a" -gt 1233 ] ; then
echo "number is bigger"
else
echo "number is smaller"
fi
Это приведет к ошибке script : integer expression expected
, потому что $a
содержит нецифровой символ "\ r". Вы должны удалить этот символ, используя инструкции здесь: Как удалить возврат каретки из строки в Bash
Так что используйте что-то вроде этого:
#!/bin/bash
# Simulate a string returned from a script, which is "1234\r"
a='1234
'
# Remove all new line, carriage return, tab characters
# from the string, to allow integer comparison
a="${a//[$'\t\r\n ']}"
if [ "$a" -gt 1233 ] ; then
echo "number is bigger"
else
echo "number is smaller"
fi
Вы также можете использовать set -xv
для отладки bash script и раскрыть эти скрытые символы. См. https://www.linuxquestions.org/questions/linux-newbie-8/bash-script-error-integer-expression-expected-934465/
Ответ 5
Попробуйте следующее:
If [ $a -lt 4 ] || [ $a -gt 64 ] ; then \n
Something something \n
elif [ $a -gt 4 ] || [ $a -lt 64 ] ; then \n
Something something \n
else \n
Yes it works for me :) \n