これは私のコードです。
#!/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
答え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