Подтвердить что ты не робот

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 из терминала. Любая помощь будет принята с благодарностью. Спасибо!

4b9b3361

Ответ 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 [[ ... ]]
...