Diferença entre [[$ variável]] e [[-n $ variável]]?

8

No bash, são [[ $variable ]]e [[ -n $variable ]]completamente equivalentes? Parece ser o caso a julgar pela saída abaixo, mas vejo as duas formas de uso predominantes nos scripts de shell.

$ 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
fonte
Hum. Interessante. Saídas [[ -n $(echo -ne "\0") ]]; echo $?e [ -n $(echo -ne "\0") ]; echo $?diferem
dchirikov 30/01
@dchirikov, isso porque no segundo, você esqueceu de citar a substituição de comando, então acabou sendo [ -n ]a mesma [ -n -n ]. Em shells diferentes de zsh, os argumentos de comando (mesmo embutidos) ou variáveis ​​de shell não podem conter caracteres NUL.
Stéphane Chazelas

Respostas:

4

[ "$var" ]é equivalente ao [ -n "$var" ]bash e à maioria dos shells atualmente. Em outros shells mais antigos, eles devem ser equivalentes, mas sofrem bugs diferentes para alguns valores especiais de "$ var" como =, (ou !.

Acho [ -n "$var" ]mais legível e é o pingente de [ -z "$var" ].

[[ -n $var ]]é o mesmo que [[ $var ]]em todos os shells em que a sintaxe ksh não padrão é implementada.

test "x$var" != x seria o mais confiável se você quiser ser portátil a conchas muito antigas.

Stéphane Chazelas
fonte
1

De acordo com Teste para uma sequência de comprimento diferente de zero no bash: [-n "$ var"] ou ["$ var"] , sim, eles são equivalentes.

Eles são equivalentes, mesmo citando o nome da variável.

Importante notar : o nome da pergunta que cito se refere apenas [, mas a resposta considera ambos [e [[.

nozimica
fonte
1
Mas [[]]não é o equivalente de []:)
dchirikov
Não, eles não são. Mas na resposta que cito, ambas as formas são consideradas.
Nozimica
O comportamento no teste "\ 0" como uma variável é diferente. O operador [] fornece 0 ou 1. E [[]] fornece 1 nos dois casos.
precisa saber é o seguinte
+1 para o link que é muito informativo, mas a resposta de Stephane Chazelas, que eu aceitei, é mais direta.
Iruvar