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.