
新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設定ミスなど |
| 130 | Ctrl + C による中断 | ユーザー操作で中止 |
💬 特に 126 や 127 は、スクリプトの実行ミスを調べるときによく見かけます。
✅ まとめ
- 終了ステータス(Exit Status)は、コマンドの実行結果を表す数値。
- $? は「直前のコマンドの終了コード」を示す特殊変数。
- 0 は成功、0以外 は失敗。
- スクリプト内で exit [番号] により終了コードを設定できる。
- if文で $? を活用すれば、エラー検出や処理分岐が可能。
💬 $? を使いこなすことで、スクリプトに「判断力」を持たせられます。
次のステップでは、論理演算子(&& と ||)を使ったスマートな条件実行にも挑戦してみましょう!
