2016-07-08 3 views
0

떠들썩한 파티 3 배시 4와 같은 결과를 출력하지 않고 일반 식 검사와 후속 코드 :정규 표현식 : 떠들썩한 파티 VS 떠들썩한 파티 3 4

TESTCASE="testcase0" 
[[ ${TESTCASE} =~ "^testcase[0-9\.]*$" ]] 
echo $? 
echo ${BASH_REMATCH} 

떠들썩한 파티 3.2 출력 성공적인 정규식 확인 :

0 
testcase0 

bash는 4.1 정규 표현식 체크 실패 :

1 
<empty line> 

난에 식별 할 수없는 내 regex pattern 표현식이 실패합니다. 두 버전의 bash간에 호환되는 코드가 필요합니다.

내 문제에 대한 단서가있는 사람이 있습니까?

감사합니다.

+0

광산에서'3.2'는 공란으로 1을 출력합니다 ... 당신은 정규식을 인용하지 않아도됩니다. – 123

+0

저는 레드햇 기계에 있습니다. – LAL

답변

4

이전 버전의 Bash (3.1)에서는 테스트에서 정규식을 따옴표로 묶을 수있었습니다. 최신 버전에서는 따옴표가 패턴의 일부로 취급되므로 일치하지 않습니다.

해결책은 따옴표를 제거하는 것입니다.

re='^testcase[0-9\.]*$' # single quotes around variable 
[[ ${TESTCASE} =~ $re ]] # unquoted variable used in test 

이 구문은 정규 표현식을 지원 배쉬의 모든 버전에서 작동합니다 :


정규 표현식을 사용하기 위해 권장되는 방법은 이것이다. 변수는 꼭 필요한 것은 아니지만 가독성을 향상시킵니다. 자세한 내용은 Greg 's wiki의 regular expressions section을 참조하십시오. (위의 링크) 변수의 사용에 관한

(등등 괄호 파이프를 탈출하는 것을 방지하기 위해) 간 호환성

예컨대 정규식을 저장하는 변수를 사용하여 re='^\*(>| *Applying |.*\.diff|.*\.patch)'; [[ $var =~ $re ]] ERE 구문을 작성하고 쉘 - 이스케이프의 필요성을 피할뿐만 아니라 모든 3.x BASH 버전과 호환되므로 유지 관리가 훨씬 쉽습니다.

그런데 브래킷 표현에서 .을 탈출 할 필요는 없습니다.

관련 문제