Сценарий Bash, если операторы

В сценарии Bash, каково различие между следующими отрывками?

1) Используя одиночные скобки:

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

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

if [[ "$1" = VALUE ]] ; then
 # code
fi
13
задан Jonhnny Weslley 14 April 2010 в 21:00
поделиться

5 ответов

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

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

Дополнительная информация в Advanced Bash Scripting Guide .

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

8
ответ дан 2 December 2019 в 01:10
поделиться

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

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

http: // freshmeat.net/projects/bournesh

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

0
ответ дан 2 December 2019 в 01:10
поделиться

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

2
ответ дан 2 December 2019 в 01:10
поделиться

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

1
ответ дан 2 December 2019 в 01:10
поделиться

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

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 <То же самое для> и стандартного вывода.

0
ответ дан 2 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: