シェルスクリプトに挑戦しよう(9)制御構文[その2]――caseによる条件分岐“応用力”をつけるためのLinux再入門(29)(1/2 ページ)

今回は、文字列のパターンで分岐する「case」を解説します。複数の条件で“Aなら〜する”、“Bなら〜する”、“Cなら〜する”のように処理を分けたい場合は、「if 〜 elif 〜 elif 〜……」で書くこともできますが、文字列のパターンで分岐する場合は「case」が便利です。

» 2018年11月21日 05時00分 公開
[西村めぐみ@IT]
「“応用力”をつけるためのLinux再入門」のインデックス

“応用力”をつけるためのLinux再入門

caseの基礎構文

 case文は以下のように書きます。「case」で始まり、「case」を逆から書いた「esac」で終わります。

case 文字列 in
  パターン1) 文字列がパターン1に該当したときのコマンド ;;
  パターン2) 文字列がパターン2に該当したときのコマンド ;;
  *) 文字列がどのパターンにも該当しなかったときのコマンド ;;
esac
▲case文の書き方

 分岐は「パターン) パターンに合致した場合の処理」のように書きます。パターンには「*」や「?」などの記号を使うことができます。

 パターンに合っているかどうかは、上から順番にチェックされます。1つ目のパターンに一致していれば、それ以降は処理されません。従って、最後に「*)」というパターンを置くことで、“全てに該当しなかった場合”という処理を書くことができます。

 「;;」は、「パターン) 処理」という組み合わせのリストの“区切り”を意味しています。従って、最後の「;;」は省略可能です。

 なお、「in」「)」「;;」の前後の改行は自由です。複数のコマンドを実行したい場合は、改行または「;」で区切ります。

caseを試してみる

 今回は「引数の内容に応じて処理を変える」という動作を試してみましょう。シェルスクリプトの中でキー入力を受け取る方法については、次回解説します。

 例えば、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
不明
▲YES、NOを表示するcase文(showyesno)
$ chomod +x showyesno
$ ./showyesno y
YES
OK
#(引数が「y」だったので「YES」と「OK」が表示された)
$ ./showyesno n
NO
#(引数が「n」だったので「NO」が表示された)
$ ./showyesno aaa
undefined
#(引数が「y」でも「n」でもないので「undefined」が表示された)
▲実行結果(showyesno)

●case文の改行ルール

 先ほどの例(showyesno)では、「in」「)」「;;」で改行していますが、ここの改行は自由です。例えば、それぞれのパターンを1行にするのであれば、以下のようになります。

 「"y")」のパターンでは実行するコマンドが2つあるので、「;」で区切っています。なお、最後の「;;」は省略可能です。

#! /bin/bash
case "$1" in
  "y") echo "YES"; echo "OK";;
  "n") echo "NO";;
  *) echo "undefined";;
esac
▲各パターンを1行にまとめてコンパクトにした場合(showyesnoを加工)

 さらに短く、1行に全てをまとめることもできます。この場合、esac直前の「;;」は省略できません。

#! /bin/bash
case "$1" in "y") echo "YES"; echo "OK";; "n") echo "NO";; *) echo "undefined";; esac
▲全てを1行にした場合(showyesnoを加工)

 case文全てを1行にするのはやや極端ですが、それぞれの処理が短く、内容が決まっているならば、ある程度まとめた方が読みやすくなるかもしれません。

 一方、これからコマンドを追加する、パターンを複雑にするなど、スクリプトの編集を考えている場合は、最初の書き方のように、パターンや各コマンドが独立した行になっている方が扱いやすいでしょう。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。