Bash проблема с двойной скобой
Я очень плохо разбираюсь в сценариях bash и сталкиваюсь с проблемой при использовании двойных скобок. Я не могу заставить их работать на Ubuntu Server 11.10. Мой script ниже находится в if_test.sh.
#!/bin/bash
if [[ "14"=="14" ]]; then
echo "FOO"
fi
Когда я запускаю эту простую оболочку script, я получаю вывод: if_test.sh: 5: [[: not found
Кажется, что я запускаю версию GNU bash версии 4.2.10 после запуска bash --version из терминала. Любая помощь будет принята с благодарностью. Спасибо!
Ответы
Ответ 1
Проблема заключается в вызове script. Вы выпускаете:
$ sudo sh if_test.sh
В системах Ubuntu /bin/sh
есть dash
, а не bash
, а dash
не поддерживает ключевое слово double bracket (или не было во время этой публикации я не проверял дважды). Вы можете решить свою проблему, явно вызов bash
вместо этого:
$ sudo bash if_test.sh
В качестве альтернативы вы можете сделать свой script исполняемый файл и полагаться на строку shebang:
$ chmod +x if_test.sh
$ sudo ./if_test.sh
Также обратите внимание, что при использовании между двойными квадратными скобками ==
является оператором сопоставления шаблонов , а не оператором равенства. Если вы хотите проверить равенство, вы можете использовать -eq
:
if [[ "14" -eq "14" ]]; then
echo "FOO"
fi
Или двойные круглые скобки:
if (( 14 == 14 )); then
echo "FOO"
fi
Ответ 2
Поскольку вы новичок в написании сценариев, вы можете не знать, что [[
является башизмом. Возможно, вы даже не знаете, что такое багизм, но оба ответа, приведенные до сих пор, ведут вас по пути к отстающему сценарию будущего, способствуя их использованию.
Чтобы проверить, соответствует ли переменная строке любой вкус оболочки Bourne, вы можете сделать test $V = 14
Если вы хотите сравнить целые числа, используйте test $V -eq 14
. Единственное различие заключается в том, что последний будет генерировать ошибку, если $V не будет выглядеть как целое. Есть веские причины процитировать переменную (test "$V" = 14
), но цитаты часто не нужны, и я считаю, что это основная причина общей путаницы, поскольку "14"=="14"
идентична "14==14"
, где более очевидно, что '= = 'не используется в качестве оператора.
Следует отметить несколько примечаний: используйте "=" вместо "==", потому что не все оболочки распознают "==", команда [
идентична test
, но для этого требуется конечный аргумент ]
и многие правила кодирования sh рекомендуют использовать test
, потому что он часто генерирует более понятный код, [[
распознается только ограниченным количеством оболочек (это ваша основная проблема, так как ваша оболочка не распознает [[
и ищет команду для этого имени. Это удивительно, если ваш shebang действительно указывает /bin/bash
вместо /bin/sh
).
Ответ 3
Мой ответ не относится к вопросу @lots_of_questions конкретно, но вы также можете столкнуться с этой проблемой, если у вас есть неправильный указатель в верхней части вашего script:
#!/bin/sh
if [[ ... ]]
...
Вы должны изменить это на
#!/bin/bash
if [[ ... ]]
...