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

Bash条件句中括号和方括号的区别,bash,if-statement,Bash,If Statement,在学习了一些有关的知识后,我发现了四种使用if语句的方法: 单括号-(…) 双括号-(…) 单方括号-[…] 双方括号-[…]] bash中括号和方括号的区别是什么。您列出的测试: 单括号-(…)正在创建子shell 双括号-(…)用于算术运算 单方括号-[…]是POSIXtest 双方括号-[…]是bash条件表达式的语法(类似于test但功能更强大) 不是穷举的,可以使用布尔逻辑 也是,因为命令具有退出状态。在bash中,0为true,>0为false 您可以看到这样的退出状态: c

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

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

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

您列出的测试:

  • 单括号-(…)正在创建子shell
  • 双括号-(…)用于算术运算
  • 单方括号-[…]是POSIX
    test
  • 双方括号-[…]是bash条件表达式的语法(类似于
    test
    但功能更强大)
不是穷举的,可以使用布尔逻辑

也是,因为命令具有退出状态。在
bash
中,
0
true
,>
0
false

您可以看到这样的退出状态:

command
echo $?
见:




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
您几乎不需要显式地检查
$?
,尤其是,如果
在幕后专门为您做的事情,那么将其与零进行比较是
的事情。这应该简单地重构为

if command; then
    : ...

$?
不完全是返回值,它实际上是退出状态;0表示成功,1表示失败,您可以将其解释为true和false。将“返回值”替换为“退出状态”,是的,但失败不仅仅是1,而是我的帖子中写的所有状态>0。例如:
curl/dev/null
退出3@sputnick实际上,失败是所有状态!=0——负退出值也是可能的。@twalberg负退出值环绕-例如
exit-1
导致退出值为255
if command; then
    : ...