47

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

4

4 回答 4

72

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

: ${VAR=foo}

只有当它未设置时,它才会将 VAR 设置为值“foo”。
如果 VAR 未设置或为空字符串,要将 VAR 设置为“foo”,请使用:

: ${VAR:=foo}

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

export VAR

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

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

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

生成子shell和测试也不起作用:

sh -c 'echo $VAR'

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

于 2012-07-27T11:31:51.043 回答
34
[ -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但它没有被导出。这意味着它根本不是环境变量。

于 2012-07-27T10:48:46.363 回答
31

您想要做的是 bash 中的原生操作,这称为参数替换:

VARIABLE="${VARIABLE:=abc}"

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

于 2012-07-27T11:23:18.420 回答
10
if [ -z "$VARIABLE" ]; then
    VARIABLE=...
fi

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

于 2012-07-27T10:42:35.457 回答