如果 shell 脚本中的命令失败,不确定如何发送错误代码

Unsure how to send error code if command within a shell script fails

我最近了解了一个 if 语句,该语句查看先前的命令,如果失败,将发送带有消息的退出代码 1。我不记得完整的声明,但它以以下开头:

if [ $? != "0" ]

这段话是怎么结束的?它是否遵循脚本中的每个命令?

不要那样做。显式引用 $? 几乎从不需要。如果你想在命令失败时以状态 1 退出,你可以简单地做:

cmd || exit 1

如果您希望退出时返回与命令相同的 non-zero 值,您可以简单地执行以下操作:

cmd || exit

有很多错误代码的例子,而是执行如下操作:

cmd
if [ "$?" -ne 0 ]; then echo cmd failed >&2; exit 1; fi

出于多种原因,这是一种不好的做法。让 shell 打印关于失败的通用消息是没有意义的;该命令本身应该已经写了详细的错误消息,而模糊的 "cmd failed" 只是线路噪音。此外,你会经常看到 set -e,它基本上在每个简单命令的末尾加上一个 || exit,但有很多意想不到的副作用和边缘情况,并且它的实现在历史和不同版本中发生了变化相同的 shell 将以不同的方式处理边缘情况,因此使用它确实不是一个好主意。

关于问题"how does this statement end?";它以 fi 结尾。 if 的一般形式是 if CMD; then ...; else ...; fi,其中 CMD 是一组管道(例如,您可以做 if echo foo | grep bar; cmd2 | foo; then ....)。如果 CMD returns 状态为 0,则执行第一组命令(在 "then" 和 "else" 之间)。如果CMD returns non-zero,则执行"else"和"fi"之间的命令。 "else" 子句是可选的。不要被 [ 骗了;这只是一个命令。在我看来,如果你使用它的替代拼写 test 会更清楚,它不需要 ] 的最终参数。 IOW,你可以写 if test "$?" -ne 0; then ...; fi.