쉘 스크립트에서 테스트 연산자를 사용하여 문자열을 정규식과 비교할 수 없습니다.

쉘 스크립트에서 테스트 연산자를 사용하여 문자열을 정규식과 비교할 수 없습니다.

사용자가 git commit-message 창에서 형식화되지 않은 메시지를 제공하지 못하도록 제한하려고 합니다. 이를 위해 일부 형식화된 정규 표현식을 생성하고 이를 commit-msg 후크에 넣어 보았습니다.
하지만 git commit-message 문자열을 아래 정규식과 비교할 수 없습니다.

이 문제를 해결하는 데 도움을 주실 수 있나요?

regex="[A-Z]{3,}-[0-9][0-9]* #time (?:[0-9]+[wdhm])+ #comment (.|\n)*"
file=`cat $1`

echo $regex
echo $file

if [[ "$file" =~ $regex ]]; then
        echo "Valid date"
    else
        echo "Pre-Commit hook is failed. commit-message format not met regex    pattern Eg: TEST-123 #time 2w #comment added second line"
        exit 1
fi

답변1

  • (?:...)Perl 정규식 연산자입니다. 쉘에서 사용하려면 zsh또는 가 필요합니다 ksh93. bash그들의 지원 없이. 어쨌든 (...)여기서는 표준 ERE를 사용할 수 있습니다.
  • \n일치하는 항목은 POSIX 확장 정규식에도 지정되지 않지만 bash(대부분의 시스템에서는 일치함 n) .ERE의 줄 바꿈도 어쨌든 일치됩니다 .
  • 어쨌든, 정규식은 [[ ... =~ ... ]]연산자 에 고정되어 있지 않으므로 <anything>*적어도 빈 문자열과 일치하므로 확실히 일치하므로 끝에 있는 모든 항목은 중복됩니다.
  • [A-Z]실제로 POSIX 로케일 외부의 콘텐츠 일치는 매우 무작위입니다. 이는 아마도 영어 알파벳의 26개 대문자와 일치할 것이지만 더 많은 문자와 일치할 수도 있습니다(아마도 문자 시퀀스일 수도 있음)
  • 동일합니다. [0-9] 로케일 및 시스템 일치 십진수 및 임의의 문자에 따라 다릅니다.
  • $1인용되지 않은 인수 확장은 쉘에서 매우 특별한 의미를 가지며, / 인용되지 않은 인수 를 그대로 둘 이유가 없습니다 $regex....
  • 임의의 인수를 명령에 전달할 때 해당 인수가 옵션으로 처리되지 않도록 해야 합니다. 따라서 file=$(cat -- "$1")또는 file=$(cat < "$1")ksh/zsh/bash를 사용합니다: ( file=$(<"$1")실패 시 0이 아닌 종료 상태를 반환하지 않을 수도 있지만).
  • echo임의의 데이터와 함께 사용할 수 없습니다
  • 다음 명령을 실행하기 전에 명령의 성공/실패 여부를 확인하는 것이 좋습니다.
  • 오류는 일반적으로 stderr로 전송되어야 합니다.

uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ
digit=0123456789
regexp="^[$uppercase]{3,}-[$digit]+ #time ([$digit]+[wdhm])+ #comment "

file=$(cat < "$1") || exit
printf '%s\n' "regexp: $regexp" "file: $file"

if [[ "$file" =~ $regexp ]]; then
  echo valid
else
  echo >&2 invalid
  exit 1
fi

몇 가지 추가 참고 사항:

  • $(cat < "$1")스트립 위의 명령 대체모두후행 개행 문자. 따라서 뒤에 오는 빈 줄은 파일 내용에서 제거됩니다.
  • bash반대로 zshNUL 문자는 해당 변수에 저장할 수 없습니다. 입력 파일에 일부가 포함되어 있으면 경고 메시지와 함께 삭제됩니다(아마도 그럴 것입니다).

¹ On my GNU system, in a en_GB.UTF-8 locale (typical in Britain), it matches on at least ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸƁƆƇƊƎƏƐƓƘƟƠƢƯƳDŽDžLJLjNJNjǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬDZDzǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȘȚȜȞȦȨȪȬȮȰȲḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸ

관련 정보