Разница между условными выражениями с использованием [ и [[

В чем точная разница между:

if [ $? -ne 0 ];

и

if [[ $? -ne 0 ]];

person contrapositive    schedule 29.06.2012    source источник
comment
[ — это (обычно) имя программы. Это должно помочь объяснить некоторые различия.   -  person    schedule 29.06.2012
comment
В bash [ является встроенной программой (попробуйте type [), но [ часто также является внешней программой.   -  person Michael Hoffman    schedule 29.06.2012
comment
См. BashFAQ/031.   -  person Dennis Williamson    schedule 29.06.2012
comment
Также см. это.   -  person Dennis Williamson    schedule 29.06.2012


Ответы (2)


Как указано здесь:

В отличие от [, [[ предотвращает разбиение значений переменных на слова. Итак, если VAR="var with spaces", вам не нужно двойные кавычки $VAR в тесте, хотя использование кавычек остается хорошей привычкой. Кроме того, [[ предотвращает расширение имени пути, поэтому литеральные строки с подстановочными знаками не пытаются расширяться до имен файлов. Использование [[, == и != интерпретирует строки справа как шаблоны шаблонов оболочки для сопоставления со значением слева, например: [[ "value" == val* ]].

person higuaro    schedule 29.06.2012
comment
Небольшое дополнение: такие возможности, как предотвращение разделения слов и расширение имени пути, являются следствием того факта, что [[ является встроенной по сравнению с [, которая является внешней командой. - person Samveen; 29.06.2012
comment
@Samveen: [ — это внешняя команда. Но это также встроенный. - person Dennis Williamson; 29.06.2012

Здесь ничего нет. Однако синтаксис [[...]] вводит некоторые другие вещи, которые вы можете делать с условными выражениями. От help [[:

Returns a status of 0 or 1 depending on the evaluation of the conditional
expression EXPRESSION.  Expressions are composed of the same primaries used
by the `test' builtin, and may be combined using the following operators:

  ( EXPRESSION )    Returns the value of EXPRESSION
  ! EXPRESSION              True if EXPRESSION is false; else false
  EXPR1 && EXPR2    True if both EXPR1 and EXPR2 are true; else false
  EXPR1 || EXPR2    True if either EXPR1 or EXPR2 is true; else false

When the `==' and `!=' operators are used, the string to the right of
the operator is used as a pattern and pattern matching is performed.
When the `=~' operator is used, the string to the right of the operator
is matched as a regular expression.
person Michael Hoffman    schedule 29.06.2012
comment
Нет такого, а вот есть? - person Dennis Williamson; 29.06.2012
comment
Да, абсолютно никакой разницы между результатами [ $? -ne 0 ] и [[ $? -ne 0 ]] нет. - person Michael Hoffman; 29.06.2012