Ожидаемая ошибка целочисленного выражения в оболочке 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