Dans Bash, est-ce que si [-z “$ 1”] et si [“$ 1” = “”] sont les mêmes?


28

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 -zpermet la même chose.

S'il y a des problèmes avec le second, faut-il ignorer que le premier est un peu meilleur?


3
Pour une comparaison détaillée, voir ma réponse sur Stack Overflow. Voir aussi ceci et cela .
pause jusqu'à nouvel ordre.

de bons liens, avec quelques bonnes réponses :)
Johan

Réponses:


36

[ "$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' $1expansion à -zl'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.


Correction de la faute de frappe avec l'espace manquant à côté du support.
Johan
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.