このような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
...
エラーメッセージを表示した後、スクリプトの実行を終了する必要があります。どうすればいいですか?
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
を指定すると、スクリプトはその中のコマンドが失敗するとすぐに(つまり、コマンドがゼロ以外のステータスを返すとすぐに)終了します。これはあなた自身のメッセージを書くことを許しませんが、しばしば失敗したコマンド自身のメッセージで十分です。
このアプローチの利点は、自動であるということです。エラーのケースに対処するのを忘れる危険を冒さないでください。
状態によって条件がテストされるコマンド(if
、&&
、||
など)は、スクリプトを終了しません(そうでなければ、条件は無意味になります)。失敗が問題にならないときどきコマンドのイディオムはcommand-that-may-fail || true
です。 set -e
を使用して、スクリプトの一部でset +e
をオフにすることもできます。
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疑似シグナル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 ***
************
'