Différence entre [[$ variable]] et [[-n $ variable]]?

8

En bash, sont [[ $variable ]]et [[ -n $variable ]]complètement équivalents? Cela semble être le cas à en juger par la sortie ci-dessous, mais je vois les deux formes d'utilisation répandues dans les scripts 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
la source
Hm. Intéressant. Sorties [[ -n $(echo -ne "\0") ]]; echo $?et [ -n $(echo -ne "\0") ]; echo $?diffèrent
dchirikov
@dchirikov, c'est parce que dans le second, vous avez oublié de citer la substitution de commande, donc elle a fini par être [ -n ]la même [ -n -n ]. Dans les shells autres que zsh, les arguments de commande (même intégrés) ou les variables de shell ne peuvent pas contenir de caractères NUL.
Stéphane Chazelas

Réponses:

4

[ "$var" ]équivaut à [ -n "$var" ]bash et à la plupart des shells de nos jours. Dans d'autres shells plus anciens, ils sont censés être équivalents, mais souffrent de bogues différents pour certaines valeurs spéciales de "$ var" comme =, (ou !.

Je trouve [ -n "$var" ]plus lisible et c'est le pendentif de [ -z "$var" ].

[[ -n $var ]]est le même que [[ $var ]]dans tous les shells où cette syntaxe ksh non standard est implémentée.

test "x$var" != x serait le plus fiable si vous voulez être portable sur de très vieilles coquilles.

Stéphane Chazelas
la source
1

Selon Test pour une chaîne de longueur non nulle dans bash: [-n “$ var”] ou [“$ var”] , oui, ils sont équivalents.

Ils sont équivalents même en citant le nom de la variable.

Important à noter : le nom de la question que je cite ne fait référence qu'à [, mais la réponse tient compte des deux [et [[.

nozimica
la source
1
Mais ce [[]]n'est pas l'équivalent de []:)
dchirikov
Non, ils ne le sont pas. Mais dans la réponse que je cite, les deux formes sont considérées.
nozimica
Le comportement lors du test de "\ 0" en tant que variable est différent. L'opérateur [] donne 0 ou 1. Et [[]] donne 1 dans les deux cas.
dchirikov
+1 pour le lien qui est très informatif mais la réponse de Stéphane Chazelas, que j'ai acceptée, est plus pertinente.
iruvar