シェルスクリプトで例外処理(try-catch文)のような動作を行うには、set -eとtrapを使うことで可能です。

まず、正常終了(exit 0)する下記のスクリプト(sub.sh)を用意します。

#!/bin/sh

echo sub
exit 0

そして、sub.shを呼び出すmain.shを用意します。

#!/bin/sh

./sub.sh

echo OK
exit 0

このシェルスクリプトを実行すると、当然、下記のように出力されます。

# ./main.sh
sub
OK

次にsub.shを異常終了(exit 1)するようにします。

#!/bin/sh

echo sub
exit 1

この場合でも、main.shは最後(echo OK)まで処理されます。

./main.sh
sub
OK

そこで、異常終了した時点で処理を終了するにはset -eを使います。
set -eはコマンドの終了ステータスが0以外のときに、そこで処理が止まるようにします。

#!/bin/sh

set -e

./sub.sh

echo OK
exit 0

実際に実行してみると、main.shは最後まで処理されず、sub.shのところで処理が止まっていることがわかります。

# ./main.sh
sub

しかし、異常終了の場合はエラーメッセージを出力したり等、何らかの処理をしたいことは多々あります。
これは、下記のようにtrapを使うことで実現できます。

#!/bin/sh

set -e
trap 'echo NG' ERR

./sub.sh

echo OK
exit 0

trapは第一引数が異常終了時に実行する処理で、第二引数(それ以降)が対象の終了ステータスです。
(故に、終了ステータス0の正常終了でもtrapを使うことはできます)
そして、第二引数に指定されているERRは0以外の終了ステータスを表します。

実際に実行すると、trapで仕掛けた処理が実行されていることがわかります。

# ./main.sh
sub
NG

最後にsub.shを正常終了(exit 0)に戻して、正常終了時の振る舞いを確認します。

#!/bin/sh

echo sub
exit 0

実行するtrapの処理は行われず、最初に示したものと同様に、最後(echo OK)まで処理されていることが確認できます。

# ./main.sh
sub
OK

今までは、いつもif文で$?をチェックしていました。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら