条件分岐 ~ case での分岐

case ~ 完全一致

code
case 'apple' in
  app)
    echo 'app' ;;
  Apple)
    echo 'Apple' ;;
  apple)
    echo 'apple' ;;
esac
stdout
apple

case ~ パターンマッチ

パターン説明
* すべてにマッチする
? 任意の1文字にマッチする
[AB] A か B の文字にマッチする(A, B は任意の文字)
[!AB] A か B 以外の文字にマッチする(A, B は任意の文字)
[A-Z] A ~ Z の文字にマッチする(A, Z は任意の文字)
[!A-Z] A ~ Z 以外の文字にマッチする(A, Z は任意の文字)
A | B A か B の文字列にマッチする(A, B は任意の文字列)
code
case 'apple' in
  a*)
    echo 'a*' ;;
  *)
    echo '*' ;;
esac
stdout
a*
code
case 'apple' in
  b*)
    echo 'b*' ;;
  *)
    echo '*' ;;
esac
stdout
*
code
case 'apple' in
  ?pple)
    echo '?pple' ;;
  *)
    echo '*' ;;
esac
stdout
?pple
code
case 'apple' in
  ????)
    echo '????' ;;
  a???e)
    echo 'a???e' ;;
  *)
    echo '*' ;;
esac
stdout
a???e
code
case 'apple' in
  [ab]pple)
    echo '[ab]pple' ;;
  [bc]pple)
    echo '[bc]pple' ;;
  *)
    echo '*' ;;
esac
stdout
[ab]pple
code
case 'apple' in
  [a-z]pple)
    echo '[a-z]pple' ;;
  [A-Z]pple)
    echo '[A-Z]pple' ;;
  *)
    echo '*' ;;
esac
stdout
[a-z]pple
code
case 'Apple' in
  [a-z]pple)
    echo '[a-z]pple' ;;
  [A-Z]pple)
    echo '[A-Z]pple' ;;
  *)
    echo '*' ;;
esac
stdout
[A-Z]pple
code
case '2023' in
  202[0-9])
    echo '202[0-9]' ;;
  *)
    echo '*' ;;
esac
stdout
202[0-9]
code
case '2023' in
  202[!12])
    echo '202[!12]' ;;
  *)
    echo '*' ;;
esac
stdout
202[!12]
code
case '2023' in
  202[!4-9])
    echo '202[!4-9]' ;;
  *)
    echo '*' ;;
esac
stdout
202[!4-9]
code
case 'apple' in
  apple | orange)
    echo 'apple | orange' ;;
  peach | orange)
    echo 'peach | orange' ;;
  *)
    echo '*' ;;
esac
stdout
apple | orange

case ~ 優先順位

上から順にマッチした条件が優先されます。

code
case '2023' in
  202?)
    echo '202?' ;;
  2023)
    echo '2023' ;;
  *)
    echo '*' ;;
esac
stdout
202?

case ~ フォールスルー

「;;」の場合はそこでcaseを抜けますが、「;&」を使用した場合はフォールスルーします。

code
case '2023' in
  2021) echo '2021' ;&
  2022) echo '2022' ;&
  2023) echo '2023' ;&
  2024) echo '2024' ;&
  2025) echo '2025' ;&
  2026) echo '2026' ;&
     *) echo '*' ;;
esac
stdout
2023
2024
2025
2026
*

フォールスルーしても「;;」でcaseを抜けます。

code
case '2023' in
  2021) echo '2021' ;&
  2022) echo '2022' ;&
  2023) echo '2023' ;&
  2024) echo '2024' ;&
  2025) echo '2025' ;;
  2026) echo '2026' ;&
     *) echo '*' ;;
esac
stdout
2023
2024
2025

「;&」の場合は次の条件にフォールスルーしますが「;;&」の場合は次にマッチする条件にフォールスルーします。

code
case '2023' in
  202?) echo '202?' ;;&
  2023) echo '2023' ;;&
  2024) echo '2024' ;;&
  202*) echo '202*' ;;&
  2025) echo '2024' ;;&
     *) echo '*' ;;
esac
stdout
202?
2023
202*
*

「;;&」で次にマッチする条件にフォールスルーした場合でも次にマッチした条件が「;;」の場合はcaseを抜けます。

code
case '2023' in
  202?) echo '202?' ;;&
  2023) echo '2023' ;;&
  2024) echo '2024' ;;&
  202*) echo '202*' ;;
  2025) echo '2024' ;;&
     *) echo '*' ;;
esac
stdout
202?
2023
202*