[[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 Matching와 Pathname 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같은 1234나 aabee, 그러나 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.