添加上下文以希望有助于在此主题上提供一些额外的清晰度。对于 BaSH 新手来说,真/假陈述的感觉相当奇怪。举以下简单的例子及其结果。
此语句将返回“true”:
foo=" "; if [ "$foo" ]; then echo "true"; else echo "false"; fi
但这会返回“false”:
foo=" "; if [ $foo ]; then echo "true"; else echo "false"; fi
你明白为什么吗?第一个示例有一个带引号的 "" 字符串。这导致 BaSH 按字面意思对待它。所以,从字面上看,空格不是空的。虽然在非字面意义上(上面的第二个示例),但 BaSH(作为 $foo 中的值)将空格视为“无”,因此它等同于 null(此处解释为“假”)。
这些语句都会返回一个“false”的文本字符串:
foo=; if [ $foo ]; then echo "true"; else echo "false"; fi
foo=; if [ "$foo" ]; then echo "true"; else echo "false"; fi
foo=""; if [ $foo ]; then echo "true"; else echo "false"; fi
foo=""; if [ "$foo" ]; then echo "true"; else echo "false"; fi
有趣的是,这种类型的条件总是会返回 true:
这些语句都将返回“真”的结果:
foo=""; if [ foo ]; then echo "true"; else echo "false"; fi
注意区别;条件中变量名前面的 $ 符号已被省略。在括号之间插入什么词并不重要。 BaSH 将始终将此语句视为正确,即使您使用的词以前从未与同一 shell 中的变量相关联。
if [ sooperduper ]; then echo "true"; else echo "false"; fi
同样,将其定义为未声明的变量可确保它始终返回 false:
if [ $sooperduper ]; then echo "true"; else echo "false"; fi
至于 BaSH 和写作一样:
sooperduper="";if [ $sooperduper ]; then echo "true"; else echo "false"; fi
还有一个提示....
括号与无括号
让事情变得更加混乱,IF/THEN 条件的这些变化都有效,但返回相反的结果。
这些返回错误:
if [ $foo ]; then echo "true"; else echo "false"; fi
if [ ! foo ]; then echo "true"; else echo "false"; fi
但是,这些将返回 true 的结果:
if $foo; then echo "true"; else echo "false"; fi
if [ foo ]; then echo "true"; else echo "false"; fi
if [ ! $foo ]; then echo "true"; else echo "false"; fi
当然,这会返回一个语法错误(以及“假”的结果):
if foo; then echo "true"; else echo "false"; fi
困惑了吗?一开始就将其牢记在心可能非常具有挑战性,尤其是如果您习惯于其他更高级别的编程语言。