Comment vérifier si une variable d'environnement existe et obtenez sa valeur? [dupliquer]

cette question a déjà une réponse ici:

  • Comment vérifier si une variable est définie dans Bash? 31 réponses

j'écris un script shell. Dans ce script shell, je suis avoir une variable qui prend soit une valeur par défaut ou la valeur d'une variable d'environnement. Cependant, l' variable d'environnement n'a pas à être présent.

par exemple, supposons, avant d'exécuter le script, que j'exécute l'opération suivante:

export DEPLOY_ENV=dev

Comment dire au script de rechercher cette variable d'environnement, et 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?

57
demandé sur codeforester 2016-09-02 18:55:13

6 réponses

[ -z "${DEPLOY_ENV}" ] vérifie si DEPLOY_ENV a une longueur égale à zéro. Pour pouvoir 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}"
118
répondu endurogizer 2018-05-14 17:26:05

vous pouvez simplement utiliser extension du paramètre :

${paramètre: - word}

si paramètre est désactivé ou nul, l'expansion de mot est substitué. Sinon, la valeur de paramètre est remplacée.

alors essayez ceci:

var=${DEPLOY_ENV:-default_value}

Il y a aussi la forme ${paramètre-mot} , qui remplace la valeur par défaut seulement quand paramètre est désactivé (mais pas quand 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' ''
44
répondu Eugene Yarmash 2016-09-02 16:34:53

si vous ne vous souciez pas de la différence entre une variable débranchée ou une variable avec une valeur vide, vous pouvez utiliser l'extension du paramètre valeur par défaut:

foo=${DEPLOY_ENV:-default}

Si vous faire soins à propos de la différence, de supprimer la virgule

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
11
répondu chepner 2016-09-02 16:09:56

il n'y a pas de différence entre les variables d'environnement et les variables dans un script. Les variables d'environnement sont 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 -z contrôle pour un chaîne de longueur zéro (c'est-à-dire vide). Voir man bash et la section expressions conditionnelles.

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

5
répondu Robert 2016-09-02 16:02:23
NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi
1
répondu Preethi Srinivasan 2016-09-02 23:54:44

toutes les réponses ont fonctionné. Cependant, j'ai dû ajouter les variables dont j'avais besoin pour accéder aux fichiers sudoers comme suit:

sudo visudo
Defaults env_keep += "<var1>, <var2>, ..., <varn>"
0
répondu Nicolas El Khoury 2016-09-05 11:38:18