Caseステートメントの一致を含む特別な変数はありますか?

Caseステートメントの一致を含む特別な変数はありますか?

Bashステートメントを作成する場合、case変数に明示的に代入せずに現在の一致を取得できますか?

考える

case $(some subshell command sequence) in
  one) stuff ;;
  *) stuff "$case_match";;
esac

次のことができることを知っていますが、より簡潔にしたいと思います。

case_match=$(some subshell command sequence)
case "$case_match" in
...

これを表す特別な変数がありますか$case_match


次のコメントのソースは次のとおりです。@hawkerlagもう一つの人為的な例です。次のことができます。

today=$(date '+%A')
case "$today" in
  *) echo "It's $today" ;;
esac

しかし、こうすれば良いでしょう。これが可能かどうかを尋ねる質問です(しかしそうではありません)。

case $(date '+%A') in
  *) echo "It's $case_match" ;;
esac

case_match私たちが無視したゴールデン変数はどこにありますか)

答え1

いいえ。

しかし、zsh -o extendedglob次のようにすることができます。

case $(cmd) in
  ((#m)*) printf '%s\n' "Match: $MATCH"
esac

(#m)~であるワイルドカードフラグできるようにする$MATCH。そのようなことにはもっと便利です${var//(#m)?/<$MATCH>}

または:

case $(cmd) in
  ((#b)(???)(*)) printf '%s\n' "First 3 chars: $match[1], rest: $match[2]"
esac

(#b)活性化のために逆参照

または(必須ではありませんextendedglob):

case ${output::=$(cmd)} in
  (*) printf '%s\n' "Output: $output"
esac

答え2

いくつかのトリックを使用してこれを実行できますが、利用可能な未設定の変数があることを確認する必要があります。たとえば、

unset foo  # Make sure foo is unset, or at least set to the empty string
case ${foo:-$(date +%m)} in
   1) echo "Jan" ;;
   2) echo "Feb" ;;
 # ...
  11) echo "Nov" ;;
  12) echo "Dec" ;;
esac

ここでは、fooデフォルトのパラメータ拡張でコマンド置換出力を生成できるように、ダミー変数としてのみ使用されます。

関連情報