ファイヤープロジェクト
case文
2003-07-20T15:13+09:00   matsu
BASHスクリプトにはswitch文に相当するのとしてcase文がある
あのswitch文に相当する.case文はスクリプトではよく使用されるようだ.
grep -l case /etc/init.d/*
としたら,私のシステムでは51個中43個のスクリプトがマッチした.これらのスクリプトでは大抵オプション指定を調べるのに使用される.case文の構文を以下に示す.
case 変数 in
パターン) 文(複数可) ;;
パターン) 文(複数可) ;;
パターン) 文(複数可) ;;
.....
パターン) 文(複数可) ;;
esac
case文では変数の値とマッチするパターンを見付け(ベストマッチではなくファーストマッチつまり最初にマッチしたものを採用),そのマッチしたパターンに続く文を実行する.文は複数記述でき,それらは他の文と;,&&,||,|,改行でつなぐ.で,文の最後に;;を記述して,次のパターンの記述を続ける.パターンは|でor連結ができ,さらに[]の展開やワイルドカード*を使用できる.以下に例を示す.
case "$x" in
"hoge") echo hoge ;;
"hoge" | "HOGE") echo hogeHOGE;;
[Hh][Oo][Gg][Ee]) echo hOGe;;
"hoge"*) echo hogefuga;;
*) echo No match!!;;
esac
変数xがhogeだった場合
最初のパターンとマッチするのでhogeと出力する.この場合全てのパターンにもマッチするが,最初にマッチするパターンの文だけを実行する(echo hogeHOGE等は実行されない).
変数xがhogeまたは(|)HOGEだった場合
二番目のパターンとマッチするのでHOGEと出力する.この場合,三番目のパターンにもマッチするが,無視される.二番目のパターンはhogeまたはHOGEにマッチする(上記のようにhogeとのマッチは一番目のパターンに持って行かれるが).
変数xがhOGeとか,hogEなどのようにhogeのうち,0文字以上四文字以下が大文字の場合
三番目のパターンとマッチするのでhOGeと出力する(上記のようにhogeとHOGEは先の二つのパターンに持って行かれる).[]が展開されて,[Hh][Oo][Gg][Ee]がHogeとかHOgEなどとマッチしている.
変数xがhogeに0文字以上付加した場合
四番目のパターンにマッチするのでhogefugaと出力する(hogeは最初のパターンに持って行かれる).
デフォルト
五番目のパターンには必ずマッチする.これはスクリプトのパラメータチェックでよく使われる技(?).この例では上記四つのどのパターンにもマッチしなかった場合の処理としてNo match!!と出力する.
デフォルトのパターンにマッチした場合,大抵は予期しない値が変数に入っている(というか,特に理由がなければ予期している値はどこかのエントリに書いておくべきだと思う).で,予期しない値を渡された場合は終了する,というスクリプトの場合は,exit 1として再利用性を高めることを忘れない.
matsu(C)
Since 2002
Mail to matsu