我试图判断一个环境变量的值,并根据该值执行某些操作,只要设置了该变量,它就可以正常工作.如果不是这样,我会得到一大堆错误(因为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’不应该使其无效吗?事实似乎并非如此...

推荐答案

用双引号将变量括起来.

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

如果执行此操作且变量为空,则测试将扩展为:

if [ "" == "foo" ]

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

if [  == "foo" ]

这是一个语法错误.

Linux相关问答推荐

makeinfo找不到Texinfo/ModulePath.pm

"‘operator<<’匹配失败(可能是因为我的C++/GCC版本问题)"

如何修复 script(1) 实用程序输出的换行符?

sed + 从没有额外空格的文本中删除单词

无法在嵌入式 Linux 中使用 libjpeg 以 RGB888 在 LCD(黑色)上显示 JPEG

使用 sed 或 awk 格式化文本

读取命令停止执行 bash 脚本

在 bash 中解析变量

如何用 Sed 替换 Match 后的 2 个连续行

未找到框架.NETFramework,Version=v4.7.1的参考程序集

如何将文件从 Vagrant 机器复制到 localhost

低功耗蓝牙:在 linux 中监听通知/指示

优雅地杀死在 Linux 上运行的 .NET Core 守护进程

bash 中的线程?

命令列出除 . (点)和..(点点)

如何等待第一个命令完成?

Android - 找不到命令

rename() 是原子的吗?

在 reverse-i-search (Ctrl+R ) , 历史上类似命令之间切换的任何方法

如何始终以 GB 为单位获取 df linux 命令输出