답변:
예, 그것들은 (거의) 완전히 동일합니다.
내부 [ … ]
구조체 :
=
연산자 (또는 심지어 비 POSIX 옵션==
) 문자열 정합하지 패턴 매칭을 테스트한다.
내부 [[ ]]
구조체 (man bash에서) :
== 및! = 연산자를 사용하는 경우 연산자 오른쪽의 문자열은 패턴으로 간주되며 아래 에 패턴 일치에 설명 된 규칙 에 따라 일치 됩니다. 쉘 옵션 nocasematch 가 활성화되면 알파벳 문자 의 경우 와 상관없이 일치가 수행됩니다 . 문자열이 패턴과 일치하거나 (==) 일치하지 않으면 (! =) 반환 값은 0이고, 그렇지 않으면 1입니다. 패턴의 모든 부분은 문자열로 일치되도록 인용 될 수 있습니다.
case
구조체 내부 (사람 배쉬, 편집 및 강조 광산에서) :
[[(] pattern [| pattern] ...) 목록의 대소 문자 구분; ] ... esac
...는 경로 이름 확장 과 동일한 일치 규칙 을 사용하여 각 패턴과 차례로 일치 시키려고 시도합니다 (아래 경로 이름 확장 참조). … 검사 된 각 패턴은 물결표 확장, 매개 변수 및 변수 확장, 산술 대체, 명령 대체 및 프로세스 대체를 사용하여 확장됩니다. 쉘 옵션 nocasematch 가 활성화되면 알파벳 문자 의 경우 와 상관없이 일치가 수행 됩니다 .
모두 Pattern Matching
와 Pathname Expansion
bash는 설명서 내에서 같은 의미로 사용된다.
매뉴얼에서 볼 수있는 유일한 차이점은 다음과 같습니다.
`[[ … ]]` 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
입니다.