web-dev-qa-db-fra.com

vérifier si la variable d'environnement est déjà définie

J'écris un script Shell, où je dois vérifier si la variable d'environnement est définie, sinon définie, je dois la définir. Existe-t-il un moyen de vérifier dans le script Shell, si une variable d'environnement est déjà définie ou non?

36
Mojoy
[ -z "$VARIABLE" ] && VARIABLE="abc"

if env | grep -q ^VARIABLE=
then
  echo env variable is already exported
else
  echo env variable was not exported, but now it is
  export VARIABLE
fi

Je tiens à souligner que [ -z $VARIABLE ] ne suffit pas, car vous pouvez avoir VARIABLE mais il n'a pas été exporté. Cela signifie que ce n'est pas du tout une variable d'environnement.

28
Igor Chubin

La solution standard pour affecter conditionnellement une variable (que ce soit dans l'environnement ou non) est:

: ${VAR=foo}

Cela mettra VAR à la valeur "foo" uniquement s'il n'est pas défini.
Pour définir VAR sur "foo" si VAR n'est pas défini ou la chaîne vide, utilisez:

: ${VAR:=foo}

Pour mettre VAR dans l'environnement, suivez avec:

export VAR

Vous pouvez également faire export VAR=${VAR-foo} ou export VAR=${VAR:=foo}, mais certains shells plus anciens ne prennent pas en charge la syntaxe d'affectation et d'exportation sur la même ligne. SEC ; en utilisant le nom des deux côtés du = L'opérateur est une répétition inutile. (Une deuxième ligne exportant la variable viole le même principe, mais se sent mieux.)

Notez qu'il est très difficile en général de déterminer si une variable se trouve dans l'environnement. L'analyse de la sortie de env ne fonctionnera pas. Considérer:

export foo='
VAR=var-value'
env | grep VAR

Cela ne fonctionne pas non plus pour générer un sous-shell et tester:

sh -c 'echo $VAR'

Cela indiquerait que le VAR est défini dans le sous-shell, ce qui serait un indicateur que le VAR est dans l'environnement du processus actuel, mais il se peut simplement que le VAR soit défini lors de l'initialisation du sous-shell. Fonctionnellement, cependant, le résultat est le même que si VAR se trouve dans l'environnement. Heureusement, vous ne vous souciez généralement pas si VAR est dans l'environnement ou non. Si vous en avez besoin là-bas, mettez-le là. Si vous en avez besoin, sortez-le.

55
William Pursell

Ce que vous voulez faire est natif en bash, cela s'appelle la substitution de paramètres:

VARIABLE="${VARIABLE:=abc}"

Si VARIABLE n'est pas défini, le côté droit sera égal à abc. Notez que l'opérateur interne := peut être remplacé par :- qui teste si VARIABLE n'est pas défini ou vide.

16
Bentoy13
if [ -z "$VARIABLE" ]; then
    VARIABLE=...
fi

Ceci vérifie si la longueur de $ VARIABLE est nulle.

9
unutbu