Shell script: как проверить, существует ли переменная среды и получить ее значение?
Я пишу оболочку script. В этой оболочке script у меня есть переменная, которая либо принимает значение по умолчанию, либо значение переменной среды. Однако переменная окружения не должна присутствовать.
Например, предположим, что перед запуском script я выполняю следующую операцию:
export DEPLOY_ENV=dev
Как сообщить script выполнить поиск этой переменной среды и сохранить ее значение в переменной внутри script. Более того, как сообщить script, что если эта переменная среды не существует, сохраните переменную по умолчанию?
Ответы
Ответ 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>"