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

How to check if an environment variable exists and get its value?

本问题已经有最佳答案,请猛点这里访问。

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

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

1
export DEPLOY_ENV=dev

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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}"


您可以只使用参数扩展:

${parameter:-word}

If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

所以试试这个:

1
var=${DEPLOY_ENV:-default_value}

还有$参数字形式,它仅在参数未设置时(但在参数为空时不替换)替换默认值。

为了证明两者之间的区别:

1
2
3
4
5
6
$ 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' ''


如果不关心未设置变量或空值变量之间的差异,可以使用默认值参数扩展:

1
foo=${DEPLOY_ENV:-default}

如果你真的关心这个区别,就把结肠放下来。

1
foo=${DEPLOY_ENV-default}

还可以使用-v运算符显式测试是否设置了参数。

1
2
3
4
5
6
7
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


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

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

1
2
3
4
5
6
if [ -z"$a" ]
then
    echo"not defined"
else
    echo"defined"
fi

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

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

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


1
2
3
4
5
6
NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi

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

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