Certains shells historiques ont implémenté un analyseur très simple qui pourrait être confondu par des choses comme [ -n = "" ]
où le premier opérande =
ressemble à un opérateur, et analyserait cela comme [ -n = ]
ou provoquerait une erreur de syntaxe. Dans [ "x$1" = x"" ]
, le x
préfixe garantit que x"$1"
cela ne peut pas ressembler à un opérateur, et donc la seule façon dont le shell peut analyser ce test est de le traiter =
comme un opérateur binaire.
Tous les shells modernes, et même la plupart des shells plus anciens encore en fonctionnement, suivent les règles POSIX qui exigent que toutes les expressions de test jusqu'à 4 mots soient analysées correctement. Il en [ -z "$1" ]
va de même pour tester correctement si $1
est vide et [ "$x" = "$y" ]
pour tester l'égalité de deux variables.
Même certains shells actuels peuvent être confondus avec des expressions plus longues, et quelques expressions sont en fait ambiguës, évitez donc d'utiliser les opérateurs -a
et -o
pour construire des tests booléens plus longs, et utilisez plutôt des appels distincts à [
et les opérateurs booléens &&
et propres du shell ||
.
Gilles 'SO- arrête d'être méchant'
la source
sh
sur certains Unices commerciaux ont toujours ce problème. Voir ici pour plus de détails.[ -z "$1" ]
est un moyen approprié de tester si$1
est vide .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- les deux renvoient 0, mais dans le second cas$1
ne peuvent pas être vides car il n'existe pas.Selon http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html , le
-z
test n'est pas sûr dans certaines implémentations , probablement lorsque des chaînes "intéressantes" comme"-o a=a"
sont testées.la source
Les tests ci-dessus provoqueront également une erreur si vous exécutez avec "set -u" ou "set -o nounset"
Une façon plus stable de vérifier une variable vide serait d'utiliser l' expansion des paramètres :
MYVAR = $ {MYVAR: - "Mauvaise valeur"}
Cette méthode fonctionne pour le shell bourne traditionnel, ainsi que pour ksh et bash.
la source
la source
=
versus-z
, maintenant comment.