我有一个Bash shell脚本,它调用许多命令。
如果任何命令返回非零值,我想让shell脚本自动退出并返回值为1。
如果不显式地检查每个命令的结果,这可能吗?
例如,
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
我有一个Bash shell脚本,它调用许多命令。
如果任何命令返回非零值,我想让shell脚本自动退出并返回值为1。
如果不显式地检查每个命令的结果,这可能吗?
例如,
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
当前回答
像这样的表达式
dosomething1 && dosomething2 && dosomething3
当其中一个命令返回非零值时将停止处理。例如,下面的命令永远不会打印"done":
cat nosuchfile && echo "done"
echo $?
1
其他回答
将以下内容添加到脚本开头:
set -e
如果一个简单的命令退出时退出值非零,这将导致shell立即退出。简单命令是指不属于if、while、until test或&&或||列表的任何命令。
有关“set”内部命令的详细信息,请参阅bash手册。
当某个脚本在中间发生故障并打破了对脚本其余部分的假设时,让脚本固执地继续下去是非常令人恼火的。我个人使用set -e启动几乎所有可移植shell脚本。
如果我专门处理bash,我会从
set -Eeuo pipefail
这以类似的方式涵盖了更多的错误处理。我认为这些是新的bash程序的正常默认值。有关这些选项的功能的更多信息,请参阅bash手册。
如果出现错误,下面的脚本将打印一个红色错误消息并退出。 把这个放在你的bash脚本的顶部:
# BASH error handling:
# exit on command failure
set -e
# keep track of the last executed command
trap 'LAST_COMMAND=$CURRENT_COMMAND; CURRENT_COMMAND=$BASH_COMMAND' DEBUG
# on error: print the failed command
trap 'ERROR_CODE=$?; FAILED_COMMAND=$LAST_COMMAND; tput setaf 1; echo "ERROR: command \"$FAILED_COMMAND\" failed with exit code $ERROR_CODE"; put sgr0;' ERR INT TERM
像这样的表达式
dosomething1 && dosomething2 && dosomething3
当其中一个命令返回非零值时将停止处理。例如,下面的命令永远不会打印"done":
cat nosuchfile && echo "done"
echo $?
1
运行时带-e或者在顶部设置-e。
再看看set -u。
示例中的if语句是不必要的。就像这样做:
dosomething1 || exit 1
如果你采纳了Ville Laurikari的建议并使用set -e,那么对于某些命令你可能需要使用这个:
dosomething || true
|| true将使命令管道即使在命令失败时也具有真实的返回值,因此-e选项不会终止脚本。