쉘(/bin/sh)에서 if not 문을 만드는 방법은 무엇입니까?

쉘(/bin/sh)에서 if not 문을 만드는 방법은 무엇입니까?

커밋하기 전에 커밋 메시지를 확인하기 위해 쉘을 사용하여 git Hook 파일을 작성하고 있습니다. 저는 완전 초보자입니다. 제가 시도한 것은 다음과 같습니다.

commit-msg후크 파일은 다음과 같습니다.

#!/bin/sh
msg=`head -n 1 $1`


if echo $msg | egrep -qv '(Android-\d{3,4}.{20,})'; then
  echo "[Message Format] Your message is not formatted correctly. Correct message format\n 
    #Ticket Number - Minimum 20 or more Character \n 
    like #Android-123 Bug fixed for login issue"
  exit 1;
fi

그래서 다음과 같은 커밋 메시지를 만들 때마다:

git commit -m " #Android-123 I pretty sure this is more than 20 character,but it still failed to commit"

따라서 내 커밋 메시지가 20자 이상이고 티켓 번호도 있다고 확신하지만 커밋할 때마다 내가 설정한 오류가 계속 발생합니다.

내 논리 문제는 을 사용해야 한다는 것입니다 if not echo $msg | egrep -qv '(Android-\d{3,4}.{20,})'. 그래서 다음을 시도했습니다.

 if ! [[echo $msg | egrep -qv '(Android-\d{3,4}.{20,})']] ; 
 then....

하지만 이로 인해 다음과 같은 오류가 발생합니다. .git/hooks/commit-msg: line 5: syntax error near unexpected token !'

질문:

  1. 올바른 커밋 메시지를 작성했음에도 불구하고 커밋에 실패한 원인이 무엇입니까?

  2. 어떻게 해결할 수 있나요?

답변1

귀하의 정규식은 와 같은 PCRE 구문을 사용 \d하지만 grep -E(그것은 귀하의 것이지만 대신 egrep사용하는 것은 더 이상 사용되지 않습니다) 그것을 이해하지 못합니다. 또한 거기에는 괄호가 필요하지 않으며 실제로 아무것도 캡처하지 않습니다. GNU가 있는 경우 다음을 대신 사용할 수 있습니다 .grep -Eegrepgrepgrep -P

grep -Pqv 'Android-\d{3,4}.{20,}'

\d그렇지 않은 경우 다음으로 교체해야 합니다 [0-9].

grep -Eqv 'Android-[0-9]{3,4}.{20,}' 

그러나 파일의 첫 번째 줄만 가져올 필요는 없으며 전체 파일을 직접 grep하면 됩니다. 또한 일치 항목( )을 뒤집을 필요도 없습니다 -v. 이는 상황을 복잡하게 만들 뿐입니다. if !조건을 무효화하는 데 사용하는 더 간단하고 작동하는 스크립트 버전은 다음과 같습니다 .

#!/bin/sh
if ! grep -E 'Android-[0-9]{3,4}.{20,}' "$1"; then
  printf "[Message Format] Your message is not formatted correctly. Correct message format: 
    #Ticket Number - Minimum 20 or more Character 
    like #Android-123 Bug fixed for login issue\n"
  exit 1;
fi

답변2

여기서는 다음을 수행합니다.

#! /bin/sh -
file="${1?No file specified}"

die() {
  printf >&2 '%s\n' "$@"
  exit 1
}

awk '
  BEGIN {ret = !ok}
  /^#Android-[[:digit:]]{3,4}[^[:digit:]].{19}/ {ret = ok}
  {exit}
  END {exit ret}' < "$file" || die \
    '[Message Format] Your message is not formatted correctly. Correct message format:' \
    '#Ticket Number - Minimum 20 or more Character' \
    'like #Android-123 Bug fixed for login issue'

( ^줄 시작 부분에 티켓 번호가 필요하지 않은 경우 제거하십시오).

관련 정보