奇怪的Bash if / elif行为

时间:2016-01-28 06:53:04

标签: bash shell if-statement conditional

我有以下脚本:

a=$1
b=$2

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的陈述。有人可以开导我吗?

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

2 个答案:

答案 0 :(得分:6)

你犯了两个错误:

  1. 您想要使用变量a,而不是字符&#34; a&#34 ;;所以请使用$a
  2. 由于bash不知道布尔值,你可能只是检查值是否为&#34; true&#34;。
  3. 所以你想要这样的东西:

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

    我实施了两项建议:

    • 总是在引号之间放置变量;当它们是空的时候避免错误(&#34; $ a&#34;而不是$ a)
    • 仅使用一个=符号表示可移植性(由@tripleee建议)

    更多详情

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

    if [ ! a ];
    
    因为你问bash,

    总会失败:是字符&#34; a&#34;空?这与:

    相同
    if [ "" = "a" ]
    

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

    if [  ! $a ] 
    

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

    if [ "" = "$a" ]
    
    无论a = true还是a = false(因为a永远不是空字符串)

    ,它永远不会成立

答案 1 :(得分:-1)

避免括号。试试这个:

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