세부 사항

세부 사항

하다

if [[ "$1" = pattern ]]; then
    hook
fi

항상 행동하다

case "$1" in
    pattern) hook;;
esac

아니면 함정이 있나요?

답변1

예, (거의) 완전히 동일합니다.


세부 사항

구성 내부 [ … ]:

연산자 =(POSIX가 아닌 옵션도 포함 ==)는 패턴 일치가 아닌 문자열 일치를 테스트합니다.

구성 내부 [[ ]](man bash에서):

== 및 != 연산자를 사용할 때 연산자 오른쪽의 문자열은 패턴으로 처리되며규칙아래에 설명된 대로패턴 매칭 중. 껍질의 경우optionnocasematch활성화된 경우 일치합니다.특별한 상황과 관계없이 실행됨 알파벳 문자. 문자열이 패턴(==)과 일치하거나 일치하지 않는 경우(!=) 반환 값은 0이고, 그렇지 않으면 반환 값은 1입니다. 패턴의 일부를 인용하여 강제로 문자열로 일치시킬 수 있습니다.

구성 내부 case(man bash에서 편집 및 강조):

[ [(] 패턴[ | 패턴] ... ) 목록의 대문자 및 소문자 단어 ] ... esac
... 동일한 일치 항목을 사용하여 차례로 각 패턴과 일치시켜 봅니다.규칙에 관해서는경로명 확장(아래의 경로 이름 확장을 참조하십시오). ...검사된 각 패턴은 물결표 확장, 인수 및 변수 확장, 산술 대체, 명령 대체 및 프로세스 대체를 사용하여 확장됩니다. 껍질의 경우optionnocasematch활성화된 경우 일치를 수행합니다.사건을 고려하지 마세요알파벳 문자.

Pattern Matchingbash 매뉴얼에서는 Pathname Expansion동일한 의미를 갖습니다.

설명서에서 볼 수 있는 유일한 차이점은 다음과 같습니다.

`[[ … ]]`                                   case
tilde  expansion                            tilde expansion
parameter and variable expansion            parameter and variable expansion
arithmetic expansion                        arithmetic substitution
command substitution                        command substitution
process substitution                        process substitution
quote removal

quote removal이는 케이스 구성에 명시적으로 나열되어 있지 않습니다.
작동 방식은 다음과 정확히 일치합니다(의 경우 [[ … ]]).

패턴의 일부를 인용하여 강제로 문자열로 일치시킬 수 있습니다.

이것을 사용하여 마지막 점을 테스트하십시오(이제 변수는아니요하나의 모드):

case "$1" in
  "$pattern") echo case match
esac

왜 거의?

  1. 암시적 extglob:

    ~부터배쉬 버전 4.3

    "==" 및 "!=" 연산자를 사용할 경우 연산자 오른쪽의 문자열을 패턴으로 처리하여 패턴 일치에 설명된 규칙에 따라 일치합니다.extglob 쉘 옵션이 활성화된 것과 마찬가지로.

    이는 옵션과 함께 사용되는 모드를 의미합니다.extglob 설정되지 않음[[Bash 버전 4.3 이후에는 Case 문과 구성이 내부적으로 다르게 작동합니다.

  2. 암시적 |:

    Case 구문은 다음과 같습니다.

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

    |이는 (OR)로 구분된 여러 패턴이 있을 수 있음을 의미합니다 .

    이와 같이:

    shopt -s extglob;      p1="+([0-9])";       p2="+([abcde])"
    
    case "$1" in
        $p1|$p2)    echo "or case match" ; ;;
    esac
    

    이는 or abcde와 같이 숫자만 또는 문자만 포함하는 문자열과 일치 하지만 or 는 일치하지 않습니다 .1234aabee12ab23

    A는 [[다음과 같이 동일하게 작동합니다.정규식(var p3 참조) 다음을 사용하십시오.

    #!/bin/bash
    
    shopt -s extglob           ### Use extended globbing.
    shopt -s globasciiranges   ### The range [a-z] will expand to [abcdefghijklmnopqrstuvwxyz].
    
    pattern="+([0-9])"
    p1="+([0-9])"
    p2="+([a-z])"
    p3="^([0-9]+|[a-z]+)$"
    
    case "$1" in
        $pattern)   echo case1 match ; ;&
        $p1|$p2)    echo case2 match ; ;;
    esac
    
    [[ "$1" == $pattern ]] && echo if1 match
    [[ "$1" =~ $p3 ]] && echo if2 match
    

관련 정보