Bash의 정규 표현식이 변수일 때만 작동하고 직접 작동하지 않는 이유는 무엇입니까? [복사]

Bash의 정규 표현식이 변수일 때만 작동하고 직접 작동하지 않는 이유는 무엇입니까? [복사]

그렇다면 왜 다음이 작동하고 일치 항목을 인쇄합니까?

THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
    echo "Match!"
fi

다음의 경우에는 그렇지 않습니다.

if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
    echo "Match!"
fi  

차이점은 무엇입니까? 이는 동일한 정규식입니다.

답변1

내부에 작은따옴표를 사용하지 마십시오 [[.

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

GNU bash 매뉴얼에서: https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

주의:

패턴의 모든 부분을 인용하여 인용된 부분을 문자열로 일치시킬 수 있습니다..

매뉴얼에서는 이 변수를 먼저 사용하도록 권장하는 것 같습니다.

쉘 변수에 정규식을 저장하는 것은 쉘 특정 문자를 인용할 때 문제를 방지하는 유용한 방법인 경우가 많습니다. 때로는 따옴표를 사용하지 않고 정규식을 문자 그대로 지정하거나 셸의 따옴표 제거에 주의하면서 정규식에서 사용되는 따옴표를 추적하는 것이 어렵습니다. 쉘 변수를 사용하여 패턴을 저장하면 이러한 문제를 줄일 수 있습니다.

당신은 또한 볼 수 있습니다쉘 변수에 정규식을 저장하여 쉘 특정 문자를 인용하는 문제를 피하는 방법은 무엇입니까?

관련 정보