如何在bash中的if块中计算布尔变量?

How to evaluate a boolean variable in an if block in bash?

本问题已经有最佳答案,请猛点这里访问。

我已经定义了以下变量:

1
myVar=true

现在我想按照以下方式运行:

1
2
3
4
5
6
if [ myVar ]
then
    echo"true"
else
    echo"false"
fi

上面的代码确实有效,但如果我尝试设置

1
myVar=false

它仍将输出真实。
可能是什么问题?

编辑:我知道我可以做一些表格

1
if ["$myVar" ="true" ]; then ...

但它有点尴尬。

谢谢


bash不知道布尔变量,test也不知道(使用[时会调用它)。

解决方案是:

1
if $myVar ; then ... ; fi

因为truefalse是分别返回01的命令,这是if所期望的。

请注意,值是"交换"的。 if之后的命令必须在成功时返回0,而在大多数编程语言中0表示"false"。

安全警告:这是有效的,因为BASH扩展了变量,然后尝试将结果作为命令执行!确保变量不能包含rm -rf /之类的恶意代码


请注意,if $myVar; then ... ;fi构造存在您可能希望避免的安全问题

1
2
3
4
5
case $myvar in
  (true)    echo"is true";;
  (false)   echo"is false";;
  (rm -rf*) echo"I just dodged a bullet";;
esac

您可能还想重新考虑为什么if ["$myvar" ="true" ]对您来说很尴尬。这是一个shell字符串比较,可能只是为了获得退出状态而分支进程。 fork是一项繁重而昂贵的操作,而字符串比较则非常便宜。想想几个CPU周期而不是几千个。我的case解决方案也是在没有叉子的情况下处理的。