답변:
예, 그것들은 (거의) 완전히 동일합니다.
내부 [ … ]구조체 :
=연산자 (또는 심지어 비 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
암시 적 extglob:
bash 버전 4.3 부터
'=='및 '! ='연산자를 사용하는 경우 연산자 오른쪽의 문자열은 패턴으로 간주 되며 extglob 쉘 옵션이 활성화 된 것처럼 아래 패턴 일치에 설명 된 규칙에 따라 일치됩니다 .
즉, extglob unset 옵션과 함께 사용 된 패턴 은 [[bash 버전 4.3 이후 의 case 문과 구문에서 다르게 작동 합니다.
암시 적 |:
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
shopt로 설정하고 값$1이나pattern,도에서$?후. 유일한 차이점은$1에서 실행될 때 출력에서 확장되지 않는다는 것xtrace입니다.