Bash скрипт, если заявления - PullRequest
13 голосов
/ 15 апреля 2010

В скрипте Bash, чем отличаются следующие фрагменты?

1) Использование одинарных скобок:

if [ "$1" = VALUE ] ; then
 # code
fi

2) Использование двойных скобок:

if [[ "$1" = VALUE ]] ; then
 # code
fi

Ответы [ 5 ]

8 голосов
/ 15 апреля 2010

Конструкция [[]] является более универсальной Bash-версией []. Это расширенная команда тестирования, принятая из ksh88.

Использование тестовой конструкции [[...]] вместо [...] может предотвратить множество логических ошибок в сценариях. Например, операторы &&, ||, <и> работают в тесте [[]], несмотря на ошибку в конструкции [].

Более подробная информация о Advanced Bash Scripting Guide .

В ваших отрывках нет разницы, поскольку вы не используете какие-либо дополнительные функции.

2 голосов
/ 15 апреля 2010

[ - встроенная функция bash, [[ - ключевое слово. См. bash FAQ . Осторожно: большинство сценариев bash в Интернете - это дерьмо (не работают с именами файлов с пробелами, вводят скрытые дыры в безопасности и т. Д.), И освоить bash гораздо сложнее, чем можно подумать. Если вы хотите заниматься программированием на bash, вам следует изучить как минимум руководство по bash и подводные камни bash .

1 голос
/ 15 апреля 2010

Использование [[ подавляет нормальное разбиение слов и расширение пути к выражению в скобках. Он также позволяет выполнять ряд операций добавления, например сопоставление с шаблоном

0 голосов
/ 16 апреля 2010

, которая также является внешней программой, что не означает, что она не является встроенной.

which [
/usr/bin/[

В одиночных квадратных скобках вы должны использовать -lt для псевдонима «меньше» <, в то время как в противном случае вы можете использовать <</p>

if [ 3 -lt 4 ] ; then echo yes ; fi
yes
if [ 3 < 4 ] ; then echo yes ; fi
bash: 4: No such file or directory
if [[ 3 < 4 ]] ; then echo yes ; fi
yes
if [[ 3 -lt 4 ]] ; then echo yes ; fi
yes

4: Нет такого файла, значит, он пытается прочитать из файла с именем "4" - перенаправить stdin <То же самое для> и stdout.

0 голосов
/ 15 апреля 2010

На всякий случай, если требуется переносимость:

Для тестирования переносимости вы можете получить оболочку Bourne через проект Heirloom или:

http://freshmeat.net/projects/bournesh

(Например, в Mac OS X / bin / sh не является чисто оболочкой Борна.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...