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

Nic*_*ury 155 bash shell

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

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

export DEPLOY_ENV=dev
Run Code Online (Sandbox Code Playgroud)

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

小智 259

[ -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}"
Run Code Online (Sandbox Code Playgroud)

  • @Finesse `始终引用经过测试的字符串。` https://www.tldp.org/LDP/abs/html/comparison-ops.html (14认同)
  • `MyVar="$DEPLOY_ENV:-default_value"` 虽然在 bash 上对我不起作用,所以在可能的情况下用大括号 `${...}` 包围通常更安全。 (5认同)
  • 您可以用`$ DEPLOY_ENV`替换`$ $ {DEPLOY_ENV}'` (3认同)
  • “甚至更短的使用时间”让我开心! (2认同)
  • 这有效并且可能在边缘情况下有价值,但它是一个重新发明的轮子......相反,请参阅参数“扩展答案”,它是为这个确切目标而制作的。 (2认同)
  • 如果您使用“set -euo pipelinefail”,则会出错。在 `-z` 测试 `MyVar=${DEPLOY_ENV:-}` 之前,您需要先使用默认值的 @Eugene 方法 (2认同)

Eug*_*ash 74

你可以使用参数扩展:

$ {参数:-word}

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

试试这个:

var=${DEPLOY_ENV:-default_value}
Run Code Online (Sandbox Code Playgroud)

还有$ {parameter-word}形式,它仅在参数未设置时替换默认值(但不是在它为null时).

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

$ 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' ''
Run Code Online (Sandbox Code Playgroud)


che*_*ner 29

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

foo=${DEPLOY_ENV:-default}
Run Code Online (Sandbox Code Playgroud)

如果您确实关心差异,请放下冒号

foo=${DEPLOY_ENV-default}
Run Code Online (Sandbox Code Playgroud)

您还可以使用-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
Run Code Online (Sandbox Code Playgroud)

  • 切换到 linux 的原因列表获得另一个条目...谢谢@chepner (6认同)
  • 请注意,在-bash 4.2中引入了`-v`选项,许多系统仍在运行旧版本的Bash. (5认同)
  • 甚至`bash` 4.2在这一点上已超过5年了; 我倾向于将任何年龄较大的东西视为特殊情况,值得特别提及. (5认同)
  • @ anon58192932那是因为你使用的是`/ bin/bash`,它只是Mac OS X上的3.2.x版本. (4认同)
  • 时间过得真快! (2认同)

Rob*_*ert 11

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

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

if [ -z "$a" ]
then
    echo "not defined"
else 
    echo "defined"
fi
Run Code Online (Sandbox Code Playgroud)

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

-z一个零长度(即空的)字符串检查.查看man bash并查找CONDITIONAL EXPRESSIONS部分.

您还可以set -u在脚本开头使用它,一旦遇到未定义的变量就会失败,如果您想避免使用未定义的变量以创造性的方式破坏事物.


小智 7

NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi
Run Code Online (Sandbox Code Playgroud)