我正在尝试运行一个简单的脚本来检查标志,然后检查其他条件。无论标志的值如何,以下内容始终回显“运行脚本..”:
FLAG_Control=false
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
虽然这按预期工作:
FLAG_Control=false
if [ $FLAG_Control = true ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
这是否意味着我必须进行明确的比较?我在第一个中做错了什么吗?
答案1
尝试使用if $FLAG_Control && [ -d /path/to/dir ]; ...
.请注意,方括号不是if
;语法的一部分。在这种情况下,您希望$FLAG_Control
被解释为命令(true
或false
),并且这将&&
与另一个[ ... ]
子句很好地配合。 (这假设您的变量始终设置为true
或false
。)
您的初始测试没有达到您的预期的原因可以在test
(又名[
)的文档中看到:
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
由于false
这里没有任何特殊含义,因此它只是被视为非空字符串,被解释为真值。
答案2
在过去的几个月里我一直在学习 bash 脚本。据我所知,bash 中没有布尔变量。然而,这并不是说没有任何布尔值。
If/then 寻找 1 或 0。现在......这里有一个警告:0 为真,其他一切为假。例如,当您检查 a 是否直接存在时,返回的结果是 0 而不是 1。
如果您从调用的函数中获得任何类型的错误代码,则可以捕获该错误。
所以,试试这个:
FLAG_Control=1
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
答案3
最接近 a 的事物真的shell 变量的值是放价值。还有一些本机参数属性也依赖于它。例如:
FLAG=
[ -d "${FLAG:+$HOME}" ] || ! echo \
either \$HOME is not a directory or \$FLAG is null or unset
仅当已设置且不为 null 时,以上$FLAG
内容才会有条件地扩展为 的值。$HOME
对此有几种变体,但总体要点是参数的值并不总是像参数是否存在那么重要。有一个值。设置FLAG
为以上任何值都会导致真正的返回test
而不是失败。