【bashでパターンマッチング】case in .. esca文の使い方

シェル/bash

bashのcase文について知りたい人
「bashでパターンマッチング処理をしたいです。case文はどのように使うのでしょう?」

こんな疑問に答えます。

この記事を書いている私はIT業界歴12年、年収1,000万円ちょっとの金融系エンジニアです。IRIXやSolarisなどのUnixやCygwin、mac、Linuxなど様々な環境でbashによるスクリプティングを行ってきました。

bashは極めて簡単なプログラミング言語ですが、空白の有無などで構文エラーとなること、javaなど一般的なプログラミング言語に慣れている方にとっては直感的ではない構文であることから、忘れてしまうことも多いかと思います。

また本記事では、細かい構文に迷ったら、例からコピー&ペーストして使えることも目指しました。少しでもお役に立てますと幸いです。

本記事の内容

case文の構文

case 値 in
  パターン1 ) 《パターン1の処理》;;
  パターン2 ) 《パターン2の処理》;;
  パターン3 ) 《パターン3の処理》;;
 ・・・
esac

複数コマンドを実行する構文

複数のコマンドを実行するには、以下のように書くことができます。

case 値 in
  パターン1 )
  《パターン1の処理1》
  《パターン1の処理2》
  《パターン1の処理3》
  ;;
  パターン2 )
  《パターン2の処理1》
  《パターン2の処理2》;;
  パターン3 ) 《パターン3の処理1》
  《パターン3の処理2》;;
  ・・・
esac

case文の使用例

文字列のマッチング

文字列のマッチング

str="pattern1"
case $str in
 "pattern1" ) echo "パターン1と一致しました" ;;
 "pattern2" ) echo "パターン2と一致しました" ;;
 "pattern3" ) echo "パターン3と一致しました" ;;
esac

実行結果は以下の通りです。
[実行結果]

パターン1と一致しました

数字のマッチング

数字のマッチング

declare -i num=1
case $num in
 1 ) echo "パターン1と一致しました" ;;
 2 ) echo "パターン2と一致しました" ;;
 3 ) echo "パターン3と一致しました" ;;
esac

実行結果は以下の通りです。
[実行結果]

パターン1と一致しました

ワイルドカードを使ったマッチング

以下の3種類のワイルドカードを使ったマッチングについて解説します。

  • *をつかったマッチング
  • ?をつかったマッチング
  • [パターン]を使ったマッチング

*をつかったマッチング

*をつかったマッチング

declare -i num=999
case $num in
 1 ) echo "パターン1と一致しました" ;;
 2 ) echo "パターン2と一致しました" ;;
 3 ) echo "パターン3と一致しました" ;;
 * ) echo "どのパターンにも一致しませんでした" ;;
esac

実行結果は以下の通りです。
[実行結果]

どのパターンにも一致しませんでした

?をつかったマッチング

?をつかったマッチング

declare -i num=8
case $num in
 1 ) echo "パターン1と一致しました" ;;
 2 ) echo "パターン2と一致しました" ;;
 3 ) echo "パターン3と一致しました" ;;
 ? ) echo "0または4から9の数字が入力されました" ;;
 * ) echo "どのパターンにも一致しませんでした" ;;
esac

実行結果は以下の通りです。
[実行結果]

0または4から9の数字が入力されました

[パターン]を使ったマッチング

[パターン]を用いれば、範囲指定してマッチすることができます。

declare -i num=8
case $num in
 [0-9] ) echo "パターン[0-9]と一致しました" ;;
 * ) echo "どのパターンにも一致しませんでした" ;;
esac

実行結果は以下の通りです。
[実行結果]

パターン[0-9]と一致しました

今回は以上です。お役に立ちましたら幸いです。

人気記事【今年の抱負】退職しオープン&フリー&シンプルに生きていく【失敗しない働き方改革の本質】