检查环境variables

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

我试图执行一个额外的检查,以防止发生,但没有运气。 我使用的代码块是:

#!/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'取消它? 似乎并不是这样的

用双引号将variables括起来。

 if [ "$TESTVAR" = "foo" ] 

如果你这样做,variables是空的,testing扩展到:

 if [ "" = "foo" ] 

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

 if [ = "foo" ] 

这是一个语法错误。

看看“参数扩展”部分,您会发现如下内容:

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

您的testing,看看是否设置的值

 if [ -n $TESTVAR ] 

实际上只是testing是否将值设置为空string以外的值。 注意:

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

记住0表示真。

如果您不需要与原始Bourne shell的兼容性,则可以将该初始比较更改为

 if [[ $TESTVAR ]] 

在Bash(和ksh和zsh)中,如果使用双方括号,则不需要引用variables来防止它们为空或未设置。

 $ 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 

还有其他的好处 。

在解释缺less的TESTVAR之后,您正在评估[==“y”]。 尝试以下任一方法

  • “$的testvar”
  • X $ TESTVAR == Xy
  • $ {的testvar: – ''}