【问题标题】:check if environment variable is already set [duplicate]检查环境变量是否已经设置[重复]
【发布时间】:2012-07-27 10:41:02
【问题描述】:

我正在编写一个shell脚本,我必须检查是否设置了环境变量,如果没有设置,那么我必须设置它。有什么方法可以检查 shell 脚本,是否已经设置了环境变量?

【问题讨论】:

  • 实际上,这不是该问题的真正重复:此处的 OP 想知道是否设置了变量,如果没有设置,则对其进行处理,而不是退出脚本。 ${V:?} 在这种情况下不是一个有效的答案。 set | grep -q '^V=' 是。这会测试变量是否存在,即使变量设置为空字符串也可以工作。

标签: linux shell unix


【解决方案1】:
[ -z "$VARIABLE" ] && VARIABLE="abc"

if env | grep -q ^VARIABLE=
then
  echo env variable is already exported
else
  echo env variable was not exported, but now it is
  export VARIABLE
fi

我想强调[ -z $VARIABLE ] 是不够的,因为你可以拥有VARIABLE 但它没有被导出。这意味着它根本不是环境变量。

【讨论】:

  • 这能在所有shell环境中工作吗?
  • @Senthilnathan:是的,当然,唯一可以重写以使该 peacof 代码更便携的是grep -q。可以改写为env | grep ^VARIABLE= > /dev/null
  • 如果我导出一个变量,然后将变量设置为其他变量而不导出它,我最终会导致我的非导出变量和我导出的变量不匹配,还是会自动更新导出的变量?也有一个?
  • 请注意,如果您使用set -eu 来帮助您避免错误,在未设置的变量上使用test -z 将终止您的脚本。所以我认为@William Pursell 的回答更好。
  • 这并不可靠。考虑 export foo="$(printf "\nVAR=fake value")" 现在 foo 在环境中并且 grep ^VAR 匹配,但 VAR 不在环境中。
【解决方案2】:

你想做的是bash原生的,叫做参数替换:

VARIABLE="${VARIABLE:=abc}"

如果未设置 VARIABLE,则右侧将等于 abc。请注意,内部运算符 := 可以替换为 :-,它测试 VARIABLE 是否未设置或为空。

【讨论】:

  • 正是我想要的。如果 TEST_DATABASE_NAME 尚未定义,export TEST_DATABASE_NAME="${TEST_DATABASE_NAME:=prodlike}" 行将仅使用 prodlike 作为默认值。没有凌乱的条件块。只需一行代码。
【解决方案3】:

有条件地分配变量(无论是否在环境中)的标准解决方案是:

: ${VAR=foo}

只有在未设置的情况下,才会将 VAR 设置为值“foo”。
如果 VAR 未设置或为空字符串,要将 VAR 设置为“foo”,请使用:

: ${VAR:=foo}

要将 VAR 置于环境中,请执行以下操作:

export VAR

您也可以使用export VAR=${VAR-foo}export VAR=${VAR:=foo},但一些较旧的shell 不支持在同一行中赋值和导出的语法。还有,DRY;在= 运算符的两侧使用名称是不必要的重复。 (导出变量的第二行违反了相同的原则,但感觉更好。)

请注意,通常很难确定变量是否在环境中。解析env 的输出将不起作用。考虑:

export foo='
VAR=var-value'
env | grep VAR

生成子shell并进行测试也不起作用:

sh -c 'echo $VAR'

这将表明在子shell中设置了VAR,这将表明VAR在当前进程的环境中,但可能只是在子shell的初始化中设置了VAR。然而,在功能上,结果与 VAR 在环境中的结果相同。幸运的是,您通常并不关心 VAR 是否在环境中。如果你需要它,把它放在那里。如果你需要它,把它拿出来。

【讨论】:

  • 您能否解释一下: ${VAR:=foo} 符号在内部是如何工作的?我总是认为它是解决方案,但从不认为它实际上是如何工作的。
  • 我在StackOverflow上找到了一些解释!
【解决方案4】:
if [ -z "$VARIABLE" ]; then
    VARIABLE=...
fi

这会检查 $VARIABLE 的长度是否为零。

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2015-07-14
    • 2015-06-23
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    相关资源
    最近更新 更多