首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果任何命令返回非零值,则中止shell脚本

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

Stack Overflow用户
提问于 2009-05-04 18:55:50
回答 9查看 218.8K关注 0票数 529

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

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

如果不显式检查每个命令的结果,这是可能的吗?

例如,

代码语言:javascript
复制
dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

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

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-05-04 19:00:17

将此代码添加到脚本的开头:

代码语言:javascript
复制
set -e

如果一个简单的命令以非零的退出值退出,这将导致shell立即退出。简单的命令是任何不属于if、while或until测试的命令,或者不属于&&或||列表的命令。

有关更多详细信息,请参阅"set“内部命令上的bash(1) man page

我个人几乎所有的shell脚本都以"set -e“开头。让脚本顽固地在中间部分失败并破坏脚本其余部分的假设时继续运行,这真的很烦人。

票数 862
EN

Stack Overflow用户

发布于 2009-05-04 19:03:39

示例中的if语句是不必要的。就像这样做:

代码语言:javascript
复制
dosomething1 || exit 1

如果您采纳了Ville Laurikari的建议并使用set -e,那么对于某些命令,您可能需要使用以下命令:

代码语言:javascript
复制
dosomething || true

即使命令失败,|| true也会使命令管道具有true返回值,因此-e选项不会终止脚本。

票数 95
EN

Stack Overflow用户

发布于 2009-05-07 20:52:32

如果你需要在退出时进行清理,你也可以使用带伪信号ERR的'trap‘。这与捕获INT或任何其他信号的方式相同;如果任何命令以非零值退出,bash都会抛出ERR:

代码语言:javascript
复制
# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

或者,特别是当您使用"set -e“时,您可以捕获退出;然后,当脚本出于任何原因退出时,您的陷阱将被执行,包括正常结束、中断、由-e选项导致的退出等。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/821396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档