web-dev-qa-db-fra.com

En Bash, sont si [-z "1 $"] et si ["1 $" = ""] la même chose?

Dans Script Shell Bash, quelle est la différence (le cas échéant) entre les deux déclarations suivantes?

1.) if [ -z "$1" ]
[.____] 2.) if [ "$1" = "" ]

Je me suis retrouvé écrire le second dans certains scripts, mais j'ai lu ici qui utilise -z Atteint la même chose.

S'il y a des problèmes en utilisant le second, devrions-nous ignorer que le premier a l'air un peu mieux?

29
Johan

[ "$1" = "" ] et [ -z "$1" ] sont exactement équivalents dans BASH et d'autres coquilles compatibles POSIX. (Notez qu'il doit y avoir un espace de chaque côté des supports, sauf s'il existe un caractère constitutif de mots comme ;.)

[ est une coquille intégrée comme tout autre; En fait, il peut également être orthographié test (la seule différence entre les deux est que [ nécessite ] comme dernier argument). Donc, si vous courez [ "$1" = "" ] avec $1 expansion à -z, l'opérateur de test voit trois arguments: -z, = et la chaîne vide. Certaines personnes âgées Bourne coquilles ont parfois jeté des erreurs d'analyse lorsqu'un opérande ressemblait à un opérateur de cette manière, même s'il n'y avait pas d'ambiguïté dans l'expression complète. Je ne sais pas si une version a fait des problèmes avec cette expression particulière, mais des expressions plus complexes pourraient les jeter. Il peut également y avoir des versions qui avaient des problèmes avec des mots vides; Ceux-ci n'auraient pas soutenu [ -z "$1" ] Soit. Une coque commune idiome est [ x"$1" = x"" ]. Il évite tout risque d'avoir des opérandes analysées comme opérateurs car aucun opérateur ne commence avec une lettre.

En ksh, bash et zsh, vous pouvez utiliser la syntaxe de double support, [[ -z $1 ]]. Cette nouvelle syntaxe (à partir de la fin des années 1980 plutôt que le milieu des années 1970) élimine le risque d'avoir des opérandes analysées en tant qu'opérateurs en utilisant une construction syntaxique spéciale plutôt qu'un intégré ordinaire. Les opérateurs doivent apparaître littéralement, non notés dans les deux crochets, et vous n'avez pas besoin de doubler les expansions variables citation.