이것은 내 코드입니다.
#!/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
답변이 두 개뿐이므로 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