检查环境variables是否已经设置

我正在写一个shell脚本,我必须检查是否设置了环境variables,如果没有设置,那么我必须设置它。 有没有办法检查shell脚本,是否已经设置了环境variables?

 [ -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但是它不被导出。 这意味着它根本不是一个环境变量。

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

 : ${VAR=foo} 

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

 : ${VAR:=foo} 

要把VAR放在环境中,请跟进:

 export VAR 

您也可以export VAR=${VAR-foo}export VAR=${VAR:=foo} ,但是一些旧的shell不支持在同一行中分配和导出的语法。 另外, DRY ; 使用=运算符两侧的名称是不必要的重复。 (导出变量的第二行违反了同一个委托人,但感觉更好。)

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

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

它也不会产生一个subshel​​l和测试:

 sh -c 'echo $VAR' 

这表明VAR在子shell中被设置,这将是VAR在当前进程的环境中的指示符,但是可能简单地是在子shell的初始化中设置VAR。 然而从功能上来说,其结果与VAR在环境中相同。 幸运的是,如果VAR在环境中,您通常不关心。 如果你需要的话,把它放在那里。 如果你需要它,拿出来。

你想要做的是在bash中原生的,它被称为参数替换:

 VARIABLE="${VARIABLE:=abc}" 

如果VARIABLE没有设置,右侧将等于abc。 请注意,内部操作符:=可以替换为: – 测试是否VARIABLE未设置或为空。

 if [ -z "$VARIABLE" ]; then VARIABLE=... fi 

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