所以我现在正在上周进行更多的bash编程,我认为我会这样做。
我见过使用[ condition ] && { ... }
和if [ condition ]; then ...; fi
类型构造的代码。
据我所知,[ condition ] && { ... }
相当于if [ condition ]; then ...; fi
。
然而,对于前一种构造,你不能做别的。
有人可以解释为什么你会使用其中一个,优点/缺点以及这里最好的做法。
答案 0 :(得分:4)
[[ ]]
是ksh中的内置条件语法,由bash,zsh和其他人采用。可以将其视为[
命令的更强大版本(该命令的名称也称为test
- 并且要清楚,[
是命令,而不是语法)。它不是流量控制操作员,因此在关于流量控制的讨论中基本上是偏离主题的。
some-command && other-command
是短路布尔逻辑。也就是说,它是一个返回两个命令是否都返回真值的语句。
当且仅当some-command
成功时,必须运行other-command
以了解两个命令是否成功。因此,作为此逻辑运算符的副作用,它的行为方式与if
语句类似。
类似地,some-command || other-command
返回一个值,该值指示其中一个命令或另一个命令是否成功。为了确定两者中的任何一个是否为真,如果左边的那个失败,只需要在右边运行一个;如果左边的那个成功,那么先验已知两个中的一个成功了。
这种行为以及相关的习语对于实现具有明确定义的操作顺序的短路布尔逻辑的所有语言都是通用的;没有任何一部分是针对bash的。
那么,你为什么要使用短路形式?简洁。
为什么要使用长形式?正确性,特别是在需要结合操作的情况下。考虑:
foo && bar || baz
这看起来很像:
if foo; then bar; else baz; fi
...但是,它有一个错误:如果bar
失败,那么baz
即使foo
成功也可以运行。因此,if / then / else形式是首选形式,除非在布尔逻辑情况下非常确定所需的行为。