2010-06-05 173 views
41

我想检查一个环境变量的值,并根据值做某些事情,只要变量设置它工作正常。当它不是我虽然得到一大堆错误(因为BASH试图比较我指定的字符串与一个未定义的变量,我猜)检查环境变量

我试着实施额外的检查,以防止它发生,但没有运气。我在用的代码块:

#!/bin/bash 

if [ -n $TESTVAR ] 
then 
    if [ $TESTVAR == "x" ] 
    then 
    echo "foo" 
    exit 
    elif [ $TESTVAR == "y" ] 
    then 
    echo "bar" 
    exit 
    else 
    echo "baz" 
    exit 
    fi 
else 
    echo -e "TESTVAR not set\n" 
fi 

这是输出:

$ export TESTVAR=x 
$ ./testenv.sh 
foo 
$ export TESTVAR=y 
$ ./testenv.sh 
bar 
$ export TESTVAR=q 
$ ./testenv.sh 
baz 
$ unset TESTVAR 
$ ./testenv.sh 
./testenv.sh: line 5: [: ==: unary operator expected 
./testenv.sh: line 9: [: ==: unary operator expected 
baz 

我的问题是,不应该“取消设置的testvar”废掉了吗?它似乎并非如此...

回答

87

将变量括在双引号中。

if [ "$TESTVAR" = "foo" ] 

,如果你做到这一点,该变量为空,测试将扩展为:

if [ "" = "foo" ] 

,而如果你不引用它,它扩展为:

if [ = "foo" ] 

这是一个语法错误。

+0

是啊,这固定它。感谢您的建议。 – Hamza 2010-06-05 20:09:54

+0

没有必要将字符串文字(foo)放在引号中。 – camh 2010-06-05 23:32:04

+21

@camh没有,除了良好的做法,清晰度,以及真正的文字可能包含空格的事实。 – 2010-06-06 08:49:04

5

看标题为 “参数扩展”,你会发现喜欢的东西:

$ {参数:-word}
使用默认值。如果参数未设置或为空,则替换单词。否则,将替换 参数 的值。

+0

这很有趣,不知道这样的事情存在。谢谢你的评论。 – Hamza 2010-06-05 20:10:25

2

解释了您正在评估的缺失TESTVAR [==“y”]。老命:

  • “$的testvar”
  • X $的testvar == XY
  • $ {的testvar: - ''}
+0

第一个修好了,感谢您的评论。 – Hamza 2010-06-05 20:10:51

4

在bash(和ksh和zsh的),如果你可以使用双方括号,你不需要引用变量来防止它们为空或未设置。

$ if [ $xyzzy == "x" ]; then echo "True"; else echo "False"; fi 
-bash: [: ==: unary operator expected 
False 
$ if [[ $xyzzy == "x" ]]; then echo "True"; else echo "False"; fi 
False 

还有other advantages。看到

+1

他们有缺点,即脚本不再是Bourne shell兼容 - 这在这种情况下当然不重要。 – 2010-06-05 20:57:38

+1

@ Neil:如果Bourne兼容性问题,那么shebang应该说'#!/ bin/sh'。 – 2010-06-05 22:49:06

5

您的测试,如果该值设置

if [ -n $TESTVAR ] 

其实只是测试,看看是否值设置为非空字符串以外的东西。观察:

$ unset asdf 
$ [ -n $asdf ]; echo $? 
0 
$ [ -n "" ]; echo $? 
1 
$ [ -n "asdf" ]; echo $? 
0 

请记住,0表示为真。

如果不需要与原Bourne shell的兼容性,你可以改变,初步比较

if [[ $TESTVAR ]]