检查环境变量

新手上路,请多包涵

我正在尝试检查环境变量的值,并根据该值做某些事情,只要设置了变量,它就可以正常工作。当它不是虽然我得到一大堆错误时(因为 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

我的问题是,’unset TESTVAR’ 不应该取消它吗?好像不是这样的……

原文由 Hamza 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 566
2 个回答

用双引号将变量括起来。

 if [ "$TESTVAR" == "foo" ]

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

 if [ "" == "foo" ]

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

 if [  == "foo" ]

这是一个语法错误。

原文由 anon 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 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

还有 其他优点

原文由 Dennis Williamson 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题