bash 旧版本中的正则表达式模式匹配

Regex pattern matching in old versions of bash

目的:编写客户端git钩子来检查commit-msg是否符合策略。

为此,我编写了一个 bash 脚本,将提交消息的模式与正则表达式相匹配。
它似乎适用于更新版本的 bash

if [[ ! "$START_LINE" =~ $PATTERN ]]; then

=~ 似乎不适用于旧版本的 bash。

$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys
Copyright (C) 2005 Free Software Foundation, Inc.
PATTERN="^[[:alpha:]]{2,6}[-][[:digit:]]{0,9}[-](AISP|PISP)[-][v][[:digit:]][.][[:digit:]]"

我的队友使用的是旧版本 bash,我不能强迫他们换成新版本。有没有一种方法可以在不使用 =~ 运算符的情况下完成模式匹配? 确切错误:

$ git commit -m "dsdsd" .git/hooks/commit-msg: line 5: conditional
binary operator expected .git/hooks/commit-msg: line 5: syntax error
near =~' .git/hooks/commit-msg: line 5: if [[ ! "$START_LINE" =~
$PATTERN ]]; then'

我浏览了互联网上的所有帖子,包括 SO,但他们都建议使用 =~ 或转向新版本的 bash。

尝试

if ! echo "$FIRST_LINE" | grep -Eqe "$PATTERN"; then

或(如果您的 shell 支持此处字符串 <<<

if ! grep -Eqe "$PATTERN" <<< "$FIRST_LINE"; then

PS: 按照惯例,全大写变量名保留给环境和 shell 变量。使用 $pattern$firstLine 等小写变量以避免意外名称冲突。

PPS: 您的正则表达式可以稍微简化。 [v]v 等同。

^[[:alpha:]]{2,6}[-][[:digit:]]{0,9}-[-][v][[:digit:]][.][[:digit:]]
^[[:alpha:]]{2,6}-[[:digit:]]{0,9}--v[[:digit:]]\.[[:digit:]]

@Socowi 的回答我认为是正确的

您可以用另一种方式写入,如果您习惯于对文件使用 grep 可能会更直观(我通常会弄乱要比较的模式和字符串的顺序),或者至少是正因为如此,我才使用默认值,

if ! grep -Eq "$PATTERN" <(echo "$FIRST_LINE"); then