않습니다
if [[ "$1" = pattern ]]; then
hook
fi
항상 같은 동작
case "$1" in
pattern) hook;;
esac
아니면 어떤 문제가 있습니까?
답변
예, 그것들은 (거의) 완전히 동일합니다.
세부 묘사
내부 [ … ]
구조체 :
=
연산자 (또는 심지어 비 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