Подтвердить что ты не робот

Shell script: как проверить, существует ли переменная среды и получить ее значение?

Я пишу оболочку script. В этой оболочке script у меня есть переменная, которая либо принимает значение по умолчанию, либо значение переменной среды. Однако переменная окружения не должна присутствовать.

Например, предположим, что перед запуском script я выполняю следующую операцию:

export DEPLOY_ENV=dev

Как сообщить script выполнить поиск этой переменной среды и сохранить ее значение в переменной внутри script. Более того, как сообщить script, что если эта переменная среды не существует, сохраните переменную по умолчанию?

4b9b3361

Ответ 1

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}"

Ответ 2

Вы можете просто использовать расширение параметра:

${параметр: -слово}

Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.

Итак, попробуйте следующее:

var=${DEPLOY_ENV:-default_value}

Также существует форма ${parameter-word}, ​​которая заменяет значение по умолчанию только тогда, когда параметр не установлен (но не когда он равен null).

Чтобы продемонстрировать разницу между ними:

$ 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' ''

Ответ 3

Если вам не нужна разница между переменной unset или переменной с пустым значением, вы можете использовать расширение параметра по умолчанию:

foo=${DEPLOY_ENV:-default}

Если вы позаботились о различии, оставьте двоеточие

foo=${DEPLOY_ENV-default}

Вы также можете использовать оператор -v, чтобы явно проверить, установлен ли параметр.

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

Ответ 4

Нет никакой разницы между переменными среды и переменными в script. Переменные среды только что определены ранее, вне script, до вызова script. С точки зрения script переменная является переменной.

Вы можете проверить, определена ли переменная:

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

а затем установите значение по умолчанию для переменных undefined или сделайте что-то еще.

-z проверяет строку с нулевой длиной (то есть пустую). См. man bash и найдите раздел УСЛОВНЫЕ ЭКСПРЕССИИ.

Вы также можете использовать set -u в начале вашего script, чтобы он сработал после того, как он встречает переменную undefined, если вы хотите избежать изменения переменной undefined творческими способами.

Ответ 5

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

Ответ 6

Все ответы работали. Тем не менее, мне пришлось добавить переменные, которые мне нужны, чтобы добраться до файлов sudoers следующим образом:

sudo visudo
Defaults env_keep += "<var1>, <var2>, ..., <varn>"