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

时间:2018-06-15 06:57:54

标签: bash git-bash

目标:编写客户端git hook以检查符合策略的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。

2 个答案:

答案 0 :(得分:1)

尝试

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

甚至

if ! echo "$FIRST_LINE" | grep -Eq "$PATTERN"; 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:]]

答案 1 :(得分:0)

@Socowi的答案我认为是正确的答案。

你可以用另一种方式写,如果你习惯使用grep文件可能更直观(我通常会弄乱模式和字符串的顺序来比较),或者至少是我使用的那个因为默认只是因为,

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