[«$ VAR» = «»] et [-z «$ VAR»] sont-ils toujours équivalents?

8

Mon code ressemble à ceci:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

Je veux donc interroger la sortie de command, jusqu'à ce que le important_stringapparaisse et l'insère $VAR.

Y a-t-il une différence fonctionnelle entre [ -z "$VAR" ]et [ "$VAR" = "" ]?

Minix
la source
3
==est une syntaxe incorrecte, mais fonctionne dans de nombreux shells (probablement parce que c'est de la mémoire musculaire pour quiconque utilise d'autres langues). Vous devriez utiliser =.
l0b0
@ l0b0 a copié ==quelque part. Mon erreur.
Minix

Réponses:

5

Oui, ils ( [ -z "$VAR" ]et [ "$VAR" = "" ]...) sont équivalents. Les deux testent le vide de $VAR(par exemple, quand il n'est pas lié ou défini sur une chaîne vide).

Comme l'a commenté Celada , de mauvaises choses peuvent se produire lors de l'utilisation de [ "$VAR" = "" ] if VARest un test valide (par exemple, si VARest -z), en particulier lorsque [(ou test) n'est pas un shell intégré. Mais le bashou zshla [est une commande interne et qui ne semble pas être un problème. Vous pouvez utiliser [ "x$VAR" = "x" ]pour votre test. Voir test (1)

Bien sûr, je suppose un shell POSIX ou quelque chose de similaire.

Peut -z-être peut-être un peu plus rapide (mais vous ne devriez pas vous soucier des microsecondes dans les scripts shell) et vous pourriez =peut-être être plus lisible.

Basile Starynkevitch
la source
5
Je pensais que [ "$VAR" = "" ]c'était faux parce que si le contenu de $VARdevait commencer par un trait d'union, cela conduirait à une erreur de syntaxe, par exemple si $VARcontient -zalors il se développerait [ -z = "" ]- ce test serait =-il vide (ce qui n'est pas le cas) puis traiter ""comme un argument étranger? Mais je n'arrive pas à faire échouer de cette façon maintenant que je l'essaie après avoir lu votre réponse! J'utilise des structures comme [ "x$VAR" = "xfoo" ]pour se prémunir contre les caractères spéciaux $VARdepuis des décennies, peut-être inutilement!
Celada
@Celada: Je pense que votre point est vrai pour les coquilles rares où il testn'y a pas de fonction intégrée.
Basile Starynkevitch
1
Je pense qu'en ce qui concerne les extensions, les shell intégrés devraient se comporter de la même manière que les commandes externes. Ne l'avez-vous pas confondu avec des mots clés comme [[dans bash? Ils sont vraiment différents. --- Je n'observe aucun comportement particulier concernant l'expansion variable avec le testbuild-in de bash.
pabouk
J'ai testé aveczsh
Basile Starynkevitch
@Celada en fait, vous avez raison, il y a tellement de choses qui pourraient mal tourner en utilisant ce [ "$VAR" = "" ]qui est plus sûr à utiliser à la -zplace.
Braiam