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