Bash条件句中括号和方括号之间的区别



在学习bash时,我发现了四种使用if语句的方法:

  • 单圆括号-(…)
  • 双圆括号-((…))
  • 单方括号-〔…〕
  • 双方括号-[[…]]

bash中圆括号和方括号之间的区别是什么。

您列出的测试:

  • 单圆括号-(…)正在创建一个子shell
  • 双圆括号-((…))用于算术运算
  • 单方括号-[…]是POSIXtest的语法
  • 双方括号-[[…]]是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都有一个扩展的现代化版本[[,但这不能正确地移植到POSIXsh,因此应该避免移植脚本。这个相关的问题更详细地解释了两者之间的区别。

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

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

事实上,在我看到的大多数脚本中,这显然是不必要的。

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

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

您几乎不需要明确检查$?,特别是,将其与零进行比较是ifwhile在幕后专门为您做的事情。这应该简单地重构为

if command; then
: ...

相关内容

  • 没有找到相关文章

最新更新