在错误时退出脚本
我正在构build一个具有如下function的Shell脚本:
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 ...
显示错误信息后,我希望脚本的执行完成。 我怎么能做到这一点?
你在找exit
吗?
这是最好的bash指南。 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
放在脚本中,脚本中的任何命令都会失败(即任何命令返回非零状态),脚本将立即终止。 这不会让你写自己的消息,但通常失败的命令自己的消息就足够了。
这种方法的优点是它是自动的:你不会冒着忘记处理错误的情况。
通过条件testing状态的命令(例如, &&
或||
)不会终止脚本(否则条件将毫无意义)。 偶然的命令失败并不重要的一个习惯用法是command-that-may-fail || true
command-that-may-fail || true
。 您也可以使用set +e
将部分脚本的set -e
closures。
如果你想能够处理一个错误而不是盲目地退出,而不是使用set -e
,那么在ERR
伪信号上使用一个trap
。
#!/bin/bash f () { errcode=$? # 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 $errcode # 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伪信号RETURN
和DEBUG
。
这是做到这一点的方法:
#!/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 *** ************ '
exit 1
是你所需要的。 1
是一个返回代码,所以你可以改变它,如果你想,比如1
代表一个成功的运行, -1
代表一个失败或类似的东西。