Linux 中基于简单标志的比较

Linux 中基于简单标志的比较

我正在尝试运行一个简单的脚本来检查标志,然后检查其他条件。无论标志的值如何,以下内容始终回显“运行脚本..”:

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被解释为命令(truefalse),并且这将&&与另一个[ ... ]子句很好地配合。 (这假设您的变量始终设置为truefalse。)

您的初始测试没有达到您的预期的原因可以在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而不是失败。

相关内容