シェル (/bin/sh) で if not ステートメントを作成するにはどうすればよいでしょうか?

シェル (/bin/sh) で if not ステートメントを作成するにはどうすればよいでしょうか?

私は、コミット前にコミット メッセージを確認するために、シェルを使用して git フック ファイルを作成しています。私は完全な初心者ですが、次のことを試しました。

私の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 構文が使用されています\dgrep -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 できます。また、一致を逆にする必要もありません ( )。これは物事を複雑にするだけです。以下は、条件を否定するために-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'

^(チケット番号を行の先頭に置く必要がない場合は、を削除します)。

関連情報