在学习bash时,我发现了四种使用if
语句的方法:
- 单圆括号-(…)
- 双圆括号-((…))
- 单方括号-〔…〕
- 双方括号-[[…]]
bash中圆括号和方括号之间的区别是什么。
您列出的测试:
- 单圆括号-(…)正在创建一个子shell
- 双圆括号-((…))用于算术运算
- 单方括号-[…]是POSIX
test
的语法 - 双方括号-[[…]]是bash条件表达式的语法(类似于
test
,但功能更强大)
不是详尽无遗的,您可以使用布尔逻辑
if command; then ...
因为命令具有退出状态。在bash
中,0
是true
,>0
是false
。
你可以看到这样的退出状态:
command
echo $?
参见:
http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
shell本身只运行命令并评估其退出代码。零退出代码表示成功;所有其他值表示故障。
if command; then
: things to do if the exit code from command was 0
else
: things to do if it was not 0
fi
while command; do
: things to do if the exit code was 0
done
命令[
(又名test
)在条件句中非常常用,因为最初的Bourne shell缺少内置运算符来检查字符串是否为空或文件是否存在。现代shell内置了这个命令,许多shell都有一个扩展的现代化版本[[
,但这不能正确地移植到POSIXsh
,因此应该避免移植脚本。这个相关的问题更详细地解释了两者之间的区别。
符号(( ... ))
引入了一个算术上下文。同样,这不是最初Bourne shell的一部分(它有一个专门的外部工具expr
来处理这些事情),但现代shell已经内置了这一点。如果算术求值的结果不是0(或错误),算术表达式的结果代码是0。
符号( command )
创建一个子shell,并在其中计算command
。在某些情况下,这实际上是必要和有用的,但如果你只是在学习语法,你不太可能需要它。
事实上,在我看到的大多数脚本中,这显然是不必要的。
另一个需要注意的反模式是
command
if [ $? = 0 ]; then
: things
fi
您几乎不需要明确检查$?
,特别是,将其与零进行比较是if
和while
在幕后专门为您做的事情。这应该简单地重构为
if command; then
: ...