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

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.


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 [[.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.