web-dev-qa-db-fra.com

Comment vérifier si une variable d'environnement existe et obtenir sa valeur?

J'écris un script shell. Dans ce script Shell, j'ai une variable qui prend une valeur par défaut ou la valeur d'une variable d'environnement. Cependant, la variable d'environnement ne doit pas nécessairement être présente.

Par exemple, supposons qu'avant d'exécuter le script, j'effectue l'opération suivante:

export DEPLOY_ENV=dev

Comment puis-je dire au script de rechercher cette variable d'environnement et de stocker sa valeur dans une variable à l'intérieur du script. De plus, comment puis-je dire au script que si cette variable d'environnement n'existe pas, enregistre une variable par défaut?

129
Nicolas El Khoury

[ -z "${DEPLOY_ENV}" ] vérifie si DEPLOY_ENV a une longueur égale à zéro. Pour que vous puissiez courir:

if [[ -z "${DEPLOY_ENV}" ]]; then
  MY_SCRIPT_VARIABLE="Some default value because DEPLOY_ENV is undefined"
else
  MY_SCRIPT_VARIABLE="${DEPLOY_ENV}"
fi

# or using a short-hand version

[[ -z "${DEPLOY_ENV}" ]] && MyVar='default' || MyVar="${DEPLOY_ENV}"

# or even shorter use

MyVar="${DEPLOY_ENV:-default_value}"
230
endurogizer

Vous pouvez simplement utiliser expansion des paramètres :

$ {paramètre: -Word}

Si le paramètre est non défini ou nul, le développement de mot est substitué. Sinon, la valeur du paramètre est remplacée.

Alors essayez ceci:

var=${DEPLOY_ENV:-default_value}

Il y a aussi le formulaire $ {paramètre-Word} , qui substitue la valeur par défaut uniquement lorsque paramètre n'est pas défini (mais pas quand c'est nul).

Pour démontrer la différence entre les deux:

$ unset DEPLOY_ENV
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'"
'default_value' 'default_value'
$ DEPLOY_ENV=
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'"
'default_value' ''
62
Eugene Yarmash

Si vous ne vous souciez pas de la différence entre une variable non définie et une variable avec une valeur vide, vous pouvez utiliser le paramètre de développement de la valeur par défaut:

foo=${DEPLOY_ENV:-default}

Si vous faites vous souciez de la différence, laissez tomber les deux points

foo=${DEPLOY_ENV-default}

Vous pouvez également utiliser l'opérateur -v pour tester explicitement si un paramètre est défini.

if [[ ! -v DEPLOY_ENV ]]; then
    echo "DEPLOY_ENV is not set"
Elif [[ -z "$DEPLOY_ENV" ]]; then
    echo "DEPLOY_ENV is set to the empty string"
else
    echo "DEPLOY_ENV has the value: $DEPLOY_ENV"
fi
25
chepner

Il n'y a pas de différence entre les variables d'environnement et les variables dans un script. Les variables d'environnement sont simplement définies précédemment, en dehors du script, avant que le script ne soit appelé. Du point de vue du script, une variable est une variable.

Vous pouvez vérifier si une variable est définie:

if [ -z "$a" ]
then
    echo "not defined"
else 
    echo "defined"
fi

puis définissez une valeur par défaut pour les variables non définies ou effectuez autre chose.

Le -z recherche une chaîne de longueur nulle (c'est-à-dire vide). Voir man bash et cherchez la section EXPRESSIONS CONDITIONNELLES.

Vous pouvez également utiliser set -u au début de votre script pour qu'il échoue une fois qu'il rencontre une variable non définie, si vous souhaitez éviter qu'une variable non définie ne casse les choses de manière créative.

7
Robert
NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi
1
Preethi Srinivasan