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."
一个人能做什么而另一个人不能做?
答案 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 `}'
可以清理一点,但这不是重点。
他们不一样。