奇怪的Bash if/elif行为

aba*_*ter 0 bash shell conditional if-statement

我有以下脚本:

a=$1
b=$2

if [ ! a ]; then
    echo "a=$a"
elif [ b ]; then
    echo "b=$b"
fi
Run Code Online (Sandbox Code Playgroud)

这是我可以称之为的四种可能方式:

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
Run Code Online (Sandbox Code Playgroud)

我原以为:

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
Run Code Online (Sandbox Code Playgroud)

我显然不明白bash elif的陈述.有人可以开导我吗?

另外,一个interwebs,bash脚本教程有时会使用[[...]]但主要是[...].我看到很多SO评论者说你应该使用[[...]].当一个人比另一个好的时候,有经验法则吗?

Chr*_*aes 6

你犯了两个错误:

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

所以你想要这样的东西:

if [ "$a" = "true" ]; then
    echo "a=$a"
elif [ "$b" = "true" ]; then
    echo "b=$b"
fi
Run Code Online (Sandbox Code Playgroud)

我实施了两项建议:

  • 总是把变量放在引号之间; 在它们为空时避免错误("$ a"而不是$ a)
  • 只使用一个=符号表示可移植性(由@tripleee建议)

更多细节

bash不知道布尔值.你的考试:

if [ ! a ];
Run Code Online (Sandbox Code Playgroud)

因为你问bash会不会失败:字符"a"是空的吗?这与以下相同:

if [ "" = "a" ]
Run Code Online (Sandbox Code Playgroud)

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

if [  ! $a ] 
Run Code Online (Sandbox Code Playgroud)

这仍然是假的; 因为这相当于:

if [ "" = "$a" ]
Run Code Online (Sandbox Code Playgroud)

无论a = true还是a = false(因为a永远不是空字符串),这将永远不会成立