`if [[。。]]和有什么不一样?然后...`和`[[[..]] && ...`?

时间:2019-01-02 14:26:39

标签: bash

Bash中if [[ ... ]] ; then ...[[ ... ]] && ...构造之间的语法区别是什么?例如:

if [[ -d /etc ]] ; then echo "I see." ; else echo "I don't." ; fi
[[ -d /etc ]] && echo "I see." || echo "I don't."

一个人能做什么而另一个人不能做?

2 个答案:

答案 0 :(得分:3)

差别不大,但一个是第一个示例仅使用第一个条件。在第二个中,有两个条件会影响输出。

if [[ -d /etc ]] ; # only condition that matters
 then echo "I see." ;
 else echo "I don't." ; 
fi

[[ -d /etc ]] &&  # condition 1
echo "I see." || # condition 2
echo "I don't."

在此示例中,条件2总是可以的,因为echo是一个内置函数,但是如果它是另一个命令,并且失败,它将触发or子句,这在第一个示例中是不可能的。第一个仅使用一个条件,第二个依赖两个条件。

答案 1 :(得分:0)

附录-与之相关的是,您可以在格式正确的if / then / elif / else的每个块中放置多个语句,而无需付出很多额外的努力(尽管if部分确实需要一些麻烦)但是三元构造要求您自己创建块。

if true && false || oops
then : "this shan't be executed"
     : but I can put several statements anyway
elif true && true || oops
then echo hello
     echo more statements!
else : I could put more statements here too
     : see?
fi
bash: oops: command not found
hello
more statements!

要在三元组中创建多语句块,您需要这样的东西-

true && {
   echo ok
   echo more
   oops!
} || false {
   echo This still has the same logical vulnerability, now made *worse*
   echo oh, woe.
}
ok
more
bash: oops!: command not found
       echo This still has the same logical vulnerability
This still has the same logical vulnerability
       echo oh, woe.
oh, woe.
    }
bash: syntax error near unexpected token `}'

可以清理一点,但这不是重点。
他们不一样。