하다
if [[ "$1" = pattern ]]; then
hook
fi
항상 행동하다
case "$1" in
pattern) hook;;
esac
아니면 함정이 있나요?
답변1
예, (거의) 완전히 동일합니다.
세부 사항
구성 내부 [ … ]
:
연산자 =
(POSIX가 아닌 옵션도 포함 ==
)는 패턴 일치가 아닌 문자열 일치를 테스트합니다.
구성 내부 [[ ]]
(man bash에서):
== 및 != 연산자를 사용할 때 연산자 오른쪽의 문자열은 패턴으로 처리되며규칙아래에 설명된 대로패턴 매칭 중. 껍질의 경우optionnocasematch활성화된 경우 일치합니다.특별한 상황과 관계없이 실행됨 알파벳 문자. 문자열이 패턴(==)과 일치하거나 일치하지 않는 경우(!=) 반환 값은 0이고, 그렇지 않으면 반환 값은 1입니다. 패턴의 일부를 인용하여 강제로 문자열로 일치시킬 수 있습니다.
구성 내부 case
(man bash에서 편집 및 강조):
[ [(] 패턴[ | 패턴] ... ) 목록의 대문자 및 소문자 단어 ] ... esac
... 동일한 일치 항목을 사용하여 차례로 각 패턴과 일치시켜 봅니다.규칙에 관해서는경로명 확장(아래의 경로 이름 확장을 참조하십시오). ...검사된 각 패턴은 물결표 확장, 인수 및 변수 확장, 산술 대체, 명령 대체 및 프로세스 대체를 사용하여 확장됩니다. 껍질의 경우optionnocasematch활성화된 경우 일치를 수행합니다.사건을 고려하지 마세요알파벳 문자.
Pattern Matching
bash 매뉴얼에서는 Pathname Expansion
동일한 의미를 갖습니다.
설명서에서 볼 수 있는 유일한 차이점은 다음과 같습니다.
`[[ … ]]` 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
:~부터배쉬 버전 4.3
"==" 및 "!=" 연산자를 사용할 경우 연산자 오른쪽의 문자열을 패턴으로 처리하여 패턴 일치에 설명된 규칙에 따라 일치합니다.extglob 쉘 옵션이 활성화된 것과 마찬가지로.
이는 옵션과 함께 사용되는 모드를 의미합니다.
extglob
설정되지 않음[[
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
이는 or
abcde
와 같이 숫자만 또는 문자만 포함하는 문자열과 일치 하지만 or 는 일치하지 않습니다 .1234
aabee
12a
b23
A는
[[
다음과 같이 동일하게 작동합니다.정규식(var p3 참조) 다음을 사용하십시오.#!/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