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...

47
demandé sur Dave Newton 2010-06-06 00:02:10

5 réponses

Placez la variable entre guillemets doubles.

if [ "$TESTVAR" = "foo" ]

Si vous faites cela et que la variable est vide, le test se développe à:

if [ "" = "foo" ]

Alors que si vous ne le citez pas, il s'étend à:

if [  = "foo" ]

Qui est une erreur de syntaxe.

98
répondu 2010-06-05 20:04:41

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é.

7
répondu msw 2010-06-05 20:06:14

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 ]]
5
répondu intuited 2010-06-08 00:28:44

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 .

4
répondu Dennis Williamson 2010-06-05 20:49:48

Après l'interprétation du testVar manquant, vous évaluez [=="y"]. Essayez l'un des éléments suivants:

  • " $ TESTVAR "
  • x $ TESTVAR = = Xy
  • ${TESTVAR: -"}
2
répondu BillThor 2010-06-05 20:06:57