Разница между [[$ variable]] и [[-n $ variable]]?

8

В bash есть [[ $variable ]]и [[ -n $variable ]]полностью эквивалентны? Судя по приведенным ниже выводам, похоже, что это так, но я вижу, что обе формы использования преобладают в сценариях оболочки.

$ z="abra"
$ [[ $z ]]
$ echo $?
0
$ [[ -n $z ]]
$ echo $?
0
$ z=""
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1
$ unset z
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1
Iruvar
источник
Гектометр Интересно. Выходы от [[ -n $(echo -ne "\0") ]]; echo $?и [ -n $(echo -ne "\0") ]; echo $?отличаются
дчириков
@dchirikov, это потому, что во втором вы забыли процитировать замену команды, так что в итоге получилось то [ -n ]же самое [ -n -n ]. В оболочках, отличных от zsh, аргументы команды (даже встроенные) или переменные оболочки не могут содержать символы NUL.
Стефан Шазелас

Ответы:

4

[ "$var" ]эквивалентно [ -n "$var" ]в bash и большинстве оболочек в наше время. В других более старых оболочках они должны быть эквивалентны, но страдают от различных ошибок для некоторых специальных значений типа «$ var», например =, (или !.

Я нахожу [ -n "$var" ]более разборчивым и является кулоном [ -z "$var" ].

[[ -n $var ]]такой же, как и [[ $var ]]во всех оболочках, где реализован этот нестандартный синтаксис ksh.

test "x$var" != x будет наиболее надежным, если вы хотите быть портативным для очень старых оболочек.

Стефан Шазелас
источник
1

Согласно тесту для строки ненулевой длины в bash: [-n «$ var»] или [«$ var»] , да, они эквивалентны.

Они эквивалентны даже цитированию имени переменной.

Важно отметить : название вопроса, на которое я ссылаюсь, относится только к [ответу, но ответ учитывает и то, [и другое [[.

nozimica
источник
1
Но [[]]это не эквивалент []:)
dchirikov
Нет, это не так. Но в ответе я привожу обе формы.
nozimica
Поведение при тестировании "\ 0" как переменной отличается. Оператор [] дает 0 или 1. И [[]] дает 1 в обоих случаях.
дчириков
+1 за ссылку, которая очень информативна, однако ответ Стефана Чазеласа, который я принял, более важен.
iruvar