server-memo.net

【シェルスクリプト】(条件分岐)case文

   

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

 - シェルスクリプト