如何在bash的if块中评估布尔变量? [复制]

Posted

技术标签:

【中文标题】如何在bash的if块中评估布尔变量? [复制]【英文标题】:How to evaluate a boolean variable in an if block in bash? [duplicate] 【发布时间】:2011-04-18 03:57:04 【问题描述】:

我已经定义了以下变量:

myVar=true

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

if [ myVar ]
then
    echo "true"
else
    echo "false"
fi

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

myVar=false

它仍然会输出 true。 可能是什么问题?

编辑:我知道我可以做一些形式的事情

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

但这有点尴尬。

谢谢

【问题讨论】:

另见:***.com/questions/2953646/… 【参考方案1】:

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

解决方案是:

if $myVar ; then ... ; fi

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

请注意,这些值是“交换的”。 if 之后的命令必须在成功时返回 00 在大多数编程语言中意味着“假”。

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

【讨论】:

可能会添加不要忘记最后的; fi。所以是if $myVar ; then ... ; fi if ! $myVar ; then ... ; fi 正好相反 case 答案(来自@Jens)更安全,不需要分叉来测试简单变量。【参考方案2】:

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

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

您可能还想重新思考为什么if [ "$myvar" = "true" ] 对您来说显得很尴尬。这是一个 shell 字符串比较,它可能会为了获得退出状态而分叉一个进程。分叉是一项繁重且昂贵的操作,而字符串比较则非常便宜。想想几个 CPU 周期与几千个。我的case 解决方案也无需分叉即可处理。

【讨论】:

truefalse 是大多数 shell 中的内置命令。调用它们不太可能需要fork() 调用。 在bash、zsh、ksh、dash、fish中调用which true,好像只有zsh内置了truefalse。不过,对于 shell 来说,实施似乎是一件明智的事情! 不要使用 which -- 只搜索 $PATH -- 使用 type -a true -- true 和 false 内置于 bash 和 ksh 和 dash

以上是关于如何在bash的if块中评估布尔变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Powershell - 如何为 Start-Job 预先评估脚本块中的变量

评估布尔语句的顺序是啥? [复制]

为啥在 bash if 语句中未设置的变量被评估为 0

在bash脚本中复制变量之间的值

带有if条件的隐式布尔评估[重复]

简单条件在bash中得到错误的评估结果[重复]