case - 複数の条件分岐を行う

case

caseコマンドはある文字列に対して、パターンマッチを行っていき、コマンドの処理を分岐できます。

ファイルの拡張子によってコマンドの実行を分けたい場合やそれぞれ特定のファイル名ごとに処理の実行を分けたい場合に利用できます。

スポンサーリンク

caseの構文

caseコマンドの基本的な構文

シェルスクリプトでよく見る形は以下の通りです。

'*'のパターンは任意の文字列に当てはまるパターンになります。

また、patternはカッコで囲むこともできます。

パターンマッチで用いる特殊な文字には以下のようなものがあります。

パターンマッチで用いる特殊な文字

記号意味
*0文字以上の任意の文字列
?任意の一文字
[]カッコ内の文字の一文字
例) [abc], [a-z] 等
[:class:]文字クラスに当てはまる一文字
例)[:alnum:], [:blank:] 等

caseコマンドの利用例

caseコマンドはコマンドの処理を分岐できます。文字列に対して、パターンマッチを行い、最初にパターンマッチに成功した処理を行います。基本的に"case"の後に変数を記述し、"in"の後に文字列パターンと処理を列挙し、"easc"で終了します。

処理は";;"または";&"または";;&"で区切っていきます。";&"や";;&"はパターンマッチした後でもcaseコマンドの処理を終了せずに続けて条件を無視したコマンドの処理やパターンマッチを行った処理を行うことができます。詳しくは次の段落で後述します。

複数のパターンで処理が同じ場合は"|"を利用することで複数のパターンを記述できます。

case.sh

list.txt

実行結果

当てはまったパターンの後に別のパターンを実行

パターンマッチに成功した後に別のパターンについても条件が合うかどうかを判定したいときは処理の区切り文字に";;"ではなく、";&"や";;&"を用います。

";&"は条件を無視して次のパターンの処理を行います。
";;&"は次以降のパターンマッチも行い、マッチングするならばコマンドの処理を行います。

以下のスクリプトは読み込まれた単語に対してどの母音が含まれているかを表示します。

case_vowel.sh

item.txt

実行結果

";&"を用いると次のパターンの条件を無視して処理が実行されます。

case2.sh

item2.txt

実行結果

caseコマンドの処理の区切り文字を変更すると微妙に動作が変わることも覚えておくとよいでしょう。

参考

GNU Bash manual

スポンサーリンク