シェル(/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構文(たとえば\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できます。また、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

おすすめ記事