Si je veux vérifier la chaîne null je ferais
mais que se passe-t-il si je veux vérifier si la variable a été définie à tous ? Ou n’y a-t-il aucune distinction dans bash scripting ?
Si je veux vérifier la chaîne null je ferais
mais que se passe-t-il si je veux vérifier si la variable a été définie à tous ? Ou n’y a-t-il aucune distinction dans bash scripting ?
Je pense que la réponse que vous êtes après est implicite (si non précisé) par Vinko réponse, même si elle n'est pas précisée, tout simplement. De distinguer si la variable existe, mais vide ou pas, vous pouvez utiliser:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Probablement, vous pouvez combiner les deux tests sur la deuxième ligne en un avec:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Cependant, si vous lisez la documentation pour Autoconf, vous verrez que ils ne recommandons pas les combinant des termes avec '-a
"et ne vous recommandons d'utiliser des tests simples et combinés avec d' &&
. Je n'ai jamais rencontré un système où il y a un problème; cela ne veut pas dire qu'ils n'ont pas l'habitude d'exister (mais ils sont probablement très rares de nos jours, même si elles n'étaient pas aussi rares dans le passé lointain).
J'ai récemment été invité par e-mail à propos de cette réponse à la question suivante:
Vous utilisez deux tests, et je comprends le second mais pas le premier. Plus précisément, je ne comprends pas la nécessité de l'expansion des variables
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
Ne serait-ce pas faire la même?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Juste question - la réponse est "Non, votre alternative plus simple de ne pas faire la même chose".
Supposons que j'écris avant votre test:
VAR=
Votre test va dire "VAR n'est pas définie", mais la mienne va dire (par voie de conséquence, car elle fait écho à rien) "VAR est ensemble, mais sa valeur peut être vide". Essayer ce script:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
La sortie est:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
Dans la deuxième paire de tests, la variable est définie, mais il est mis à la valeur vide. C'est la distinction que l' ${VAR=value}
et ${VAR:=value}
de notations faire. Idem pour ${VAR-value}
et ${VAR:-value}
, et ${VAR+value}
et ${VAR:+value}
, et ainsi de suite.
Comme Gili souligne dans sa réponse, si vous exécutez bash
avec l' set -o nounset
option, puis la base de la réponse ci-dessus échoue avec l' unbound variable
. Il est facile de remédier:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Ou vous pouvez annuler l' set -o nounset
option avec set +u
(set -u
équivalent à set -o nounset
).
~> if [ -z $FOO ]; then echo "EMPTY"; fi
EMPTY
~> FOO=""
~> if [ -z $FOO ]; then echo "EMPTY"; fi
EMPTY
~> FOO="a"
~> if [ -z $FOO ]; then echo "EMPTY"; fi
~>
-z fonctionne pour des variables non définies. Pour distinguer entre indéfini et défini, vous devez utiliser les choses énumérées ici ou, avec des explications plus claires, ici.
Façon la plus propre est l'aide de l'expansion, comme dans ces exemples. Pour obtenir toutes vos options, vérifiez le Paramètre d'Expansion section du manuel.
Autre mot:
~$ unset FOO
~$ if test ${FOO+defined}; then echo "DEFINED"; fi
~$ FOO=""
~$ if test ${FOO+defined}; then echo "DEFINED"; fi
DEFINED
Valeur par défaut:
~$ FOO=""
~$ if test "${FOO-default value}" ; then echo "UNDEFINED"; fi
~$ unset FOO
~$ if test "${FOO-default value}" ; then echo "UNDEFINED"; fi
UNDEFINED
Bien sûr, vous pouvez utiliser l'un de ces différemment, en mettant la valeur que vous voulez, au lieu de 'valeur par défaut' et à l'aide de l'extension directement, le cas échéant.
Advanced bash scripting guide, 10.2. Paramètre De Substitution:
à la base de la logique du programme que la variable $mystr est définie ou non, vous pouvez effectuer les opérations suivantes:
isdefined=0
${mystr+ export isdefined=1}
maintenant, si isdefined=0 alors la variable non définie, si isdefined=1 la variable a été définie
Cette façon de vérifier variables est mieux que la réponse ci-dessus parce que c'est plus élégant, plus lisible, et si votre shell bash a été configuré à l'erreur sur l'utilisation de variables non définies (set -u)
, le script sera terminé prématurément.
Autres choses utiles:
la valeur par défaut de 7 assignée à $mystr si c'était pas défini, et de le laisser intact le contraire:
mystr=${mystr- 7}
pour imprimer un message d'erreur et la sortie de la fonction si la variable n'est pas définie:
: ${mystr? not defined}
Méfiez-vous ici que j'ai utilisé": "afin de ne pas avoir le contenu de $mystr exécuté comme une commande dans le cas où il est défini.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.