シェルスクリプトでコマンドの戻り値を判定する方法

目次

スポンサードリンク

終了ステータスが格納される変数 $?

シェルスクリプトでは、コマンドの終了ステータスを $? 変数を使用して判定することができます。$? には直前に実行したコマンドの終了ステータスが入ります。

終了ステータスは、一般的に 0であれば正常終了、それ以外の場合はエラーとする慣習があります。これは、シェル内蔵コマンドの場合なので、外部プログラムの場合はそのプログラムの仕様を確認する必要がある点は注意が必要です。

Bashのシェル内蔵コマンドの場合は以下の終了ステータスが予約されています。

  • 1   一般的なエラー
  • 126  コマンドの実行権限がなかった
  • 127  コマンドが見つからなかった
  • 128  exit に不正な値を渡した(例えば浮動小数点数)
  • 128+n シグナル n で終了
  • 255  範囲外の終了ステータス

以下は コマンドをタイプミスした結果、終了ステータスが127になる例です

[root@hostname sbin]# lo
-bash: lo: command not found
[root@hostname sbin]# echo $?
127

戻り値 によって処理を分岐する方法

戻り値によって処理を分岐させたい場合は、test コマンドで処理を分岐させます。$?を直接条件に指定することもできますが、test コマンド自体の終了ステータスで $? が上書きされてしまうことがあるため、変数に格納しておくと安全です。

以下は 実行したコマンドが正常終了したか否かで処理を分岐するサンプルコードです。

#!/bin/bash

# 戻り値を判定したい処理を実行
command

# 戻り値の上書きを防ぐため変数に格納する
rc=$?

if [ $rc -ne 0 ]; then
    # エラーメッセージを出力
    echo "コマンド「command」の実行中にエラーが発生しました。"

    exit 1
fi

# 正常終了時の処理
echo “正常終了した時の処理”

exit 0


シェルスクリプトの知識は、プログラマにとって長く役立つ知識です。 私はこちらの書籍で一通り知識を抑えました。基本から丁寧に解説されています。

最短3時間で覚えるLinuxシェルスクリプト
こちらは、シェルスクリプトの基本的な書き方、デバッグ方法、if, case, while, forなど基本的な制御構文について書かれています。30日間の無料体験もできる『Kindle Unlimited』でも読むことができます。

Linuxコマンドについて徹底的に学べるUdemy講座
もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 icon