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


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)을 참조하십시오 . [의 내장 zsh과 yash도는이 =~연산자를.
— 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.