このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

新Linuxコマンド演習36

新Linuxコマンド演習36 概要

新Linuxコマンド演習36」では、終了ステータス(exit status) の仕組みを学びます。
Linuxのすべてのコマンドは、実行結果を示す終了ステータスを返します。
これは「コマンドが正常に実行されたか」「エラーが発生したか」を判断する重要な情報であり、
条件分岐(if文)エラーハンドリング において欠かせない概念です。

この演習では、終了ステータスの基本的な確認方法から、
シェルスクリプトでの実用的な活用例(if文との組み合わせ)までを段階的に学びます。

終了ステータスとは

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

表の説明
すべてのLinuxコマンドは終了時に必ず数値(0〜255)を返します。
この値を $? で確認することができます。
0 は成功を意味し、0以外 は失敗を意味します。
ただし、コマンドやエラーの内容によって、返される非0の値は異なります。

演習問題+模範解答例

演習01:終了ステータスを確認する

問題
lsコマンドを実行して成功・失敗時の終了ステータスを確認してください。

模範解答例

[suzuki@AlmaLinux ~]$ ls
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos
[suzuki@AlmaLinux ~]$ echo $?
0

解説

  • コマンド実行後に echo $? と入力すると、直前のコマンドの終了ステータスが表示されます。
  • ここでは ls が正常に動作したため 0 が返されました。

次に、エラーを起こしてみます。

[suzuki@AlmaLinux ~]$ ls aaa
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません
[suzuki@AlmaLinux ~]$ echo $?
2

解説

  • 存在しないファイルを指定したため、エラーとなり終了ステータスが「2」になりました。
  • なお、エラー内容によって返される数値は異なります。

演習02:エラーメッセージを表示するスクリプトを作成する

問題
 lsコマンドのエラーを検知して、メッセージを表示するシェルスクリプト script1.sh を作成・実行してください。

模範解答例

[suzuki@AlmaLinux ~]$ nano script1.sh

以下の内容を入力して保存します。

#!/bin/bash

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

ファイルが存在しない状態で実行します。

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

解説

  • $? は直前のコマンド(ls)の終了ステータスを取得します。
  • -ne は「not equal(等しくない)」という比較演算子です。
  • 終了ステータスが 0以外 の場合にメッセージを表示します。

次に、ファイルを作成して再実行します。

[suzuki@AlmaLinux ~]$ date > file1.txt
[suzuki@AlmaLinux ~]$ bash script1.sh 
file1.txt

解説

  • ファイルが存在するため ls コマンドは成功し、終了ステータスは 0 となります。
  • そのためエラーメッセージは表示されません。

演習03:終了ステータスを利用して条件分岐を行う

問題
 grepコマンドの終了ステータスを利用して、ファイル内に文字列が存在するかどうかを判定するシェルスクリプトを作成してください。

模範解答例

[suzuki@AlmaLinux ~]$ nano script2.sh

以下の内容を入力して保存します。

#!/bin/bash

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

まず、文字列 “pen” を含むファイルを作成して実行します。

[suzuki@AlmaLinux ~]$ echo "This is a pen." > file2.txt
[suzuki@AlmaLinux ~]$ bash script2.sh
This is a pen.
ファイル内にパターンが見つかりました。

解説

  • grep が検索文字列を見つけると終了ステータス 0 を返します。
  • そのため -eq 0 の条件が真となり、「見つかりました。」と表示されます。

次に、文字列が存在しない場合を確認します。

[suzuki@AlmaLinux ~]$ echo "This is an eraser." > file2.txt
[suzuki@AlmaLinux ~]$ bash script2.sh
パターンは見つかりませんでした。

解説

  • grep がパターンを見つけられないと終了ステータス 1 を返します。
  • その結果、else文が実行されます。

演習終了時の作業

問題
演習で作成したファイルを削除してください。

模範解答例

[suzuki@AlmaLinux ~]$ rm script* file*
[suzuki@AlmaLinux ~]$ ls
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos

まとめ

新Linuxコマンド演習36」では、

  • コマンドの実行結果を数値で表す 終了ステータス の概念
  • $? を使った直前コマンドの結果確認
  • if 文と組み合わせた エラーハンドリング の実装方法

を学びました。

 終了ステータスを理解することで、シェルスクリプトの信頼性や保守性を大きく向上させることができます。