我正在编写一个shell脚本,我必须检查是否设置了环境变量,如果没有设置,那么我必须设置它。有什么方法可以检查 shell 脚本,是否已经设置了环境变量?
4 回答
有条件地分配变量(无论是否在环境中)的标准解决方案是:
: ${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 是否在环境中。如果你需要它,把它放在那里。如果你需要它,把它拿出来。
[ -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
但它没有被导出。这意味着它根本不是环境变量。
您想要做的是 bash 中的原生操作,这称为参数替换:
VARIABLE="${VARIABLE:=abc}"
如果未设置 VARIABLE,则右侧将等于 abc。请注意,如果 VARIABLE 未设置或为空,则内部运算符:=
可能会替换为which 测试。:-
if [ -z "$VARIABLE" ]; then
VARIABLE=...
fi
这将检查 $VARIABLE 的长度是否为零。