case 문에서 패턴을 사용하는 방법은 무엇입니까?


81

man페이지는 case명령문이 "파일 이름 확장 패턴 일치"를 사용 한다고 말합니다 .
일반적으로 일부 매개 변수에 대한 짧은 이름을 원하므로 다음으로 이동합니다.

case $1 in
    req|reqs|requirements) TASK="Functional Requirements";;
    met|meet|meetings) TASK="Meetings with the client";;
esac

logTimeSpentIn "$TASK"

내가 좋아하는 패턴을 시도 req*하거나 me{e,}t하는 내가 파일명 확장의 맥락에서 그 값과 일치하도록 정확하게 확장 것 이해하지만, 그것은 작동하지 않습니다.

답변:


158

중괄호 확장은 작동하지 않지만 *, ?[]않습니다. 설정 shopt -s extglob하면 확장 패턴 일치를 사용할 수도 있습니다 .

  • ?() -0 개 또는 1 개의 패턴 발생
  • *() -0 개 이상의 패턴 발생
  • +() -하나 이상의 패턴 발생
  • @() -패턴 발생 1 회
  • !() -패턴을 제외한 모든 것

예를 들면 다음과 같습니다.

shopt -s extglob
for arg in apple be cd meet o mississippi
do
    # call functions based on arguments
    case "$arg" in
        a*             ) foo;;    # matches anything starting with "a"
        b?             ) bar;;    # matches any two-character string starting with "b"
        c[de]          ) baz;;    # matches "cd" or "ce"
        me?(e)t        ) qux;;    # matches "met" or "meet"
        @(a|e|i|o|u)   ) fuzz;;   # matches one vowel
        m+(iss)?(ippi) ) fizz;;   # matches "miss" or "mississippi" or others
        *              ) bazinga;; # catchall, matches anything not matched above
    esac
done

2
이에 대한 문서 링크 : gnu.org/software/bash/manual/html_node/…
phyatt

@phyatt : 감사합니다. 내 대답에 대한 링크를 추가했습니다.
데니스 윌리엄슨

이 대답은 내 패턴을 큰 따옴표 ( "a *")로
묶었는데

44

중괄호를 사용할 수 없다고 생각합니다.

조건부 구문의 경우에 대한 Bash 매뉴얼에 따르면 .

패턴 은 물결표 확장, 매개 변수 확장, 명령 대체 및 산술 확장을 거칩니다.

불행히도 Brace Expansion 에 대해서는 아무것도 없습니다 .

따라서 다음과 같이해야합니다.

case $1 in
    req*)
        ...
        ;;
    met*|meet*)
        ...
        ;;
    *)
        # You should have a default one too.
esac

7

ifgrep -Eq

arg='abc'
if echo "$arg" | grep -Eq 'a.c|d.*'; then
  echo 'first'
elif echo "$arg" | grep -Eq 'a{2,3}'; then
  echo 'second'
fi

어디:

  • -qgrep출력 생성을 방지 하고 종료 상태 만 생성합니다.
  • -E 확장 정규식을 활성화합니다.

나는 이것을 좋아하기 때문에 :

한 가지 단점은 case외부 grep프로그램을 호출하는 것보다 느릴 가능성이 있지만 Bash를 사용할 때 성능을 마지막으로 고려하는 경향이 있다는 것입니다.

case POSIX 7입니다.

Bash shopthttps://stackoverflow.com/a/4555979/895245에서 언급 하지 않고 기본적으로 POSIX를 따르는 것으로 보입니다.

인용문 : http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 섹션 "Case Conditional Construct":

조건부 구성 케이스는 여러 패턴 중 첫 번째 패턴에 해당하는 복합 목록을 실행합니다 (패턴 일치 표기법 참조) [...] 동일한 복합 목록을 가진 여러 패턴은 '|'로 구분됩니다. 상징. [...]

케이스 구성의 형식은 다음과 같습니다.

case word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

그런 다음 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 섹션 '2.13. 패턴 일치 표기법'은 ?, *[].

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.