今回は、文字列のパターンで分岐する「case」を解説します。複数の条件で“Aなら~する”、“Bなら~する”、“Cなら~する”のように処理を分けたい場合は、「if ~ elif ~ elif ~……」で書くこともできますが、文字列のパターンで分岐する場合は「case」が便利です。
case文は以下のように書きます。「case」で始まり、「case」を逆から書いた「esac」で終わります。
- case 文字列 in
- パターン1) 文字列がパターン1に該当したときのコマンド ;;
- パターン2) 文字列がパターン2に該当したときのコマンド ;;
- *) 文字列がどのパターンにも該当しなかったときのコマンド ;;
- esac
分岐は「パターン) パターンに合致した場合の処理」のように書きます。パターンには「*」や「?」などの記号を使うことができます。
パターンに合っているかどうかは、上から順番にチェックされます。1つ目のパターンに一致していれば、それ以降は処理されません。従って、最後に「*)」というパターンを置くことで、“全てに該当しなかった場合”という処理を書くことができます。
「;;」は、「パターン) 処理」という組み合わせのリストの“区切り”を意味しています。従って、最後の「;;」は省略可能です。
なお、「in」「)」「;;」の前後の改行は自由です。複数のコマンドを実行したい場合は、改行または「;」で区切ります。
今回は「引数の内容に応じて処理を変える」という動作を試してみましょう。シェルスクリプトの中でキー入力を受け取る方法については、次回解説します。
例えば、1つ目の引数が「y」なら「echo "YES"」と「echo "OK"」の2つを実行し、「n」なら「echo "NO"」を実行、それ以外なら「echo "undefined"」を実行するとしてみましょう。次のようになります。
なお、文字列である「"y"」と「"n"」の引用符(")は省略可能です。最後の「*」はパターンとして指定しているので、引用符を付けない点に注意してください。
- #! /bin/bash
- case "$1" in
- "y")
- echo "YES"
- echo "OK"
- ;;
- "n")
- echo "NO"
- ;;
- *)
- echo "undefined";;
- esac
- 不明
- $ chomod +x showyesno
- $ ./showyesno y
- YES
- OK
- #(引数が「y」だったので「YES」と「OK」が表示された)
- $ ./showyesno n
- NO
- #(引数が「n」だったので「NO」が表示された)
- $ ./showyesno aaa
- undefined
- #(引数が「y」でも「n」でもないので「undefined」が表示された)
先ほどの例(showyesno)では、「in」「)」「;;」で改行していますが、ここの改行は自由です。例えば、それぞれのパターンを1行にするのであれば、以下のようになります。
「"y")」のパターンでは実行するコマンドが2つあるので、「;」で区切っています。なお、最後の「;;」は省略可能です。
- #! /bin/bash
- case "$1" in
- "y") echo "YES"; echo "OK";;
- "n") echo "NO";;
- *) echo "undefined";;
- esac
さらに短く、1行に全てをまとめることもできます。この場合、esac直前の「;;」は省略できません。
- #! /bin/bash
- case "$1" in "y") echo "YES"; echo "OK";; "n") echo "NO";; *) echo "undefined";; esac
case文全てを1行にするのはやや極端ですが、それぞれの処理が短く、内容が決まっているならば、ある程度まとめた方が読みやすくなるかもしれません。
一方、これからコマンドを追加する、パターンを複雑にするなど、スクリプトの編集を考えている場合は、最初の書き方のように、パターンや各コマンドが独立した行になっている方が扱いやすいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.
Linux & OSS 記事ランキング