出错时退出脚本

时间:2010-12-07 21:10:38

标签: bash exit shell

我正在构建一个像这样的if函数的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

...

我希望在显示错误消息后完成脚本的执行。我怎么能这样做?

5 个答案:

答案 0 :(得分:309)

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

这种方法的优点在于它是自动的:你不会冒失去处理错误案例的风险。

状态由条件(例如if&&||测试)的命令不会终止脚本(否则条件将是无意义的)。偶然命令失败无关紧要的成语是command-that-may-fail || true。您还可以使用set -e为脚本的一部分关闭set +e

答案 1 :(得分:103)

您在寻找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

...

答案 2 :(得分:38)

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

#!/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伪信号RETURNDEBUG

答案 3 :(得分:8)

以下是这样做的方法:

#!/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 *** 
************
'

答案 4 :(得分:-7)

exit 1就是你所需要的。 1是一个返回代码,因此您可以根据需要更改它,例如,1表示成功运行,-1表示失败或类似情况。