Bash script если утверждения

В Bash script, в чем разница между следующими фрагментами?

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

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

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

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

Ответы

Ответ 1

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

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

Дополнительная информация о расширенном Bash руководстве по написанию сценариев.

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

http://freshmeat.net/projects/bournesh

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

Ответ 5

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

which [
/usr/bin/[

В одиночных квадратных скобках вы должны использовать -lt для 'меньше, чем' псевдоним < в то время как вы могли бы использовать <

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.