このページで解説している内容は、以下の 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