Dans les scripts shell Bash, quelle est la différence (le cas échéant) entre les deux instructions suivantes?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
Je me suis retrouvé à écrire le second dans certains scripts, mais j'ai lu ici qu'utiliser -z
permet la même chose.
S'il y a des problèmes avec le second, faut-il ignorer que le premier est un peu meilleur?
bash
shell-script
Johan
la source
la source
Réponses:
[ "$1" = "" ]
et[ -z "$1" ]
sont exactement équivalents en bash et autres shells compatibles POSIX. (Notez qu'il doit y avoir un espace de chaque côté des crochets, sauf s'il y a un caractère non constitutif comme;
.)[
est un shell intégré comme les autres; en fait, il peut également être orthographiétest
(la seule différence entre les deux est qu'il[
requiert un]
comme dernier argument). Donc , si vous exécutez[ "$1" = "" ]
avec l'$1
expansion à-z
l'opérateur de test voit trois arguments:-z
,=
et la chaîne vide. Certains obus Bourne plus anciens lançaient parfois des erreurs d'analyse lorsqu'un opérande ressemblait à un opérateur de cette manière, même s'il n'y avait aucune ambiguïté dans l'expression complète. Je ne sais pas si une version a effectivement eu des problèmes avec cette expression particulière, mais des expressions plus complexes pourraient les éliminer. Il peut également y avoir eu des versions qui ont eu des problèmes avec des mots vides; ceux-ci n'auraient pas soutenu[ -z "$1" ]
non plus. Un idiome de shell commun est[ x"$1" = x"" ]
. Cela évite tout risque de voir les opérandes analysés comme des opérateurs car aucun opérateur ne commence par une lettre.Dans ksh, bash et zsh, vous pouvez utiliser la syntaxe double bracket,
[[ -z $1 ]]
. Cette syntaxe plus récente (datant de la fin des années 1980 plutôt que du milieu des années 1970) élimine le risque de faire analyser les opérandes en tant qu'opérateurs en utilisant une construction syntaxique spéciale plutôt qu'une construction intégrée ordinaire. Les opérateurs doivent apparaître littéralement, sans guillemets entre crochets, et vous n'avez pas besoin de doubler les extensions de variable.la source