遇到错误时退出脚本

问题描述 投票:0回答:4

我正在构建一个 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

...

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

bash exit shell
4个回答
381
投票

如果将

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

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

通过条件(例如

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


204
投票

您在寻找

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

...

48
投票

如果您希望能够处理错误而不是盲目退出,请在

set -e
伪信号上使用
trap
,而不是使用
ERR

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

RETURN
DEBUG


14
投票

方法如下:

#!/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 *** 
************
'
© www.soinside.com 2019 - 2024. All rights reserved.