在错误时退出脚本

我正在构建一个 Shell 脚本,它有一个像下面这样的 if函数:

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi


...

我希望脚本的执行在显示错误消息之后完成。我如何做到这一点?

226855 次浏览

你在找 exit吗?

这是最好的狂欢指南。 Http://tldp.org/ldp/abs/html/

背景:

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables 1>&2
exit 1 # terminate and indicate error
fi


...

如果在脚本中放入 set -e,脚本将在其中的任何命令失败时立即终止(即,当任何命令返回非零状态时立即终止)。这不允许您编写自己的消息,但是通常失败的命令自己的消息就足够了。

这种方法的优点是它是自动的: 您不会冒忘记处理错误情况的风险。

其状态由条件(如 if&&||)测试的命令不会终止脚本(否则条件将是无意义的)。command-that-may-fail || true是一个惯用语,用来形容偶尔发生的失败并不重要的命令。您还可以使用 set +e关闭脚本的一部分的 set -e

如果希望能够处理错误而不是盲目退出,不要使用 set -e,而是在 ERR伪信号上使用 trap

#!/bin/bash
f () {
errorCode=$? # save the exit code as the first thing done in the trap function
echo "error $errorCode"
echo "the command executing at the time of the error was"
echo "$BASH_COMMAND"
echo "on line ${BASH_LINENO[0]}"
# do some error handling, cleanup, logging, notification
# $BASH_COMMAND contains the command that was being executed at the time of the trap
# ${BASH_LINENO[0]} contains the line number in the script of that command
# exit the script or return to try again, etc.
exit $errorCode  # or use some other value or do return instead
}
trap f ERR
# do some stuff
false # returns 1 so it triggers the trap
# maybe do some other stuff

还可以设置其他陷阱来处理其他信号,包括通常的 Unix 信号以及其他 Bash 伪信号 RETURNDEBUG

下面是实现这一目标的方法:

#!/bin/sh


abort()
{
echo >&2 '
***************
*** ABORTED ***
***************
'
echo "An error occurred. Exiting..." >&2
exit 1
}


trap 'abort' 0


set -e


# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0


echo >&2 '
************
*** DONE ***
************
'