奇怪的 Bash if/elif 行为

Strange Bash if/elif behavior

我有以下脚本:

a=
b=

if [ ! a ]; then
    echo "a=$a"
elif [ b ]; then
    echo "b=$b"
fi

这是我可以调用它的四种可能方式:

balter$ bash eliftest.sh true true
b=true
balter$ bash eliftest.sh true false
b=false
balter$ bash eliftest.sh false true
b=true
balter$ bash eliftest.sh false false
b=false

我本以为:

b=true # !a evaluates to false but b is true
<nothing> # !a evaluates to false and b is also false
a=false # !a evaluates to true and if short circuits 
a=false # !a evaluates to true and if short circuits

我显然不理解 bash elif 语句。有没有大神能指教一下?

此外,在互联网上,bash 脚本教程有时使用 [[...]],但主要使用 [...]。我看到很多 SO 评论者说你应该使用 [[...]]。有没有什么时候比另一个更好的经验法则?

你犯了两个错误:

  1. 您想使用变量 a,而不是字符 "a";所以使用 $a.
  2. 由于 bash 不知道布尔值,您可能只检查值是否为 "true"。

所以你想要这样的东西:

if [ "$a" = "true" ]; then
    echo "a=$a"
elif [ "$b" = "true" ]; then
    echo "b=$b"
fi

我实施了另外两个建议:

  • 始终将变量放在引号之间;以避免在它们为空时出现错误(“$a”而不是 $a)
  • 为了便携性只使用一个 = 符号(如@tripleee 所建议)

更多细节

bash 不知道布尔值。您的测试:

if [ ! a ];

总是失败,因为你问bash:字符"a"是空的吗?与以下内容相同:

if [ "" = "a" ]

假设您确实使用了 $a(变量):

if [  ! $a ] 

这仍然永远是错误的;因为这相当于:

if [ "" = "$a" ]

无论 a=true 还是 a=false 都永远不会为真(因为 a 永远不会是空字符串)

避免括号。试试这个:

a=
b=
if ! $a 
then
    echo "a=$a"
elif $b 
then
    echo "b=$b"
fi