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

Linuxコマンド演習36

以下のコマンドの演習を行います。

実際にコマンド操作を行いながら、Linuxの操作に慣れていきましょう。

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

・lsコマンドを実行します。

どんなコマンドでもよいのですが、ここでは、lsコマンドを実行します。

$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

lsコマンドは、成功したので、ディレクトリの一覧が表示されます。

$?変数を使用して、直前のコマンドの終了ステータスを取得します。

$ echo $?
0

1つ前に実行したコマンドが成功しているため、「0」がechoコマンドで出力されます。

・lsコマンドでファイルが見つからないというエラーを起こしてコマンドを失敗させます。

$ ls aaa
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません

・再度、$?変数を使用して、直前のコマンドの終了ステータスを取得します。

$ echo $?
2        # 0以外の数値が出力されている

 lsコマンドでファイルが見つからないというエラーを起こしているため、終了ステータスが「2」となっています。今回は「2」が出力されていますが、コマンドの失敗が、いつも「2」であるとは限りません。

演習02:エラーメッセージを表示するシェルスクリプトを実行する。

・エラーメッセージを表示するシェルスクリプト「script1.sh」を作成します。

「vi script1.sh」と入力します。

 viエディタで「i」キーを押して、挿入モードにして下記のスクリプト内容をコピーして貼り付けて保存します。

 viエディタで保存して終了するには、「Esc」キーを押してコマンドモードにして「:wq」と入力します。

#!/bin/bash

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

「file1.txt」というファイルはありません。

・シェルスクリプト「script1.sh」を実行します。

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

 シェルスクリプト内の「ls file1.txt」でエラーが発生します。ここで、0以外の終了ステータスを返します。if文直前のlsコマンドにエラーが発生したため、「ls コマンドがエラーを返しました。」と表示します。

・「file1.txt」を作成してから、シェルスクリプト「script1.sh」を実行します。

$ date > file1.txt
$ bash script1.sh 
file1.txt

シェルスクリプト内でエラーが発生しないため、エラーメッセージが表示されません。

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

終了ステータスを利用して条件分岐やエラーハンドリングを実装することができます。

・シェルスクリプト「script2.sh」を作成します。

「vi script2.sh」と入力します。

 viエディタで「i」キーを押して、挿入モードにして下記のスクリプト内容をコピーして貼り付けて保存します。

 viエディタで保存して終了するには、「Esc」キーを押してコマンドモードにして「:wq」と入力します。

#!/bin/bash

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

grepコマンドはファイル中の文字列を検索するコマンドです。

 このシェルスクリプトは「file2.txt」に “pen” という文字列が含まれる場合、「ファイル内にパターンが見つかりました。」と表示し、文字列が含まれない場合、「パターンは見つかりませんでした。」と表示します。

・「file2.txt」を作成します。

$ echo "This is a pen." > file2.txt

・シェルスクリプト「script2.sh」を実行します。

$ bash script2.sh 
This is a pen.
ファイル内にパターンが見つかりました。

 if文直前のgrepコマンドが成功したため、終了ステータスが「0」となり、「ファイル内にパターンが見つかりました。」と表示されます。

・「file2.txt」の内容を変更します。

$ echo "This is an eraser." > file2.txt

・再度、シェルスクリプト「script2.sh」を実行します。

$ bash script2.sh 
パターンは見つかりませんでした。

 今度は、if文直前のgrepコマンドが失敗するため、終了ステータスが「0」以外の値となり、「パターンは見つかりませんでした。」と表示されます。

演習終了時の作業:ファイルの削除

・この演習で作成したファイルを削除します。

$ rm script1.sh
$ rm script2.sh
$ rm file1.txt 
$ rm file2.txt