检查环境变量

时间:2010-06-05 20:02:10

标签: linux bash shell

我正在尝试检查环境变量的值,并根据值执行某些操作,只要设置了变量,它就可以正常工作。当它不是我得到一大堆错误时(因为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'使其无效吗?情况似乎并非如此......

5 个答案:

答案 0 :(得分:113)

将变量括在双引号中。

if [ "$TESTVAR" = "foo" ]

如果您这样做并且变量为空,则测试将扩展为:

if [ "" = "foo" ]

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

if [  = "foo" ]

这是语法错误。

答案 1 :(得分:7)

请查看标题为“参数扩展”的部分,您可以找到以下内容:

  

$ {参数:-word}
                使用默认值。如果参数未设置或为null,则   延长长度                 sion代替了。否则,值   参数                 被替代。

答案 2 :(得分:7)

您的测试是否已设置值

if [ -n $TESTVAR ]

实际上只是测试以查看值是否设置为空字符串以外的其他内容。观察:

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

请记住,0表示True。

如果您不需要与原始Bourne shell兼容,则只需将初始比较更改为

即可
if [[ $TESTVAR ]]

答案 3 :(得分: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

答案 4 :(得分:2)

在解释缺失的TESTVAR后,您正在评估[==“y”]。尝试以下任何一个:

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