如何检查环境变量是否存在并获取其值?

时间:2016-09-02 15:55:14

标签: bash shell

我正在编写一个shell脚本。在这个shell脚本中,我有一个变量,它接受默认值或环境变量的值。但是,环境变量不一定存在。

例如,假设在运行脚本之前,我执行以下操作:

export DEPLOY_ENV=dev

如何告诉脚本搜索此环境变量,并将其值存储在脚本内的变量中。此外,如何告诉脚本如果此环境变量不存在,请存储默认变量?

6 个答案:

答案 0 :(得分:201)

[ -z "${DEPLOY_ENV}" ]检查DEPLOY_ENV的长度是否等于零。所以你可以运行:

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

答案 1 :(得分:61)

您可以使用parameter expansion

  

$ {参数:-word}

     

如果参数未设置或为null,则替换 word 的扩展。否则,参数的值将被替换。

所以试试这个:

var=${DEPLOY_ENV:-default_value}

还有 $ {parameter-word} 表单,只有当参数未设置时才会替换默认值(但不是在它为空时)。

要证明两者之间的区别:

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

答案 2 :(得分:22)

如果您不关心未设置变量或具有空值的变量之间的差异,您可以使用default-value参数扩展:

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

答案 3 :(得分:7)

脚本中的环境变量和变量之间没有区别。在调用脚本之前,环境变量刚刚在脚本之外定义。从脚本的角度来看,变量是一个变量。

您可以检查是否定义了变量:

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

然后为未定义的变量设置默认值或执行其他操作。

-z检查零长度(即空)字符串。请参阅man bash并查找“条件表达式”部分。

如果您希望避免让未定义的变量以创造性的方式破坏事物,您还可以在脚本开头使用set -u,以便在遇到未定义的变量时使其失败。

答案 4 :(得分:1)

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

答案 5 :(得分:-1)

所有答案都有效。但是,我必须添加我需要的变量到sudoers文件,如下所示:

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