ケースコマンドのパターンとして変数を使用する

ケースコマンドのパターンとして変数を使用する

これは私のコードです。

#!/bin/bash

action_list='list|add|rem'

while true; do
        echo "Actions include: list - show list
                                add - add item to list
                                rem - remove item from list"
        read -p "Input action: " action_var

        case $action_var in
                ${action_list} ) echo "Option $action_var is valid";;
                *) echo "Option $action_var is INVALID";;
        esac

        echo $action_var
done

私が望むのは、後でより多くのオプションを追加したい場合は、そのオプションをハードコードする必要なしに "action_list"変数のみを使用できるようにcaseコマンドを使用することです。

しかし、${action_list} )構造は機能しません。今私はハードコーディングしようとしましたが、うまくlist|add|rem)...いきます。

この場合、変数が機能しないのはなぜですか?

答え1

文書を確認してください:

case

Case コマンドの構文は次のとおりです。

ケース言葉存在する
    [[(]模様[|模様]...) コマンドリスト;;]... esac

[...]各模様チルダ拡張、パラメータ拡張、コマンド置換、算術拡張を実行します。

何が起こるのか、パラメータ拡張が発生するということです。後ろにパターンが認識されます(|区切り記号を使用)。|拡張の A は、|パターン区切り文字ではなく、通常の文字です。 (類似推論私の他の答え.)

答え2

答えは2つだけなので、caseこれが正しい解決策だとは思わない。この問題を解決する方法はいくつかあります。私は次のようにします。

action_list="list|add|remove|foo|bar"
if grep -qE "^(${action_list})$" <<< "${action_var}" ; then
  echo valid
else
  echo not valid ${action_var}
fi

同様の変数拡張を含むbashまたはシェルを使用している場合は、リスト変数の読みやすさが優れている可能性があります。

action_list="list add remove foo bar"
if grep -qE "^(${action_list// /|})$" <<< "${action_var}" ; then
  echo valid
else
  echo not valid ${action_var}
fi

関連情報