Я пытаюсь создать ловушку git commit-msg, которая включает простое регулярное выражение для проверки сообщения журнала. Он не работает с использованием обычного синтаксиса bash.
Я пробовал использовать очень простое регулярное выражение, но оно все еще не работает.
Есть идеи, что я делаю неправильно?
Вот простой пример, включающий очевидное совпадение, но выводящий "нет совпадения"
#!/bin/bash
message = "[GLSD-0000]"
echo "Message: '$message'"
regex = "\[GLSD-\w+\]"
if [[ $message =~ $regex ]]; then echo "yes";else echo "no match!"; fi
Использование git версии 2.18.0.windows.1
Несколько замечаний по вашей попытке,
#!/bin/sh
не поддерживает операцию регулярного выражения в bash
, даже если вы ее не использовали. Вы должны использовать оболочку Bourne Again bash
(#!/usr/bin/env bash)
.[[..]]
с =
сопоставляет строку левого операнда с правым операндом. Для поддержки регулярных выражений необходимо использовать оператор ~
.bash
поддерживает только минимальную версию ERE (расширенное регулярное выражение), в которой не поддерживается \w
(все слова).Итак, в сценарии, предназначенном для оболочки bash
, вы должны писать его как
#!/usr/bin/env bash
# equivalent of '\w' in the regex flavor supported by bash
re='\[GLSD-[A-Za-z0-9_]+\]'
msg='[GLSD-0000]'
[[ $msg =~ $re ]] && echo "yes" || echo "no match!"
Кроме того, /bin/sh
изначально не поддерживает [[ ]]
.
И разве 1
, вероятно, не должен быть $1
? 1
всегда буквенно-цифровой, и тест не имеет смысла.
Спасибо @BenjaminW. . Я оставлю это оператору, чтобы использовать его по своему усмотрению.
Приносим извинения за ошибки в транскрипции. См. Исправленный
@VictorGrazi: обновлено в соответствии с вашим примером
Bash обычно не поддерживает универсальные символьные типы в стиле Perl, такие как
\w
. Вместо этого прочтите Расширенные регулярные выражения POSIX (или обратитесь кman re_format
, если он доступен на вашем локальном компьютере).