[[bash에서의 대소 문자 동등성


13

않습니다

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

항상 같은 동작

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

아니면 어떤 문제가 있습니까?


1
나는 관계없이, 그들은 다른 어떤 사례를 찾을 수 없습니다 shopt로 설정하고 값 $1이나 pattern,도에서 $?후. 유일한 차이점은 $1에서 실행될 때 출력에서 ​​확장되지 않는다는 것 xtrace입니다.
Kusalananda

답변:


7

예, 그것들은 (거의) 완전히 동일합니다.


세부 묘사

내부 [ … ]구조체 :

=연산자 (또는 심지어 비 POSIX 옵션== ) 문자열 정합하지 패턴 매칭을 테스트한다.

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

== 및! = 연산자를 사용하는 경우 연산자 오른쪽의 문자열은 패턴으로 간주되며 아래 에 패턴 일치에 설명 된 규칙 에 따라 일치 됩니다. 쉘 옵션 nocasematch 가 활성화되면 알파벳 문자 의 경우상관없이 일치가 수행됩니다 . 문자열이 패턴과 일치하거나 (==) 일치하지 않으면 (! =) 반환 값은 0이고, 그렇지 않으면 1입니다. 패턴의 모든 부분은 문자열로 일치되도록 인용 될 수 있습니다.

case구조체 내부 (사람 배쉬, 편집 및 강조 광산에서) :

[[(] pattern [| pattern] ...) 목록의 대소 문자 구분; ] ... esac
...는 경로 이름 확장 과 동일한 일치 규칙 을 사용하여 각 패턴과 차례로 일치 시키려고 시도합니다 (아래 경로 이름 확장 참조). … 검사 된 각 패턴은 물결표 확장, 매개 변수 및 변수 확장, 산술 대체, 명령 대체 및 프로세스 대체를 사용하여 확장됩니다. 쉘 옵션 nocasematch 가 활성화되면 알파벳 문자 의 경우상관없이 일치가 수행 됩니다 .

모두 Pattern MatchingPathname Expansionbash는 설명서 내에서 같은 의미로 사용된다.

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

`[[ … ]]`                                   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:

    bash 버전 4.3 부터

    '=='및 '! ='연산자를 사용하는 경우 연산자 오른쪽의 문자열은 패턴으로 간주 되며 extglob 쉘 옵션이 활성화 된 것처럼 아래 패턴 일치에 설명 된 규칙에 따라 일치됩니다 .

    즉, extglob unset 옵션과 함께 사용 된 패턴 은 [[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

    어떤 숫자 만 또는 문자 만의 캐릭터 중 하나와 일치하는 것 abcde같은 1234aabee, 그러나 12a또는 b23.

    정규식 (var p3 참조)을 사용 [[하면 A 도 동일하게 작동합니다 .

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