目标:编写客户端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。
答案 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