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_string
apparaisse et l'insère $VAR
.
Y a-t-il une différence fonctionnelle entre [ -z "$VAR" ]
et [ "$VAR" = "" ]
?
shell-script
Minix
la source
la source
==
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=
.==
quelque part. Mon erreur.Réponses:
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" = "" ]
ifVAR
est un test valide (par exemple, siVAR
est-z
), en particulier lorsque[
(outest
) n'est pas un shell intégré. Mais lebash
ouzsh
la[
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.la source
[ "$VAR" = "" ]
c'était faux parce que si le contenu de$VAR
devait commencer par un trait d'union, cela conduirait à une erreur de syntaxe, par exemple si$VAR
contient-z
alors 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$VAR
depuis des décennies, peut-être inutilement!test
n'y a pas de fonction intégrée.[[
dans bash? Ils sont vraiment différents. --- Je n'observe aucun comportement particulier concernant l'expansion variable avec letest
build-in de bash.zsh
[ "$VAR" = "" ]
qui est plus sûr à utiliser à la-z
place.