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

问题描述 投票:0回答:5

我正在写一个shell脚本。在此 shell 脚本中,我有一个变量,它要么采用默认值,要么采用环境变量的值。但是,环境变量不一定存在。

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

export DEPLOY_ENV=dev

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

bash shell
5个回答
871
投票

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

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

202
投票

你可以只使用参数扩展:

${参数:-word}

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

所以试试这个:

var=${DEPLOY_ENV:-default_value}

还有 ${parameter-word} 形式,仅当 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' ''

126
投票

如果你不关心未设置的变量和空值变量之间的区别,你可以使用默认值参数扩展:

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

Mac操作系统

macOS 使用

/bin/bash
版本 3.2.x,因此您可能会在
-v
中遇到以下语法错误:

./bin/uc: line 13: conditional binary operator expected
./bin/uc: line 13: syntax error near `"$DEBUG"'
./bin/uc: line 13: `if [[ -v "$DEBUG" ]]; then'

使用

-n
来代替,你应该会很好。


65
投票

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

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

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

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

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

如果您想避免未定义的变量以创造性的方式破坏事物,您还可以在脚本开头使用

set -u
使其在遇到未定义的变量时失败。


7
投票
NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi
© www.soinside.com 2019 - 2024. All rights reserved.