케이스 명령의 패턴으로 변수 사용

케이스 명령의 패턴으로 변수 사용

이것은 내 코드입니다.

#!/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

답변이 두 개뿐이므로 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

관련 정보