0

我正在尝试为您将要在 git 上提交的消息做一个钩子。我通常在提交时做的是 [SOME_DESCRIPTION] Refs #[0-9]+

我以前从未编写过 shell 脚本,但总的来说我相当擅长编程。我正在尝试在 commit-msg 中编写一个脚本,该脚本将验证您尝试保存的当前是否具有模式“*Refs #[0-9]+”。但是我没有shell语法经验,也没有太多的linux。

  • 我认为 $1 是为了获取当前的提交消息,但我可能错了。
  • 而且我检查模式的方式可能是错误的
requireTicketRef=$1
if [[ $requireTicketRef == *Refs \#[0-9]+ ]]
then
    echo "Contains ticket reference"
    exit 0
else
    echo "Need to add ticket reference"
    exit 1
fi
4

1 回答 1

1

假设您是正确$1的提交消息,您的代码很接近,但是 bash 使用的模式 with ==in [[...]]不是正则表达式。相反,它们与用于扩展文件名的通配符相同,通常称为“globs”,通常无法量化特定匹配项(如“1 个或多个数字”)。

(它们也必须是一个单词,所以你需要在Refs和之间的空格前加上一个反斜杠。当它不是单词中的第一件事时,#你实际上不需要一个反斜杠。)#

你有几个选项来解决这个问题。最简单的可能是使用实际的正则表达式,你可以在里面[[......]]通过使用=~而不是==

if [[ ! $requireTicketRef =~ Refs\ #[0-9]+ ]]; then 
  echo >&2 "Need to add ticket reference."
  exit 1
fi

另一个选项是打开extglob("extended glob") 选项,该选项从 Korn shell 中借用一些语法,为 glob 模式带来类似正则表达式的功能(否定、交替、量化)。

shopt -s extglob
if [[ ! $requireTicketRef == *Refs\ #+([0-9])* ]]; then 
  echo >&2 "Need to add ticket reference."
  exit 1
fi
于 2013-05-07T02:23:22.557 回答