2012-07-27 45 views
29

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

+0

实际上,这不是这个问题的真正重复:这里的OP想知道是否设置了一个变量,并且如果不是这样做,而不是退出脚本。 $ {V:?}在这种情况下不是有效的答案。 'set | grep -q'^ V =''是。这测试了变量的存在并且即使设置了变量但对空字符串也起作用。 – Coroos 2015-11-14 20:24:53

回答

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

+0

这个工作在所有的shell环境中吗? – Mojoy 2012-07-27 11:00:39

+0

@ Senthilnathan:是的,当然,唯一可以重写的代码就是'grep -q'。人们可以编写'env |而不是使用grep^VARIABLE =>/dev/null。 – 2012-07-27 11:02:20

+0

如果我导出一个变量,然后将该变量设置为别的东西而不导出它,最终我的非导出变量和我的导出变量之间是否不匹配,还是会自动更新导出的变量? – ArtOfWarfare 2015-09-11 11:29:00

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

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

13

你想要做的是在bash本地,它被称为参数替换:

VARIABLE="${VARIABLE:=abc}" 

如果没有设置变量,右边将等于ABC。请注意,内部操作符:=可能替换为: - 测试VARIABLE是否未设置或为空。

+0

正是我在找的东西。如果TEST_DATABASE_NAME尚未定义,那么'export TEST_DATABASE_NAME =“$ {TEST_DATABASE_NAME:= prodlike}”行只会将prodlike用作默认值。没有凌乱的条件块。全部在一行代码中。 – 2017-04-15 05:41:46

46

的标准溶液,以有条件地分配可变(无论是在环境或不)是:

: ${VAR=foo} 

,将设置VAR为值“foo”的仅当它是未设置。
要设置VAR为“富”如果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 

它也没有工作产卵子shell和测试:

sh -c 'echo $VAR' 

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

+0

您可以添加一个关于':$ {VAR:= foo}'符号如何在内部工作的解释吗?我总是觉得它是解决方案,但从来没有如何实际工作。 – 2014-01-13 18:03:59

+1

我在[StackOverflow](http://stackoverflow.com/questions/4437573/bash-assign-default-value)上找到了一些解释! – 2014-01-13 18:09:33