109 votes

Vérification des variables d'environnement

Je suis en train de vérifier la valeur d'une variable d'environnement et en fonction de la valeur, je fais certaines choses et cela fonctionne bien tant que la variable est définie. Mais quand ce n'est pas le cas, j'obtiens tout un tas d'erreurs (car BASH essaie de comparer la chaîne que je spécifie avec une variable non définie, je suppose).

J'ai essayé d'implémenter une vérification supplémentaire pour éviter que cela ne se produise mais sans succès. 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 non définie\n"
fi

Et voici 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: ligne 5: [: ==: opérateur unaire attendu
./testenv.sh: ligne 9: [: ==: opérateur unaire attendu
baz

Ma question est, est-ce que 'unset TESTVAR' ne devrait pas le rendre nul ? Apparemment ce n'est pas le cas...

212voto

Encadrez la variable entre guillemets doubles.

if [ "$TESTVAR" == "foo" ]

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

if [ "" == "foo" ]

alors que si vous ne la mettez pas entre guillemets, elle se développe en :

if [  == "foo" ]

ce qui est une erreur de syntaxe.

18voto

Dennis Williamson Points 105818

En Bash (et en ksh et zsh), si vous utilisez des doubles crochets, vous n'avez pas besoin de mettre entre guillemets les variables pour les protéger contre le fait qu'elles soient nulles ou non définies.

$ if [ $xyzzy == "x" ]; then echo "True"; else echo "False"; fi
-bash: [: ==: operateur unaire attendu
False
$ if [[ $xyzzy == "x" ]]; then echo "True"; else echo "False"; fi
False

Il y a d'autres avantages.

13voto

msw Points 25319

Regardez la section intitulée "Expansion de paramètre", vous trouverez des choses comme :

${paramètre:-mot}  

Utilisez les valeurs par défaut. Si le paramètre n'est pas défini ou est nul, l'expansion du mot est substituée. Sinon, la valeur du paramètre est substituée.

7voto

intuited Points 7763

Votre test pour vérifier si la valeur est définie

if [ -n $TESTVAR ]

vérifie en fait si la valeur est définie sur quelque chose d'autre qu'une chaîne vide. Observer :

$ unset asdf
$ [ -n $asdf ]; echo $?
0
$ [ -n "" ]; echo $?
1
$ [ -n "asdf" ]; echo $?
0

Rappelez-vous que 0 signifie True.

Si vous n'avez pas besoin de compatibilité avec le shell Bourne d'origine, vous pouvez simplement changer cette première comparaison en

if [[ $TESTVAR ]]

4voto

BillThor Points 3319

Après l'interprétation de la variable manquante TESTVAR, vous évaluez [ == "y" ]. Essayez l'une des options suivantes :

 "$TESTVAR"
 X$TESTVAR == Xy
 ${TESTVAR:-''}

Prograide.com

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.

Powered by:

X