新Linux入門|シェルスクリプトの終了ステータスと$?の仕組み

 シェルスクリプトを書いていると、「コマンドが成功したのか」「失敗したのか」を判断して処理を分けたいときがあります。
そんなときに欠かせないのが、終了ステータス(Exit Status)特殊変数 $? です。

シェルでは、すべてのコマンド実行後に数値で結果が返される仕組みになっています。
この数値によって「成功(0)」か「失敗(0以外)」かを判断できるのです。

⚙️ 終了ステータスとは?

 コマンドやシェルスクリプトが実行されたとき、内部的には「終了コード(Exit Status)」という数値が返されます。
これはシェルに「正常に完了したか」「エラーが起きたか」を伝えるための信号のようなものです。

意味
0コマンドが正常に実行された(成功)
1〜255何らかのエラーが発生した(失敗)

📘 例

[suzuki@AlmaLinux ~]$ ls
Desktop  Documents  Downloads
[suzuki@AlmaLinux ~]$ echo $?
0

💬 ls コマンドが正常に実行されたため、終了ステータスは 0(成功)になっています。

🧩 特殊変数 $? の役割

$? は 「直前に実行されたコマンドの終了ステータス」 を保持する特殊変数です。
コマンドを1つ実行するたびに $? の値も更新されます。

📘 例

[suzuki@AlmaLinux ~]$ mkdir test_dir
[suzuki@AlmaLinux ~]$ echo $?
0

💬 mkdir が成功 → $? は 0。
失敗する例を見てみましょう。

[suzuki@AlmaLinux ~]$ mkdir /root/test_dir
mkdir: ディレクトリ '/root/test_dir' を作成できません: 許可がありません
[suzuki@AlmaLinux ~]$ echo $?
1

💬 root権限がないためエラーとなり、終了ステータスは 1 (0以外)になります。

💥 エラー発生時の終了ステータスの確認(例:script1.sh)

終了ステータスは、スクリプト内でも条件分岐に利用できます。
次のシェルスクリプトを見てみましょう。

📘 script1.sh

#!/bin/bash

ls non-existent-file
if [ $? -ne 0 ]; then
    echo "ls コマンドがエラーを返しました。"
fi

💬 non-existent-file は存在しないファイルです。
これを実行すると以下のように表示されます。

📗 実行結果

[suzuki@AlmaLinux ~]$ bash script1.sh
ls: 'non-existent-file' にアクセスできません: そのようなファイルやディレクトリはありません
ls コマンドがエラーを返しました。

ここでの動作を整理すると

コマンド結果$? の値
ls non-existent-fileファイルが存在しないためエラー2(非0)
if [ $? -ne 0 ]条件が真(エラー)なのでメッセージ出力

💬 つまり、0以外の終了コードは失敗を意味し、if文などで簡単にエラーハンドリングできるのです。

🔍 終了ステータスを使った条件分岐(例:grep)

次に、ファイル内検索を行う grep コマンドを使った実例を見てみましょう。

📘 script2.sh

#!/bin/bash

grep "pattern" file.txt
if [ $? -eq 0 ]; then
    echo "ファイル内にパターンが見つかりました。"
else
    echo "パターンは見つかりませんでした。"
fi

📗 実行例

[suzuki@AlmaLinux ~]$ bash script2.sh
パターンは見つかりませんでした。

💬 grep は「検索結果があったかどうか」で終了コードを返します。

grepの結果終了ステータス意味
一致あり0成功(見つかった)
一致なし1失敗(見つからなかった)
エラー2検索エラー(ファイルなどの問題)

🧱 カスタム終了ステータスを設定する

シェルスクリプト内で、自分で終了ステータスを設定することもできます。
そのときに使うのが exit コマンド です。

📘 書式

exit [ステータス番号]

📘 例

#!/bin/bash
echo "何か問題が発生しました。"
exit 1

📗 実行結果

[suzuki@AlmaLinux ~]$ bash myscript.sh
何か問題が発生しました。
[suzuki@AlmaLinux ~]$ echo $?
1

💬 exit 1 によって、スクリプトの終了ステータスを明示的に設定できます。

📊 よく使われる終了ステータスの目安

終了コード意味使用例
0成功コマンド実行成功
1一般的なエラーファイルが存在しないなど
2誤った使い方不正なオプション指定など
126実行権限がないスクリプトに権限なし
127コマンドが見つからないPATH設定ミスなど
130Ctrl + C による中断ユーザー操作で中止

💬 特に 126 や 127 は、スクリプトの実行ミスを調べるときによく見かけます。

✅ まとめ

  • 終了ステータス(Exit Status)は、コマンドの実行結果を表す数値。
  • $? は「直前のコマンドの終了コード」を示す特殊変数。
  • 0 は成功、0以外 は失敗。
  • スクリプト内で exit [番号] により終了コードを設定できる。
  • if文で $? を活用すれば、エラー検出や処理分岐が可能。

💬 $? を使いこなすことで、スクリプトに「判断力」を持たせられます。
次のステップでは、論理演算子(&& と ||)を使ったスマートな条件実行にも挑戦してみましょう!