检查环境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: – ''}