シェルスクリプトでは、テスト演算子を使用して文字列を正規表現と比較することはできません。

シェルスクリプトでは、テスト演算子を使用して文字列を正規表現と比較することはできません。

ユーザーが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またはが必要ですksh93bash彼らのサポートなし。とにかく、(...)ここでは標準EREを使用できます。
  • \n一致するものはPOSIX拡張正規表現にも指定されていませんがbash(ほとんどのシステムでは一致しますn)、.EREの改行もとにかく一致します。
  • とにかく、正規表現は[[ ... =~ ... ]]演算子に固定されていないため、<anything>*少なくとも空の文字列と一致するため、確実に一致するため、最後のすべての項目は重複します。
  • [A-Z]実際、POSIX ロケール外のコンテンツの一致は非常にランダムです。これはおそらく英語のアルファベットの26の大文字と一致しますが、より多くの文字と一致する可能性があります(おそらく文字シーケンスかもしれません)
  • 同じです。[0-9] ロケールとシステムの一致 10 進数とランダムな文字によって異なります。
  • $1引用符で囲まれていない引数拡張はシェルで非常に特別な意味を持ち、/引用符で囲まれていない引数を残す理由はありません$regex...
  • 任意の引数をコマンドに渡すときは、その引数がオプションとして処理されないようにする必要があります。したがって、file=$(cat -- "$1")またはfile=$(cat < "$1")ksh/zsh/bash を使用しますfile=$(<"$1")
  • 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逆にzsh、NUL 文字はその変数に保存できません。入力ファイルに一部が含まれている場合は、警告メッセージとともに削除されます(おそらくそうです)。

¹ 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ǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȘȚȜȞȦȨȪȬȮȰȲḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸ

関連情報