shell: =~ 연산자가 예상대로 작동하지 않습니다

shell: =~ 연산자가 예상대로 작동하지 않습니다

다음 스크립트를 고려해보세요.

#! /bin/bash

line="confusing"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

위 코드는 예상한 결과를 생성하지만 다음 코드는 그렇지 않습니다.

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

이것은 "일치!"를 인쇄합니다
. 정규식은 [[:lower:]]*0개 이상의 소문자를 의미하지 않습니까?

아래에 "matches!"도 인쇄되면 더욱 혼란스러워집니다.

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:digit:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

왜 이런 일이 발생하는지 설명할 수 있는 사람이 있나요?

답변1

정규식은 전체 문자열과 일치할 필요가 없습니다. 그렇기 때문에 문자열의 시작과 끝에 각각 및 가 있습니다 ^.$

[[ CoNfUsInG =~ ^[[:lower:]]*$ ]] || echo no

CoNfUsInGlY, ^[[:lower:]]*( 없이 $)는 문자열 시작 부분에 소문자가 없기 때문에 여전히 일치합니다.

관련 정보