Bash 条件句中括号与括号的区别

在学习了一些关于 的知识后,我发现了使用 if语句的四种方法:

  • 单括号-(...)
  • 双括号-((...))
  • 单方括号-[ ... ]
  • 双方括号[ ... ]

Bash 中括号和方括号的区别是什么。

33701 次浏览

你列出的测试:

  • 单括号-(...)正在创建一个子 shell
  • 双括号-((...))是用来做算术运算的
  • 单方括号-[ ... ]是 POSIX test的语法
  • 双方括号-[[ ... ]]是 bash 条件表达式的语法(类似于 test,但更强大)

不是详尽的,你可以使用 布尔逻辑

if command; then ...

bash中,0true,> 0false

您可以看到退出状态如下:

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 有一个扩展的、现代化的版本 [[,但是这不能适当地移植到 POSIX sh,因此应该避免移植脚本。这个相关的问题更详细地解释了两者之间的区别。

符号 (( ... ))引入了算术上下文。同样,这不是原始 Bourne shell 的一部分(它有一个专用的外部工具 expr来处理这些事情) ,但是现代的 shell 已经内置了这个。如果算术计算的结果不是0(或者是一个错误) ,则算术表达式的结果代码为0。

表示法 ( command )创建一个子 shell 并在其中计算 command。在某些情况下,这实际上是必要的和有用的,但是如果您只是在学习语法,那么您不太可能需要它。

事实上,在我看到的大多数脚本中,这个用在条件句中,显然是没有必要的。

另一个需要注意的反模式是

command
if [ $? = 0 ]; then
: things
fi

您几乎不需要显式地检查 $?,特别是,将它与零进行比较是 ifwhile 特别是在幕后为您做的事情。这应该被重构为

if command; then
: ...