выпуск двойных скобок bash - PullRequest
23 голосов
/ 12 марта 2012

Я очень плохо знаком с сценариями bash и столкнулся с проблемой при использовании двойных скобок.Я не могу заставить их работать на Ubuntu Server 11.10.Мой скрипт ниже находится в if_test.sh.

#!/bin/bash

if [[ "14"=="14" ]]; then 
    echo "FOO"
fi

Когда я запускаю этот простой сценарий оболочки, получаю вывод: if_test.sh: 5: [[: not found

Кажется, что я использую GNU bash версии 4.2.10 после запуска bash --version из терминала.Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

37 голосов
/ 12 марта 2012

Проблема заключается в вызове вашего скрипта. Вы выдаете:

$ sudo sh if_test.sh

В системах Ubuntu /bin/sh - это dash, а не bash, а dash не поддерживает ключевое слово в двойных скобках (или не было на момент публикации, я не перепроверил). Вы можете решить свою проблему, явно вызвав bash вместо:

$ sudo bash if_test.sh

Кроме того, вы можете сделать ваш скрипт исполняемым и полагаться на строку 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
6 голосов
/ 12 марта 2012

Поскольку вы новичок в написании сценариев, вы можете не знать, что [[ - это башизм.Вы можете даже не знать, что такое bashism, но оба ответа, приведенные до сих пор, ведут вас по пути к замедленному будущему сценариев, продвигая их использование.

Чтобы проверить, совпадает ли переменная со строкой в ​​любом варианте оболочки Bourne, вы можете сделать test $V = 14 Если вы хотите сравнить целые числа, используйте test $V -eq 14.Разница лишь в том, что последний выдаст ошибку, если $ V не будет выглядеть как целое число.Есть веские причины указывать переменную (test "$V" = 14), но кавычки часто не нужны, и я считаю, что это является основной причиной общей путаницы, поскольку "14"=="14" идентичен "14==14", где более очевидно, что '== 'не используется в качестве оператора.

Следует отметить несколько вещей: используйте один '=' вместо '==', потому что не все оболочки распознают '==', команда [ идентична test, но требует финальногоаргумент ] и многие руководящие принципы кодирования sh рекомендуют использовать test, поскольку он часто генерирует более понятный код, [[ распознается только ограниченным числом оболочек (это ваша основная проблема, так как ваша оболочка не распознает[[ и ищет команду с таким именем. Удивительно, если ваш шебанг действительно указывает /bin/bash вместо /bin/sh).

5 голосов
/ 23 сентября 2013

Мой ответ не относится конкретно к вопросу @ lots_of_questions, но вы также можете столкнуться с этой проблемой, если у вас неверный спецификатор в верхней части скрипта:

#!/bin/sh
if [[ ... ]]
...

Вы должны изменить его на

#!/bin/bash
if [[ ... ]]
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...