case文
case文は判定対象となる「値」と事前に作成した複数の「条件」を上から順に比較して、マッチした「条件」の「処理」を実行させることができます。
どの条件にもマッチしない場合は何も処理を実行しません。
cace文の書き方
処理を終了させるには「;;」セミコロンを2つ記述し、case文の終わりにはesac(caseの逆さま)と記述します。
case 値 in 条件1) 処理1 ;; 条件2) 処理2 ;; 条件3) 処理3 ;; esac
条件にマッチした場合に実行する処理は複数指定することもでき、処理が長くなる場合は改行して記述することもできます。
case 値 in
条件1)
処理1
;;
条件2)
処理2
;;
条件3)
処理3
処理4
処理5
;;
esac
どの条件にもマッチしなかった場合用の処理を指定する場合は、条件の最後に「*)」を設定するとどのパターンにも当てはまらない場合にこの条件が選択されます。
case 値 in
条件1)
処理1
;;
条件2)
処理2
;;
条件3)
処理3
;;
*) <---条件1~3に当てはまらない場合選択される
処理4
;;
esac
条件の指定について
条件の指定にはワイルドカードを使用することが出来ます。
| * | すべてにマッチ |
| ? | 何か1文字にマッチ |
| [ ] | []に囲まれた文字や数字等のどれかにマッチ |
| [! ] | []囲まれていない文字や数字等のどれかにマッチするのにマッチ |
| [ - ] | 「-」で設定された範囲の文字や数字にマッチ |
OR条件(どちらかにマッチ)を使用する場合は「 条件1 | 条件2 」といったように指定することで、複数の条件をまとめて指定することが出来ます。
「*」すべてにマッチ
「*」自体をマッチさせたい場合は「\*」「"*"」「'*'」といったようにエスケープします。
使用例
- * すべての文字列にマッチ(なんにでもマッチする)
- abc* 「abc」で始まる文字列にマッチ
- a*bc 「a」ではじまり「bc」で終わる文字列すべてにマッチ
「?」何か一文字にマッチ
「?」自体をマッチさせたい場合は「\?」「"?"」「'?'」といったようにエスケープします。
使用例
- ? 何か一文字にマッチ
- ??? 何か3文字の文字列にマッチ
- ???* 3文字以上の文字列にマッチ
- a?c 最初が「a」で始まり最後が「c」で終わる3文字の文字列にマッチ
[ ]に囲まれた文字や数字等のどれかにマッチ
使用例
- [Aa] 「A」か「a」にマッチ
- [Aa][Bb] 「AB」「Ab」「aB」「ab」にマッチ
[! ]に囲まれていない文字や数字等のどれかにマッチ
使用例
- [!Aa] 「A」と「a」以外にマッチ
[ - ]範囲指定
使用例
- [a-z] アルファベットの小文字にマッチ
- [A-Z] アルファベット大文字にマッチ
- [a-zA-Z] アルファベットの小文字と大文字にマッチ
- [0-9] 数字の「0」から「9」にマッチ
「 | 」OR条件
使用例
- ABC | abc 「ABC」か「abc」のどちらかにマッチ
- ABC | DEF | GHI 「ABC」「DEF」「GHI」のどれかにマッチ
サンプル
入力したキーによって、アルファベット、数字、その他の判別を行いメッセージを表示します。
#!/bin/bash
echo 'Please input alphabet or number'
read key
case "$key" in
[a-zA-Z]) echo 'Alphabet entered' ;;
[0-9]) echo 'Number entered' ;;
*) echo 'No alphabet or number enterd' ;;
esac
「T」を入力すると[a-zA-Z]の条件にマッチするので、「Alphabet entered」と表示されます。
$ sh case1.sh Please input alphabet or number T Alphabet entered
「0」を入力すると[0-9]の条件にマッチするので、「Number entered」と表示されます。
$ sh case1.sh Please input alphabet or number 0 Number entered
アルファベットと数字以外である「!」を入力すると「*」の条件にマッチするので、「No alphabet or number enterd」と表示されます。
$ sh case1.sh Please input alphabet or number ! No alphabet or number enterd
コメント
初めまして。
シェルスクリプト、勉強させていただきます。
師子乃さん
コメントありがとうございます。
何かお役に立てたのなら幸いです。