문자열 패턴 일치 = ~

= ~ in bash .

다음 함수를 작성했습니다 ( 놀라지 마십시오. md5sum을 사용한 보안 접근 방식이 아니라 실험적입니다.

md5 () { [[ "$(md5sum $1)" =~ $2* ]] && echo fine || echo baarr; } 

그리고 약간의 입력으로 테스트했습니다. 여기에 몇 가지 참조가 있습니다.

md5sum wp.laenderliste b1eb0d822e8d841249e3d68eeb3068d3 wp.laenderliste 

제어 합계의 소스에 이미 파일 이름이있는 두 개의 공백이 포함되어 있지 않으면 비교하기가 불필요하게 어렵습니다. “관찰의 출처이지만 그 문제를 해결하는 여러 방법보다 더 흥미로운 점은 내 관찰이었습니다.

제어 변수를 정의하고 너무 짧지 만 일치하는 문자열로 함수를 테스트합니다.

p>

ok=b1eb0d822e8d841249e3d68eeb3068d3 for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i} ;done fine fine fine fine 

그것은 “wp.laenderliste”누락 된 불일치를 무시하고 따라서 더 긴 불일치를 무시하는 것이 함수의 목적이기 때문에 예상되고 괜찮습니다. .

이제 일치하지 않는 임의의 항목을 추가하면 당연히 오류가 발생하고 오류가 발생합니다.

for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}GU ;done baarr baarr baarr baarr 

예상대로입니다.하지만 마지막으로 일치하지 않는 문자가 하나만 있으면 어떻게되는지 확인하세요.

for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}G ;done fine fine fine fine 

이게 어떻게 작동해야하는지 모를 때 나입니까 (선택이 깨짐) 또는 bash의 패턴 일치에 실제로 하나의 오류가 있습니까?

카운트 1의 문자열 문제 중간의 불일치 :

for i in 5 9 e ; do echo md5 wp.laenderliste ${ok//$i/_} ;done md5 wp.laenderliste b1eb0d822e8d841249e3d68eeb3068d3 md5 wp.laenderliste b1eb0d822e8d84124_e3d68eeb3068d3 md5 wp.laenderliste b1_b0d822_8d841249_3d68__b3068d3 for i in 5 9 e ; do md5 wp.laenderliste ${ok//$i/_} ;done fine baarr baarr 

bash 버전 :

bash -version GNU bash, Version 4.3.48(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc. Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html> 

면책 조항 : md5sum은 공격이 아닌 의도하지 않은 실수에 대해서만 유용합니다. 사용을 권장하지 않습니다.

이 질문은 더 나은 솔루션이나 해결 방법을 찾는 것이 아닙니다. = ~

연산자, 작동해야하는지 여부와 작동해야하는 경우 그 이유.

답변

([[ ]])의> =~는 정규 표현식 패턴 일치 (또는 검색 )입니다. 아래 참조 ). 이는 파일 이름 와일드 카드와 동일한 패턴을 사용하는 = (또는 ==)와 다릅니다.

In 특히 정규 표현식의 별표는 “이전 단위의 사본 0 개 또는 1 개”를 의미하므로 abc*ab + 0 개 이상을 의미합니다. c s.

귀하의 경우, 후행 별표는 함수 인수의 마지막 문자를 선택적으로 만듭니다. 마지막 예제에서 패턴은 , G*는 빈 문자열과 일치하므로 ...68d3와 같은 문자열과 일치합니다.”모든 문자열에 대한 정규식 “는 .* 또는”any character, any number of times “입니다.

정규식 일치는 문자열에서 일치하는 항목을 검색하지만 그렇지 않습니다. “ 전체 문자열 일 필요는 없습니다. 따라서 cde 패턴은 문자열 abcdefgh에서 찾을 수 있습니다.

다음과 같은 것을 사용할 수 있습니다.

[[ "$(md5sum "$1")" = "$2 "* ]] && echo ok 

정규식 일치가 실제로 필요하지 않으며 md5sum가 후행 공백 ( 플러스 파일 이름) 어쨌든 패턴에서이를 사용하여 전체 패턴과 일치하는지 확인할 수 있습니다. 따라서 함수에 잘린 해시를 제공하면 일치하지 않습니다.

코멘트

  • 아, 지금은 더럽습니다. 저는 패턴 매칭을 사용할 때 주로 sed를 사용합니다. 물론. *를 사용해야하고 알고 있어야합니다. 어떻게 든 지금은 분명히 잘못된 생각을 배웠습니다. 셸의 점을 잊으려면 ' 파일 이름 일치의 경우 일뿐입니다. 맞습니까? case / esac의 경우 점도 필요합니까? I ' 이제 너무 멍청 해 보입니다!;)
  • @userunknown, case는 파일 이름과 동일한 패턴을 사용합니다. 일치하므로 *는 모든 항목과 일치하며 점은 점입니다. 나는 =~가 정규식을 사용하는 쉘의 유일한 장소라고 생각합니다. (물론 ksh / Zsh / Bash는 정규식과 거의 동일한 기능을 갖지만 구문이 다른 glob을 확장했습니다.하지만 Bash에서 명시 적으로 활성화해야합니다.)
  • 또한 [ "$(md5sum < "$1")" = "$2 -" ]를 사용하여 ksh / zsh / bash에 대한 종속성을 제거하고 이름이 -로 시작하는 파일의 문제를 방지합니다.
  • 좋아, 그건 좋은 변명이다. 따라서 대략적인 기억, 쉘에서의 패턴 매칭은 복잡합니다. 적어도 옳았습니다. 이제 기분이 훨씬 나아졌습니다. 🙂 이제 = $2.*를 시도했는데 이것도 작동하지만 " $ 2 " *는 나아지 다.하지만 실험에 불과했기 때문에 ' 학습 경험 외에는 사용하지 않았습니다.

답변

여기서 정규식을 사용하지 않고 문자열 비교 만 사용합니다.

md5 () { sum=$(md5sum "$1" | awk "{print $1}") [[ $sum = "$2" ]] && echo fine || echo baarr; } 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다