シェルスクリプトで例外処理(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文で$?をチェックしていました。