【问题标题】:Checking for environment variables检查环境变量
【发布时间】:2010-06-05 20:02:10
【问题描述】:

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

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    用双引号将变量括起来。

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

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

    if [ "" == "foo" ]
    

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

    if [  == "foo" ]
    

    这是一个语法错误。

    【讨论】:

    • 不需要将字符串文字 (foo) 放在引号中。
    • @camh 无,除了良好的做法、清晰性以及实际文字可能包含空格这一事实。
    • 我认为这可以解释为什么人们放弃了 bash 之类的东西,而是创建了类似的环境,比如 Perl,或者可能是 PHP 或 python 等用于 devops 的东西。太多的小细节在背后咬你...
    【解决方案2】:

    在 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

    【讨论】:

    • 它们的缺点是脚本不再与 Bourne shell 兼容——在这种情况下这当然无关紧要。
    • @Neil:如果 Bourne 兼容性是个问题,那么 shebang 应该说 #!/bin/sh
    【解决方案3】:

    查看标题为“参数扩展”的部分,您会发现如下内容:

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

    【讨论】:

    • 这很有趣,不知道有这样的东西存在。感谢您的评论。
    【解决方案4】:

    在解释了缺失的TESTVAR 之后,您正在评估[ == "y" ]。尝试以下任何一种:

     "$TESTVAR"
     X$TESTVAR == Xy
     ${TESTVAR:-''}
    

    【讨论】:

      【解决方案5】:

      你的测试看看值是否设置

      if [ -n $TESTVAR ]
      

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

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

      请记住,0 表示 True。

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

      if [[ $TESTVAR ]]
      

      【讨论】:

      • 有没有办法测试 $asdf 不为 null 并设置为与空字符串不同的值,但与原始 Bourne shell 兼容?
      猜你喜欢
      • 2019-07-31
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多