더 복잡한 사례 문의 올바른 구문은 어떻습니까?

더 복잡한 사례 문의 올바른 구문은 어떻습니까?
case "$1","$name" in
    -py | --python | --python3,*) if [[ "$name" =~ \..+$ ]]; then

그것은 사물을 포착하지 못합니다. 실제로는 다음과 같은 것을 포착해야 합니다...

USERNAME@HOSTNAME:~$ myscript --python surfer

재미있는 점: 다중 모드 조건을 다음과 같이 단순화합니다.

    --python,*) if [[ "$name" =~ \..+$ ]]; then

효과가있다! 매우 반복적인 전경으로 인해 이 섹션은 3번 배치해야 했습니다. 첫 번째는 for -py, 다음은 for --python, 마지막으로 --python3모든 패턴을 캡처하기 위한 것입니다.

하지만 다른 점은 - 그 반대입니다.

case "$1" in
    -py | --python | --python3)    if [[ ! "$name" =~ \.py$ ]]; then

아주 좋고 효과적입니다! 따라서 이는 다중 패턴 구문이 올바르지 않을 수 있으며 공백을 제거하거나 3개 패턴 모두의 합계 주위에 있는 모든 종류의 괄호를 첫 번째 OR 두 번째 OR 세 번째 패턴이 캡처되어야 하는 그룹으로 해석해야 할 수 있다는 내 가설에 반하는 것입니다. .

즉, GNU bash 버전 4.3에서는 "$name"과 같은 조건 외에 다중 모드와 두 번째 조건을 모두 가질 수 없다는 인상을 받았습니다. 이것이 가능한가? 아니면 이것을 달성하려고 시도하는 동안 실수를 하고 있습니까?

답변1

절의 개체가 case올바르게 일치해야 합니다.

case "$1","$name" in
    -py | --python | --python3,*) if [[ "$name" =~ \..+$ ]]; then

~해야 한다

case "$1","$name" in
    -py,* | --python,* | --python3,*) if [[ "$name" =~ \..+$ ]]; then

그러나 이것은 아마도 다음과 같이 덜 반복하여 더 명확하게 표현될 수 있습니다.

if [[ "$name" =~ \..+$ ]]; then
    case "$1" in
        -py | --python | --python3)
            do_stuff
            ;;
    esac
fi

관련 정보