이유가 없다
[[ $a = a|b ]]
$ a가 a|b문자열 인지 테스트하는 대신 오류를보고해야하지만 오류는 [[ $a =~ a|b ]]반환하지 않습니다.
유일한 이유는 |일반적으로 (외부 및 내부 [[ ... ]]) 특수 문자 이기 때문입니다 . 이 [[ $a =위치 에서 일반 쉘 명령 행의 인수 또는 경로 재 지정 대상과 같은 bash일반 WORD 인 토큰 유형이 필요 합니다 (단, extglobbash 4.1 이후 옵션이 활성화 된 것처럼 ).
( 여기서 WORD 로, POSIX 사양에 설명 된 것과 같은 가상 쉘 문법 의 단어 를 말합니다. 즉, 쉘은 간단한 쉘 명령 행에서 하나의 토큰으로 구문 분석하고 영어와 같은 단어의 다른 정의는 아닙니다. 문자의 순서 나 간격이없는 문자의 순서. 하나 , 두 등이다 WORD )들.foo"bar baz"$(echo x y)
일반적인 쉘 명령 행에서 :
echo a|b
에 echo a파이프됩니다 b. a|b하지 않은 것입니다 WORD A : 그것은 세 가지 토큰의 a WORD 하는 |토큰과 b 워드 토큰입니다.
사용할 경우 [[ $a = a|b ]], bash기대 WORD 는 (도착 a),하지만 예기치 않은 발견 한 |오류를 발생시키는 토큰을.
흥미롭게도 다음과 같이 bash불평하지 않습니다.
[[ $a = a||b ]]
이제 a토큰과 ||토큰이 뒤에 b오기 때문에 다음과 같은 방식으로 구문 분석됩니다.
[[ $a = a || b ]]
어떤 그 시험하고 $a있다 a거나하는 것이 b문자열 인 비 웁니다.
지금에:
[[ $a =~ a|b ]]
bash동일한 구문 분석 규칙을 가질 수 없습니다. 동일한 구문 분석 규칙이 있으면 위의 오류가 발생하고 단일 WORD| 인지 확인 하려면 인용해야합니다 . 그러나 bash 3.2부터는 다음을 수행하십시오.a|b
[[ $a =~ 'a|b' ]]
그것은 더 이상 a|b정규 표현식 과 일치하지 않지만 정규 표현식 과 일치 합니다 a\|b. 즉, 쉘 인용은 정규 표현식 연산자의 특별한 의미를 제거하는 부작용이 있습니다. 이것은 기능이므로 동작과 유사 [[ $a = "?" ]]하지만 정규 표현식은 그렇지 않지만 와일드 카드 패턴 (에서 사용 [[ $a = pattern ]])은 쉘 단어 (예 : 글로브에서 사용)입니다.
그래서 bash그렇지 않으면 일반적으로 같은 특수 쉘 문자를 모두 확장 정규 표현식 연산자를 치료하는 |, (, )의 인수 구문 분석을 다르게 할 때 =~연산자를.
그래도
[[ $a =~ (ab)*c ]]
지금 작동합니다
[[ $a =~ [)}] ]]
하지 않습니다. 당신이 필요합니다 :
[[ $a =~ [\)}] ]]
[[ $a =~ [')'}] ]]
이전 버전의 어느 것이 bash백 슬래시와 일치하지 않습니까? 그 하나는 고정되었지만
[[ $a =~ [^]')'] ]]
않습니다 되지 는 예를 들어해야처럼 백 슬래시에 일치합니다. bash그것이 )괄호 안에 있다는 것을 인식하지 못하기 때문에 ,을 제외하고는 모든 문자와 일치 )하는 [^]\)]정규 표현식이 나오고 ], \및 ).
ksh93 그 전면에 훨씬 더 나쁜 버그가 있습니다.
에서 zsh, 그것은 정상적인 쉘 단어이며 예상되는 정규 표현식 연산자는 정규 표현식 연산자의 의미에 영향을 미치지 않습니다.
[[ $a =~ 'a|b' ]]
a|b정규 표현식 과 일치합니다 .
이는 / 명령에 =~추가 할 수도 있음을 의미합니다 .[test
[ "$a" '=~' 'a|b' ]
test "$a" '=~' 'a|b'
(또한 작동합니다 yash. 특수 쉘 연산자 로 =~인용해야 함 ).zsh=something
bash 3.1은 다음과 같이 동작했습니다 zsh. 그것은 아마도과 정렬로, 3.2에서 변경 ksh93(비록 bash첫 해낸 것을 쉘이었다 [[ =~ ]]당신은 여전히 할 수있는)하지만, BASH_COMPAT=31또는 shopt -s compat31그 동안 제외 (이전 동작으로 되돌리려면 [[ $a =~ a|b ]]에서 오류를 반환 bash은 더 이상하지 않습니다, 3.1 에서 bash -O compat31의 새 버전 bash).
내가 왜 규칙이 혼란스럽고 왜 사용했는지 분명히 밝히기를 바랍니다.
[[ $a =~ $var ]]
다른 쉘로의 이식성을 포함합니다.
|특별한 위치)이 기본적 으로의 오른쪽에[[ $var = $pattern ]]있습니다.shopt이 동작이 보이는 버전과 옵션 구성 을 분리하는 것이 흥미로울 것입니다.extglob기본 또는 명시 적 구성이 켜져 있는 경우에만 있습니다.