#06 制御構造-if-

ifは条件を評価し、その真偽に応じて処理を分岐する機能をもつ。

書式

if [ コマンド1 ]; then
  [ コマンド1 ]の結果が真である場合の処理
elif [ コマンド2 ]; then
  [ コマンド2 ]の結果が真である場合の処理
elif [ コマンド3 ]; then
  [ コマンド3 ]の結果が真である場合の処理
  ・・・ elifでの分岐はいくつでも追加可能
else
  上記すべてのコマンド結果が偽である場合の処理
fi

ifの後にはコマンドを記述

多くのプログラムではifの後は条件式が記述されるが、シェルスクリプトではコマンドが置かれる。
コマンドの結果を順に判断してき、最後にfiで閉じて終了する。

else

コマンドの結果が偽の場合に実行される。

elif

追加の条件を指定する。必要に応じていくらでも追加することができる。

if文の例

Vimで「if-yes.sh」というファイル名を作成、以下を記述、実行権限を付与する。

#!/bin/bash

if [ "$1" = "yes" ]; then
  echo "takasu clinic"
else
  echo "no!no!no!"
fi

「$1」はコマンドライン引数の値。
「if-yes.sh」を実行した際の最初の引数が「yes」という文字列だったら「takasu clinic」と表示され、それ以外だったら「no!no!no!」と表示される。

以下のように「yes」を引数に実行してみる。

$ ./if-yes.sh yes

実行結果。

takasu clinic

引数を何もつけずに実行する。

$ ./if-yes.sh

実行結果。

no!no!no!

「no」を引数に実行してみる。

$ ./if-yes.sh no
no!no!no!

終了ステータス

コマンドは、すべて実行時に終了ステータスと呼ばれる整数値を返している。
この整数値は「$?」というシェル変数で参照することができる。

コマンドが正常に終了した場合の終了ステータスは「0」、エラー時には「1」となる。

例として、「pwd」コマンドを実行して確認してみる。

$ pwd
/home/minecraft/bin

終了ステータスを表示してみる。

$ echo $?
0

コマンドは正常に終了しているため、「0」を返す。

終了ステータスを取得する例

Vimで「exit-status.sh」というファイル名を作成、以下を記述、実行権限を付与する。

#!/bin/bash

ls /
echo "exit status = $?"

ls ./dummy
echo "exit status = $?"

ルートディレクトリで「ls」コマンドを実行
→終了ステータスを表示
「dummy」ディレクトリ内(※存在しないディレクトリ)で「ls」コマンドを実行
→終了ステータスを表示

実行結果。

bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
exit status = 0
ls: ./dummy にアクセスできません: そのようなファイルやディレクトリはありません
exit status = 2

「ls /」コマンドは正常に実行され、終了ステータスとして「0」が返されている。
「ls ./dummy」コマンドでは存在しないディレクトリを指定しているため、エラーとなり終了ステータスとして「2」が返される。

終了ステータス「2」は「指定されたファイルにアクセスできなかった」という意味。

ifは終了ステータスで判断している

「if-yes.sh」ファイルを再度見てみる。

#!/bin/bash

if [ "$1" = "yes" ]; then
  echo "takasu clinic"
else
  echo "no!no!no!"
fi

ifの後の [ “$1” = “yes” ] コマンドが実行される
→ コマンドの終了ステータスを確認
終了ステータスが「0」の場合:if 文中のコマンド「echo “takasu clinic”」を実行
終了ステータスが「1」の場合:else 文中のコマンド「echo “no!no!no!”」を実行

[ “$1” = “yes” ] コマンドを単独で実行することで終了ステータスが確認できる。

$ [ "$1" = "yes" ]  // コマンドを実行
$ echo $?  // 終了ステータスを確認
1 // 終了ステータス「1」が表示される

if文でgrepコマンドを実行

if文では任意のコマンドを実行することも可能。
Vimで「if-grep.sh」というファイル名を作成、以下を記述、実行権限を付与する。

#!/bin/bash

if grep -q 'minecraft' /etc/passwd; then
    echo 'found!'
fi

「grep」コマンドはパターンにマッチした場合のみ終了ステータスとして「0」を返す。
「/etc/passwd」ファイルに「minecraft」という文字列がマッチしたため「0」を返し、「found!」が表示される。
※今回は「minecraft」というユーザーが存在しているため「0」を返す。

シェルスクリプト の一覧