如何在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
因为true
和false
是分别返回0
或1
的命令,这正是if
所期望的。
请注意,这些值是“交换的”。 if
之后的命令必须在成功时返回 0
而0
在大多数编程语言中意味着“假”。
安全警告:这是因为 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
解决方案也无需分叉即可处理。
【讨论】:
true
和 false
是大多数 shell 中的内置命令。调用它们不太可能需要fork()
调用。
在bash、zsh、ksh、dash、fish中调用which true
,好像只有zsh内置了true
和false
。不过,对于 shell 来说,实施似乎是一件明智的事情!
不要使用 which
-- 只搜索 $PATH -- 使用 type -a true
-- true 和 false 内置于 bash 和 ksh 和 dash以上是关于如何在bash的if块中评估布尔变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章