배시 테스트: "=~"는 무엇을 합니까?

배시 테스트: "=~"는 무엇을 합니까?
#!/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

~시작 정규식의 선행은 무엇을 합니까?

답변1

실제로는 왼쪽 문자열과 오른쪽 확장 정규식의 정규식 일치를 수행하는 ~연산자의 일부 입니다.=~

[[ "string" =~ pattern ]]

문자열은 따옴표로 묶어야 하지만 정규 표현식은 따옴표로 묶어서는 안 됩니다(리터럴 문자열과 일치시키려는 경우 제외).

Perl 프로그래밍 언어와 기타 여러 범용 및 도메인별 언어에서는 유사한 연산자가 정규식 일치를 수행하는 데 사용됩니다.

이해되는 정규식은 bashGNU가 이해하는 플래그가 있는 정규식, 즉 확장된 정규식 세트와 동일합니다.grep-E


주제에서 조금 벗어났지만 알아두면 좋은 점:

캡처링 그룹이 포함된 정규식과 일치하는 경우 각 그룹에서 캡처한 문자열 부분을 배열에서 사용할 수 있습니다 BASH_REMATCH. 이 배열의 0번째/첫 번째 항목은 &해당 패턴과 일치하는 문자열의 비트인 교체 명령(또는 Perl의) 교체 패턴에 해당하고, 인덱스 1 이후의 항목은 교체 패턴의 등에 해당합니다. (또는 Perl의 경우 등), 즉 각 괄호가 일치하는 비트입니다.sed$&\1\2sed$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"정규식 일치", 즉 "RE-Match"에서 나옵니다.


Bourne과 유사한 쉘이 아닌 경우 제한된 정규식 일치 bash에 사용할 수도 있습니다 expr(기본 정규식만 사용).

작은 예:

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

답변2

Resources 섹션 아래의 bash 매뉴얼 페이지를 읽어보세요 [[ expression ]].

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 =~와 같은 연산자입니다 . 오른쪽 문자열의 실제 정규식과는 아무런 관련이 없습니다.==!=

관련 정보