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

dev*_*ium 82 bash

我已经定义了以下变量:

myVar=true
Run Code Online (Sandbox Code Playgroud)

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

if [ myVar ]
then
    echo "true"
else
    echo "false"
fi
Run Code Online (Sandbox Code Playgroud)

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

myVar=false
Run Code Online (Sandbox Code Playgroud)

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

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

if [ "$myVar" = "true" ]; then ...
Run Code Online (Sandbox Code Playgroud)

但它有点尴尬.

谢谢

Aar*_*lla 123

bash不知道布尔变量,也不知道test(使用时调用的是什么[).

解决方案是:

if $myVar ; then ... ; fi
Run Code Online (Sandbox Code Playgroud)

因为true并且false是返回的命令01分别是if期望的命令.

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

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

  • 和`如果!$ myVar; 然后 ... ; fi`给出了相反的结果 (9认同)
  • `case`答案(来自@Jens)更安全,不需要fork来测试一个简单的变量. (2认同)

Jen*_*ens 39

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

case $myvar in
  (true)    echo "is true";;
  (false)   echo "is false";;
  (rm -rf*) echo "I just dodged a bullet";;
esac
Run Code Online (Sandbox Code Playgroud)

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

  • `true` 和 `false` 是大多数 shell 中的内置命令。调用它们不太可能需要“fork()”调用。 (2认同)
  • 不要使用 `which` -- 只搜索 $PATH -- 使用 `type -a true` -- true 和 false 内置于 bash、ksh 和 dash (2认同)