如果任何命令返回非零值,则中止 shell 脚本

新手上路,请多包涵

我有一个调用许多命令的 Bash shell 脚本。

如果任何命令返回非零值,我希望 shell 脚本自动退出并返回值 1。

如果不明确检查每个命令的结果,这可能吗?

例如,

 dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

dosomething2
if [[ $? -ne 0 ]]; then
    exit 1
fi

原文由 Jin Kim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 914
2 个回答

将此添加到脚本的开头:

 set -e

如果一个简单的命令以非零退出值退出,这将导致 shell 立即退出。 A simple command is any command not part of an if , while , or until test, or part of an && or || 列表。

有关更多详细信息,请参阅“set”内部命令的 bash 手册

当中间出现问题并打破脚本其余部分的假设时,让脚本顽固地继续下去真的很烦人。我个人以 set -e 开始几乎所有可移植的 shell 脚本。

如果我专门使用 bash ,我将从

set -Eeuo pipefail

这以类似的方式涵盖了更多错误处理。我认为这些是新 bash 程序的合理默认值。有关这些选项的作用的更多信息,请参阅 bash 手册。

原文由 Ville Laurikari 发布,翻译遵循 CC BY-SA 4.0 许可协议

要添加到已接受的答案:

请记住 set -e 有时是不够的,特别是如果您有管道。

例如,假设你有这个脚本

#!/bin/bash
set -e
./configure  > configure.log
make

…按预期工作: configure 中的错误中止执行。

明天你做一个看似微不足道的改变:

 #!/bin/bash
set -e
./configure  | tee configure.log
make

…现在它不起作用。 此处 对此进行了解释,并提供了一种解决方法(仅限 Bash):

#!/bin/bash
设置-e
设置-o pipefail

./配置 |三通配置日志
制作

原文由 leonbloy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题