我已经定义了以下变量:
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是返回的命令0或1分别是if期望的命令.
请注意,值是"交换"的.后面的命令if必须返回0成功,而0在大多数编程语言中表示"假".
安全警告:这是有效的,因为BASH扩展了变量,然后尝试将结果作为命令执行!确保变量不能包含恶意代码rm -rf /
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解决方案也没有叉子处理.