我正在写一个shell脚本。在这个shell脚本中,我有一个接受默认值或环境变量值的变量。然而,环境变量并不一定存在。
例如,在运行脚本之前,我执行了如下操作:
export DEPLOY_ENV=dev
我如何告诉脚本搜索这个环境变量,并将其值存储在脚本中的一个变量中。此外,我如何告诉脚本,如果这个环境变量不存在,存储一个默认变量?
我正在写一个shell脚本。在这个shell脚本中,我有一个接受默认值或环境变量值的变量。然而,环境变量并不一定存在。
例如,在运行脚本之前,我执行了如下操作:
export DEPLOY_ENV=dev
我如何告诉脚本搜索这个环境变量,并将其值存储在脚本中的一个变量中。此外,我如何告诉脚本,如果这个环境变量不存在,存储一个默认变量?
你可以使用参数展开:
${参数:词} 如果parameter未设置或为空,则替换word的展开。否则,参数的值将被替换。
所以试试这个:
var=${DEPLOY_ENV:-default_value}
还有${parameter-word}形式,它只在parameter未设置时替换默认值(但在parameter为空时不替换)。
为了说明两者之间的区别:
$ 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' ''
环境变量和脚本中的变量没有区别。环境变量只是在调用脚本之前在脚本外部定义的。从脚本的角度来看,变量就是变量。
你可以检查一个变量是否被定义:
if [ -z "$a" ]
then
echo "not defined"
else
echo "defined"
fi
然后为未定义的变量设置一个默认值或做其他事情。
-z检查长度为零(即空)的字符串。参见man bash和查找条件表达式部分。
你也可以在脚本的开头使用set -u使它在遇到未定义的变量时失败,如果你想避免一个未定义的变量以创造性的方式破坏事情。
[-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}"
如果你不关心一个未设置的变量和一个空值的变量之间的区别,你可以使用默认值参数展开:
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
NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
NEW_VAR=${ENV_VAR}
else
NEW_VAR="new value"
fi