这是我的代码:
#!/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
我想要的是使用 case 命令,这样,将来如果我添加更多选项,我不需要对它们进行硬编码,我可以只使用“action_list”变量。
但该${action_list} )
构造不起作用。现在我尝试对它进行硬编码,list|add|rem)...
并且它有效。
为什么变量在这种情况下不起作用?
答案1
答案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 或具有类似变量扩展的 shell,这可能更适合列表变量的可读性:
action_list="list add remove foo bar"
if grep -qE "^(${action_list// /|})$" <<< "${action_var}" ; then
echo valid
else
echo not valid ${action_var}
fi