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
コメント
初めまして。
シェルスクリプト、勉強させていただきます。
師子乃さん
コメントありがとうございます。
何かお役に立てたのなら幸いです。