배쉬 테스트 :“= ~”는 무엇을합니까?


39
#!/bin/bash
INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

echo "INT is an integer."

else

echo "INT is not an integer." >&2

exit 1

fi

~시작 정규 표현식에서 선행 은 무엇을 합니까?



5
bash 매뉴얼을 읽었습니까? 불분명 한 것이 무엇입니까?
이카루스

3
bash man 페이지에서 = ~
Jeff Schaller

답변:


46

~실제 운전자의 일부 =~는 우측에 확장 정규식 왼쪽에 그 문자열의 정규식 검색을 수행한다.

[[ "string" =~ pattern ]]

문자열은 따옴표로 묶어야하며 정규 표현식은 따옴표로 묶지 말아야합니다.

Perl 프로그래밍 언어에서도 비슷한 연산자가 사용됩니다.

일반 표현식 bash은 GNU grep-E플래그로 이해 하는 것과 동일 합니다 . 즉 확장 된 정규 표현식입니다.


다소 주제가 맞지 않지만 알아두면 좋은 점 :

캡처 그룹이 포함 된 정규식과 일치하는 경우 각 그룹에서 캡처 한 문자열 부분을 BASH_REMATCH배열 에서 사용할 수 있습니다 . 이 배열의 0 번째 / 첫번째 항목은 대체 명령 &의 대체 패턴 sed(또는 $&Perl)에 해당합니다. 이는 패턴과 일치하는 문자열의 비트이며, 인덱스 1 이상의 항목은 , 등에 해당합니다 \1. \2. A의 sed여분의 패턴 (혹은 $1, $2등 펄), 즉 각각의 괄호 유사한 비트.

예:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

이것은 출력 할 수 있습니다

Got 09, 19 and 14

현재 시간이 09:19:14 인 경우

배열 이름 의 REMATCH비트는 BASH_REMATCH"Regular Expression Match", 즉 "RE-Match"에서 나옵니다.


비에 bash본쉘 번 또한 사용할 수있다 expr(기본적인 정규 표현식을 사용하여) 한정 정규 표현 매칭.

작은 예 :

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123

2
이것은 grep -E인용되지 않은 변수를 패턴으로 사용할 때만 GNU 시스템에서만 이해 하는 것과 같습니다 [[ $var = $pattern ]]( [[ 'a b' =~ a\sb ]]vs 참조 p='a\sb'; [[ 'a b' =~ $p ]]). 또한 쉘 인용은 RE 연산자의 의미에 영향을 미치며 RE 처리에 영향을 줄 수있는 쉘 토큰 화를 위해 일부 문자를 인용해야합니다. [[ '\' =~ [\/] ]]false를 반환합니다. ksh93더 나쁜 문제가 있습니다. zsh쉘과 RE 인용이 명확하게 분리되어있는 더 깔끔한 방법 은 (또는 bash 3.1)을 참조하십시오 . [의 내장 zshyash도는이 =~연산자를.
Stéphane Chazelas

2
아주 멋진 off-topic! +1 (
JJoao

StéphaneChazelas @ 어떻게 "온건 한"zsh을이 일치? 모두이다 [[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]. 아니면 그 인용문 *도 일치합니까? [[ "This is a fine mess." =~ "T.........fin*es*" ]].
sorontar

훨씬 간단한 규칙이라는 점에서 이상합니다 (IMO). 쉘 인용과 RE 이스케이프는 명확하게 분리되어 있습니다. 에서는 [[ a =~ .* ]]하거나 [[ a =~ '.*' ]]또는 [[ a =~ \.\* ]]동일한 .*RE는로 전달되어 =~운전자. OTH, 상품 bash, [[ '\' =~ [)] ]]오류 반환, 당신은 여부를 시도하지 않고 알 것입니다 [[ '\' =~ [\)] ]]일치? 어떻습니까 [[ '\' =~ [\/] ]](ksh93에서). 어떻습니까 c='a-z'; [[ a =~ ["$c"] ]]( =운영자 와 비교 )? 참조 : [[ '\' =~ [^]"."] ]]당신이 할 수있는 거짓 ... 참고 반환 shopt -s compat31에서 bash얻가하는 zsh행동을.
Stéphane Chazelas

zsh/ bash -o compat31용의 동작 [[ a =~ '.*' ]]도 함께 일관성 [ a '=~' '.*' ](위한 [구현이 지원 =~하거나) expr a : '.*'. OTOH는 [[ a = '*' ]]vs 와 일치하지 않습니다 [[ a = * ]](그러나 glos는 쉘 언어의 일부이지만 RE는 그렇지 않습니다).
Stéphane Chazelas

4

[[ expression ]]섹션 아래의 bash 매뉴얼 페이지를 읽어야합니다 .

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).

긴 이야기는 짧고 and =~처럼 연산자 입니다. 문자열의 실제 정규 표현식과는 아무런 관련이 없습니다.==!=


=~실생활에서 의 사용을 보여주는 몇 가지 예를 알아낼 수 있습니까 ?
George Vasiliou

1
@GeorgeVasiliou 나는 명령의 출력을 변수에 넣는 스크립트에서 상당히 자주 사용합니다. 그런 다음 변수가 문자열 패턴과 일치하는지 확인합니다. 예를 들어, 해당 명령의 일부 오류 출력을 기반으로 조치를 수행하려는 경우에 유용합니다.
Michael Martinez

@Sokel 어떤 사람들에게는“RTFM”이 말보다 쉽습니다. ⋯ man [[ expresssion ]]man [[반환 아무것도 없습니다. 내부 bash 명령 help [[이후 유용한 정보를 반환 [[하지만 =~기본 또는 확장 정규식 구문을 사용 하는지 여부 는 밝히지 않습니다 . you 인용 한 텍스트는 bash 매뉴얼 페이지 에서 가져온 것 입니다. "bash 맨 페이지 읽기"라고 말했지만 처음에는 bash 내에서 맨 페이지를 읽겠다고 생각했습니다. 어쨌든 man bash4139 줄 (72 페이지) 길이의 큰 파일을 반환합니다. 을 누르면 검색 할 수 있습니다 /▒▒▒. 정규 표현식을 사용하면 풍미가 =~지정되지 않습니다.
Alex Quinn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.