В 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
[[ -n $(echo -ne "\0") ]]; echo $?
и[ -n $(echo -ne "\0") ]; echo $?
отличаются[ -n ]
же самое[ -n -n ]
. В оболочках, отличных от zsh, аргументы команды (даже встроенные) или переменные оболочки не могут содержать символы NUL.Ответы:
[ "$var" ]
эквивалентно[ -n "$var" ]
в bash и большинстве оболочек в наше время. В других более старых оболочках они должны быть эквивалентны, но страдают от различных ошибок для некоторых специальных значений типа «$ var», например=
,(
или!
.Я нахожу
[ -n "$var" ]
более разборчивым и является кулоном[ -z "$var" ]
.[[ -n $var ]]
такой же, как и[[ $var ]]
во всех оболочках, где реализован этот нестандартный синтаксис ksh.test "x$var" != x
будет наиболее надежным, если вы хотите быть портативным для очень старых оболочек.источник
Согласно тесту для строки ненулевой длины в bash: [-n «$ var»] или [«$ var»] , да, они эквивалентны.
Они эквивалентны даже цитированию имени переменной.
Важно отметить : название вопроса, на которое я ссылаюсь, относится только к
[
ответу, но ответ учитывает и то,[
и другое[[
.источник
[[]]
это не эквивалент[]
:)