Vérification des variables d'environnement
J'essaie de vérifier la valeur d'une variable d'environnement et en fonction de la valeur faire certaines choses et cela fonctionne bien tant que la variable est définie. Quand ce n'est pas le cas, je reçois tout un tas d'erreurs (car BASH essaie de comparer la chaîne que je spécifie avec une variable indéfinie, je suppose)
J'ai essayé d'implémenter une vérification supplémentaire pour éviter que cela ne se produise mais pas de chance. Le bloc de code que j'utilise est:
#!/bin/bash
if [ -n $TESTVAR ]
then
if [ $TESTVAR == "x" ]
then
echo "foo"
exit
elif [ $TESTVAR == "y" ]
then
echo "bar"
exit
else
echo "baz"
exit
fi
else
echo -e "TESTVAR not setn"
fi
Et c'est la sortie:
$ export TESTVAR=x
$ ./testenv.sh
foo
$ export TESTVAR=y
$ ./testenv.sh
bar
$ export TESTVAR=q
$ ./testenv.sh
baz
$ unset TESTVAR
$ ./testenv.sh
./testenv.sh: line 5: [: ==: unary operator expected
./testenv.sh: line 9: [: ==: unary operator expected
baz
Ma question Est, "unset TESTVAR" ne devrait-il pas l'annuler? Il ne semble pas être le cas...
5 réponses
Regardez la section intitulée "Expansion des paramètres", vous trouverez des choses comme:
${paramètre:-mot}
Utiliser Les Valeurs Par Défaut. Si le paramètre est unset ou null, le expan‐ sion de la parole est substitué. Sinon, la valeur de paramètre est substitué.
Votre test pour voir si la valeur est définie
if [ -n $TESTVAR ]
En fait, il suffit de tester pour voir si la valeur est définie sur autre chose qu'une chaîne vide . Observer:
$ unset asdf
$ [ -n $asdf ]; echo $?
0
$ [ -n "" ]; echo $?
1
$ [ -n "asdf" ]; echo $?
0
Rappelez-vous que 0
signifie Vrai.
Si vous n'avez pas besoin de compatibilité avec le shell Bourne d'origine, vous pouvez simplement changer cette comparaison initiale en
if [[ $TESTVAR ]]
Dans Bash (et ksh et zsh), si vous utilisez des crochets doubles, vous n'avez pas besoin de citer des variables pour vous protéger contre qu'elles soient nulles ou non définies.
$ if [ $xyzzy == "x" ]; then echo "True"; else echo "False"; fi
-bash: [: ==: unary operator expected
False
$ if [[ $xyzzy == "x" ]]; then echo "True"; else echo "False"; fi
False
Il y a d'autres avantages .
Après l'interprétation du testVar manquant, vous évaluez [=="y"]. Essayez l'un des éléments suivants:
- " $ TESTVAR "
- x $ TESTVAR = = Xy
- ${TESTVAR: -"}