Как сделать оператор if not в оболочке (/bin/sh)?

Как сделать оператор if not в оболочке (/bin/sh)?

Я использую shell для записи файла 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-ить весь файл напрямую. Вам также не нужно обращать соответствие ( -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'

(удалите , ^если вам не нужно, чтобы номер билета был в начале очереди).

Связанный контент