ひとり勉強ログ

ITエンジニアの勉強したことメモ

#06 制御構造-if-

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

書式

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

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

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

else

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

elif

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

if文の例

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

!/bin/bash

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

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

以下のように「yes」を引数に実行してみる。 [bash] $ ./if-yes.sh yes [/bash]

実行結果。 [bash] takasu clinic [/bash]

引数を何もつけずに実行する。 [bash] $ ./if-yes.sh [/bash]

実行結果。 [bash] no!no!no! [/bash]

「no」を引数に実行してみる。 [bash] $ ./if-yes.sh no [/bash]

[bash] no!no!no! [/bash]

終了ステータス

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

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

例として、「pwd」コマンドを実行して確認してみる。 [bash] $ pwd /home/minecraft/bin [/bash]

終了ステータスを表示してみる。 [bash] $ echo $? 0 [/bash]

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

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

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

!/bin/bash

ls / echo "exit status = $?"

ls ./dummy echo "exit status = $?" [/bash]

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

実行結果。 [bash] 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 [/bash]

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

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

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

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

!/bin/bash

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

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

[ "$1" = "yes" ] コマンドを単独で実行することで終了ステータスが確認できる。 [bash] $ [ "$1" = "yes" ] // コマンドを実行 $ echo $? // 終了ステータスを確認 1 // 終了ステータス「1」が表示される [/bash]

if文でgrepコマンドを実行

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

!/bin/bash

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

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