检查环境变量

Ham*_*mza 62 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
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

我的问题是,不应该'取消TESTVAR'使其无效吗?似乎并非如此......

小智 119

将变量括在双引号中.

if [ "$TESTVAR" = "foo" ]
Run Code Online (Sandbox Code Playgroud)

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

if [ "" = "foo" ]
Run Code Online (Sandbox Code Playgroud)

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

if [  = "foo" ]
Run Code Online (Sandbox Code Playgroud)

这是一个语法错误.

  • @camh没有,除了良好的练习,清晰度,以及真正的文字可能包含空格的事实. (28认同)
  • 我认为这可以解释为什么人们放弃了bash之类的东西,而创建了类似Perl的环境,或者为devops创建了类似PHP或python的环境。太多小细节无法在后面咬你... (2认同)

msw*_*msw 8

看看标题为"参数扩展"的部分,你会发现:

$ {parameter:-word}
使用默认值.如果参数未设置或为null,则替换字的扩展.否则,参数的值将被替换.


int*_*ted 7

您的测试以查看值是否已设置

if [ -n $TESTVAR ]
Run Code Online (Sandbox Code Playgroud)

实际上只是测试以查看该值是否设置为空字符串以外的其他值.注意:

$ unset asdf
$ [ -n $asdf ]; echo $?
0
$ [ -n "" ]; echo $?
1
$ [ -n "asdf" ]; echo $?
0
Run Code Online (Sandbox Code Playgroud)

记住,这0意味着真实.

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

if [[ $TESTVAR ]]
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 5

在Bash(以及ksh和zsh)中,如果使用双方括号,则无需引用变量以防止变量为null或未设置。

$ 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
Run Code Online (Sandbox Code Playgroud)

还有其他优点

  • @Neil:如果 Bourne 兼容性是一个问题,那么shebang 应该说`#!/bin/sh`。 (2认同)