为什么是[$? -eq 0]是反模式吗?

时间:2019-06-14 08:03:37

标签: shell sh

我在许多Shell脚本中都看到了这种模式,包括来自大型且知名厂商的指导书,教程和生产脚本。

command
if [ $? -eq 0 ]; then
    things
fi

但是我被告知这是一种反模式。这是为什么?我应该怎么用呢?

1 个答案:

答案 0 :(得分:5)

Shell脚本通常是由不太熟悉该语言的人编写的。即使在名义上会受到相当多的审查,审查和现场测试的脚本中,这也需要大量复制/粘贴代码。

shell的流控制语句的通用是运行命令并检查其退出代码。换句话说,if已经完全做到了。在此示例中,它运行[ $? -eq 0 ]并检查那个的退出代码是否为零(表示成功);如果是,则运行then分支,否则运行else分支。

所以,重申一下,类似

command
if [ $? -eq 0 ]

更好地表示为公正

if command

当然,在某些情况下,您会关心特定于 的非零退出代码。然后,您必须检查甚至复制$?的值(因为一旦您运行另一个外部命令,它将被重置为另一个命令的退出代码)。但是检查它是否为零通常是多余的,并且证明了对shell语法的不完全了解。

类似地,while运行命令并检查其退出代码;如果它不为零,则放弃循环,并在相应的done语句之后继续执行。