Как проверить существование переменной окружения и получить её значение?
Я пишу скрипт на оболочке и у меня есть переменная, которая может либо принимать значение по умолчанию, либо значение из переменной окружения. Однако переменная окружения не обязательно должна присутствовать.
Например, предположим, что перед запуском скрипта я выполняю следующую команду:
export DEPLOY_ENV=dev
Как мне указать скрипту искать эту переменную окружения и сохранять её значение в переменной внутри скрипта? Более того, как сделать так, чтобы если эта переменная окружения не существует, то скрипт сохранял значение переменной по умолчанию?
4 ответ(ов)
Команда [ -z "${DEPLOY_ENV}" ]
проверяет, имеет ли переменная DEPLOY_ENV
длину, равную нулю. Если вы хотите установить значение переменной в зависимости от этого, можно сделать следующее:
if [[ -z "${DEPLOY_ENV}" ]]; then
MY_SCRIPT_VARIABLE="Некое значение по умолчанию, так как DEPLOY_ENV не определена"
else
MY_SCRIPT_VARIABLE="${DEPLOY_ENV}"
fi
Также можно использовать более компактный вариант:
[[ -z "${DEPLOY_ENV}" ]] && MY_SCRIPT_VARIABLE='значение по умолчанию' || MY_SCRIPT_VARIABLE="${DEPLOY_ENV}"
И даже ещё короче, используя стандартный способ подстановки значения по умолчанию:
MY_SCRIPT_VARIABLE="${DEPLOY_ENV:-значение_по_умолчанию}"
Эти конструкции позволяют элегантно обрабатывать ситуацию, когда переменная не определена, и устанавливать новое значение по умолчанию.
Если вам не важна разница между неустановленной переменной и переменной с пустым значением, вы можете использовать параметрическое расширение со значением по умолчанию:
foo=${DEPLOY_ENV:-default}
Если вы делаете различие, уберите двоеточие:
foo=${DEPLOY_ENV-default}
Также вы можете использовать оператор -v
, чтобы явно проверить, установлена ли переменная:
if [[ ! -v DEPLOY_ENV ]]; then
echo "DEPLOY_ENV не установлена"
elif [[ -z "$DEPLOY_ENV" ]]; then
echo "DEPLOY_ENV установлена в пустую строку"
else
echo "DEPLOY_ENV имеет значение: $DEPLOY_ENV"
fi
Нет никакой разницы между переменными окружения и переменными в скрипте. Переменные окружения просто определены раньше, вне скрипта, до его вызова. С точки зрения скрипта переменная — это просто переменная.
Вы можете проверить, определена ли переменная:
if [ -z "$a" ]
then
echo "не определена"
else
echo "определена"
fi
Таким образом, вы можете установить значение по умолчанию для неопределённых переменных или сделать что-то другое.
Опция -z
проверяет, является ли строка пустой (имеет нулевую длину). См. раздел CONDITIONAL EXPRESSIONS в справке man bash
.
Кроме того, вы можете использовать команду set -u
в начале вашего скрипта, чтобы он завершался с ошибкой, как только встретит неопределённую переменную. Это поможет избежать нежелательных последствий от неопределённых переменных.
Данный код на Bash проверяет, установлена ли переменная ENV_VAR
и не является ли она пустой. Вот пояснение:
- В строке
NEW_VAR=""
мы инициализируем переменнуюNEW_VAR
пустой строкой. - Условие
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]
выполняет две проверки:${ENV_VAR}
: проверяет, что переменнаяENV_VAR
существует и не пустая.${ENV_VAR-x}
: используется для проверки, что переменнаяENV_VAR
не явно не задана. Если она не задана, то возвращаетx
, что делает всю конструкцию истинной, если переменная установлена.
Если обе проверки истинны, в переменную NEW_VAR
присваивается значение ENV_VAR
. В противном случае, NEW_VAR
получает значение "new value".
Таким образом, в результате код присваивает NEW_VAR
либо значение ENV_VAR
, либо строку "new value" в зависимости от наличия и значимости переменной ENV_VAR
.
Как выводить команды оболочки по мере их выполнения
Назначение значений по умолчанию для переменных оболочки одной командой в bash
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)
Расширение переменных внутри одинарных кавычек в команде Bash