シェルスクリプトを作成する際、処理が正常に終了したかどうかを判定することは重要です。エラーが発生しても処理を継続してしまうと、想定外の結果につながる可能性があります。
本記事では、シェルスクリプトの終了コードと、if 文を使ったエラー処理の方法を解説します。
1. 終了コードとは
終了コードとは、コマンドやスクリプトの実行結果を数値で表したものです。
一般的に、次のように扱います。
| 終了コード | 意味 |
|---|---|
0 | 正常終了 |
0 以外 | 異常終了、または何らかのエラー |
終了コードは、特殊変数 $? で取得できます。
ls /tmp
echo $?
ls /tmp が正常に実行された場合、終了コードとして 0 が表示されます。
存在しないディレクトリを指定した場合は、通常、0 以外の値が表示されます。
ls /not_found_directory
echo $?
2. if文を使ったエラー処理
コマンドの終了コードを確認するには、if 文を使用できます。
以下は、ディレクトリの存在を確認する例です。
#!/bin/bash
if ls /not_found_directory
then
echo "処理が成功しました"
else
echo "処理に失敗しました"
fi
実行結果の例は次のとおりです。
ls: cannot access '/not_found_directory': No such file or directory
処理に失敗しました
if 文では、コマンドが正常終了した場合に then の処理を実行し、失敗した場合に else の処理を実行します。
なお、ディレクトリの存在確認が目的であれば、ls よりも test -d や [ -d パス ] を使用する方法が適切です。
3. 終了コードを使って処理を終了する
エラーが発生した場合、後続処理を実行せずにスクリプトを終了させたいことがあります。
その場合は、exit コマンドを使用します。
#!/bin/bash
if [ ! -d "/not_found_directory" ]
then
echo "エラー:ディレクトリが存在しません"
exit 1
fi
echo "後続処理を実行します"
実行結果は次のとおりです。
エラー:ディレクトリが存在しません
ディレクトリが存在しないため、exit 1 が実行され、スクリプトは終了します。
exit 0 は正常終了、exit 1 などの 0 以外の値は異常終了を表すために使用されます。
4. コマンドの終了コードを確認する際の注意点
$? は、直前に実行したコマンドの終了コードを保持します。そのため、確認する前に別のコマンドを実行すると、取得したい終了コードが変わる場合があります。
例えば、次のコードでは注意が必要です。
ls /not_found_directory
echo "処理を確認します"
echo $?
最後の echo $? で取得できるのは、ls ではなく、直前の echo の終了コードとなります。
終了コードを確認する場合は、次のように記述します。
ls /not_found_directory
result=$?
echo "終了コード:$result"
または、if 文で直接判定します。
if ls /not_found_directory
then
echo "成功"
else
echo "失敗"
fi
まとめ
シェルスクリプトのエラー処理では、次のポイントを押さえることが重要です。
$?で直前のコマンドの終了コードを取得できます。if文を使用すると、コマンドの成功・失敗に応じて処理を分岐できます。exitを使用すると、終了コードを指定してスクリプトを終了できます。- エラー発生時に後続処理を実行しないようにすることで、想定外の動作を防止できます。
これらの方法を活用し、エラー発生時にも適切に動作するシェルスクリプトを作成しましょう。
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK