我定义了以下变量:
myVar=true
现在我想按照以下方式运行:
if [ myVar ]
then
echo "true"
else
echo "false"
fi
上面的代码确实有效,但如果我尝试设置
myVar=false
它仍然会输出true。 可能是什么问题?
编辑:我知道我可以做一些表格
if [ "$myVar" = "true" ]; then ...
但它有点尴尬。
由于
答案 0 :(得分:113)
bash不知道布尔变量,test
也不知道(这是使用[
时调用的内容)。
解决方案是:
if $myVar ; then ... ; fi
因为true
和false
是分别返回0
或1
的命令,这是if
所期望的。
请注意,值是“交换”的。 if
之后的命令必须在成功时返回0
,而0
在大多数编程语言中都表示“false”。
安全警告:这是有效的,因为BASH扩展了变量,然后尝试将结果作为命令执行!确保变量不能包含rm -rf /
答案 1 :(得分:37)
请注意,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字符串比较,可能只是为了获得退出状态而分支进程。 fork是一项繁重而昂贵的操作,而字符串比较则非常便宜。想想几个CPU周期而不是几千个。我的case
解决方案也是在没有分叉的情况下处理的。