Сценарий оболочки, если условие не работает в хуке предварительной фиксации SVN

Нужна помощь

Я пытался улучшить ловушку перед фиксацией, чтобы посмотреть, смогу ли я игнорировать анализ сообщения фиксации, если в сообщении фиксации есть определенный ключ ("! Ignore")

Условия if, предшествующие этому, любят проверять наличие пустых коммитов. Но это если условие как-то не работает.

Хорошо, когда я делаю коммит с сообщением "SMARTCOMMITTEST", которое не содержит мой контрольный ключ "! Ignore", коммит завершается успешно, что означает, что условие If ниже никогда не выполнялось или не выполнялось, как ожидалось. Поэтому пытаюсь понять, что не так с этим.

SMARTCOMMIT=1 
$SVNLOOK log -t "$TXN" "$REPOS" | grep "!ignore" | wc -c || SMARTCOMMIT=0
if [ $SMARTCOMMIT = 0];      
then
echo "Please use !ignore if you dont want to use smart commits in your commit message." 1>&2
exit 1
fi

Большое спасибо Итану за несколько советов...

Я изменил условие, как и другое, если условие в комментариях, и тогда это сработало

SMARTCOMMIT=$($SVNLOOK log -t "$TXN" "$REPOS" | grep "!ignore" | wc -c)                
if [ "$SMARTCOMMIT" = "0" ];  then
echo "Please use !ignore if you dont want to use smart commits in your commit message." 1>&2
exit 1
fi

Этот работал нормально..

@ Дэвид У.. Теперь у меня есть ситуация, чтобы проверить несколько условий в одном и том же

SMARTCOMMIT=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '!ignore' | wc -c)
COMMITMESSAGENOREVIEW=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '#comment' | wc -c)
COMMITMESSAGEWITHREVIEW=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '+review' | wc -c)
 
if [ "$SMARTCOMMIT" =  "0" -a "$COMMITMESSAGENOREVIEW" = "0" -a "COMMITMESSAGEWITHREVIEW" = "0" ]; then
echo "Please use #comment or +review to enable smart commits or !ignore to not use smart commits." 1>&2
exit 1
fi

Я попытался, как указано в ссылке здесь, но все же я не вижу, чтобы условие if выполнялось вообще. Можете ли вы помочь мне с этим сейчас?

1 ответ

if оператор может просматривать выходные данные команды, поэтому вам не нужно устанавливать переменную окружения в зависимости от выходных данных:

shopt extglob > /dev/null  && extglob=1
if ! $SVNLOOK log -t "$TXN" "$REPOS" | grep -q '!ignore'
then
    echo 'Please use "!ignore" if you dont want to use smart commits in your commit message.' 1>&2
    exit 1
fi

Это работает $SVNLOOK log -t "$TXN" "$REPOS" | grep -q '!ignore'

-q это тихий режим. grep либо выходит из нуля, если строка существует, либо не равна нулю, если она не существует. Поместив это в if !, then предложение выполняется только если !ignore был найден.

Вы должны убедиться, что !ignore окружен одинарными кавычками, или вы положили \ напротив !, В Bash есть механизм истории типов csh, и его невозможно отключить. Каждый раз, когда оболочка видит !, предполагается, что это связано с идентификатором процесса.

Другие вопросы по тегам