bash의 [[ ]]
구성 에 대해 알아야 할 몇 가지 중요한 사항이 있습니다. 첫번째:
워드 분할 및 경로 확장이의 말에 수행되지 않습니다 [[
및 ]]
; 물결표 확장, 매개 변수 및 변수 확장, 산술 확장, 명령 대체, 프로세스 대체 및 따옴표 제거가 수행됩니다.
두 번째 :
추가 이진 연산자 '= ~'를 사용할 수 있습니다. 연산자 오른쪽에있는 문자열은 확장 정규식으로 간주되어 그에 따라 일치됩니다 ... 패턴의 모든 부분을 인용하여 강제로 일치시킬 수 있습니다. 문자열로 .
결과적 $v
으로의 양쪽 =~
에서 해당 변수의 값으로 확장되지만 결과는 단어 분할 또는 경로 이름 확장이 아닙니다. 즉, 변수 확장을 왼쪽에서 인용하지 않은 채로 두는 것이 완벽하게 안전하지만 변수 확장이 오른쪽에서 발생한다는 것을 알아야합니다.
따라서 다음 [[ $x =~ [$0-9a-zA-Z] ]]
과 같이 작성 $0
하면 정규 표현식이 해석되기 전에 오른쪽 정규 표현식 내부가 확장되어 정규 표현식이 컴파일되지 않을 수 있습니다 ( $0
ASCI 값이 다음보다 작은 숫자 또는 구두점 기호로 끝 이 확장되지 않는 한). 숫자). 당신과 같이-오른쪽을 인용하는 경우 [[ $x =~ "[$0-9a-zA-Z]" ]]
, 다음, 오른쪽은 일반 문자열이 아닌 정규식으로 처리됩니다 (그리고 $0
여전히 확장됩니다). 이 경우에 정말로 원하는 것은[[ $x =~ [\$0-9a-zA-Z] ]]
마찬가지로 [[
및 사이 ]]
의 표현식은 정규식이 해석되기 전에 단어로 분할됩니다. 따라서 정규식의 공백은 이스케이프하거나 따옴표로 묶어야합니다. 문자, 숫자 또는 공백을 일치 시키려면 다음을 사용할 수 있습니다 [[ $x =~ [0-9a-zA-Z\ ] ]]
.. 마찬가지로 다른 문자도 이스케이프 처리해야합니다 (예 #
: 인용되지 않은 경우 주석이 시작됨). 물론 패턴을 변수에 넣을 수 있습니다.
pat="[0-9a-zA-Z ]"
if [[ $x =~ $pat ]]; then ...
bash의 어휘 분석기를 통과하기 위해 이스케이프되거나 인용되어야하는 많은 문자를 포함하는 정규식의 경우 많은 사람들이이 스타일을 선호합니다. 그러나주의하십시오.이 경우 변수 확장을 인용 할 수 없습니다 .
if [[ $x =~ "$pat" ]]; then ...
마지막으로, 당신이하려는 일은 변수에 유효한 문자 만 포함되어 있는지 확인하는 것입니다. 이 검사를 수행하는 가장 쉬운 방법은 잘못된 문자가 포함되어 있지 않은지 확인하는 것입니다. 즉, 다음과 같은 표현입니다.
valid='0-9a-zA-Z $%&#'
if [[ ! $x =~ [^$valid] ]]; then ...
!
테스트를 부정하여 "일치하지 않음"연산자로 바꾸고 [^...]
정규식 문자 클래스는 "이외의 모든 문자"를 의미합니다 ...
.
매개 변수 확장과 정규식 연산자의 조합은 bash 정규식 구문을 "거의 읽기"로 만들 수 있지만 여전히 몇 가지 문제가 있습니다. (항상 있지 않습니까?) 하나는 맨 처음을 제외하고는 인용 ]
되어 $valid
있어도에 넣을 수 없다는 것 $valid
입니다. (그것은 Posix 정규식 규칙입니다. ]
문자 클래스 에 포함 하려면 시작 부분으로 이동해야합니다. -
시작 또는 끝 부분에 이동할 수 있으므로 ]
및 둘 다 -
필요하면로 시작 ]
하고로 끝나야합니다 -
. 정규식 "I know what I 'm doing"이모티콘으로 이어집니다. [][-]
)