174 votes

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

J'écris un shell script. Dans ce shell script, j'ai une variable qui prend soit une valeur par défaut, soit la valeur d'une variable d'environnement. Cependant, la variable d'environnement n'a pas besoin d'ê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 dire au script que si cette variable d'environnement n'existe pas, stocker une variable par défaut ?

285voto

endurogizer Points 1466

[ -z "${DEPLOY_ENV}" ] vérifie si DEPLOY_ENV a une longueur égale à zéro. Donc tu pourrais 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}"

79voto

eugene y Points 37378

Vous pourriez simplement utiliser expansion des paramètres :

${paramètre:-mot}

Si paramètre n'est pas défini ou est nul, l'expansion de mot est substitué. Sinon, la valeur de paramètre est substitué.

Alors, essayez ceci :

var=${DEPLOY_ENV:-default_value}

Il y a aussi le ${parameter-word} qui ne substitue la valeur par défaut que dans les cas suivants paramètre n'est pas défini (mais pas s'il 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' ''

35voto

chepner Points 54078

Si vous ne vous souciez pas de la différence entre une variable non définie ou une variable avec une valeur vide, vous pouvez utiliser l'expansion du paramètre valeur par défaut :

foo=${DEPLOY_ENV:-default}

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

foo=${DEPLOY_ENV-default}

Vous pouvez également utiliser le -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

13voto

Robert Points 230

Il n'y a pas de différence entre les variables d'environnement et les variables d'un script. Les variables d'environnement sont juste définies plus tôt, 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

et ensuite définir une valeur par défaut pour les variables non définies ou faire autre chose.

Le site -z vérifie la présence d'une chaîne de longueur nulle (c'est-à-dire vide). Voir man bash et recherchez la section EXPRESSIONS CONDITIONNELLES.

Vous pouvez également utiliser set -u au début de votre script pour le faire échouer dès qu'il rencontre une variable indéfinie, si vous voulez éviter qu'une variable indéfinie ne casse les choses de manière créative.

2voto

NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi

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