쉘(/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사용 되지 grep -E않음 egrep)을 이해하지 못합니다. 또한 거기에는 괄호가 필요하지 않으며 실제로 아무것도 캡처하지 않습니다. GNU가 있으면 다음을 grep사용할 수 있습니다 grep -P.

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

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

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

그러나 파일의 첫 번째 줄만 가져올 필요는 없으며 전체 파일을 직접 grep할 수 있습니다. 또한 match( )를 뒤집을 필요도 없습니다 -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'

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

관련 정보