Shell/Git脚本:当前提交消息的模式匹配
我正在尝试为您将要在git上提交的消息创建一个钩子。我通常在即将提交时做的是[SOME_DESCRIPTION]Refs#[0-9]+ 我以前从未做过shell脚本编写,但总体上我相当擅长编程。我正在尝试用commit msg编写一个脚本,该脚本将验证您试图保存的当前数据是否具有模式“*Refs#[0-9]+”。但是我没有shell语法的经验,也没有太多的linuxShell/Git脚本:当前提交消息的模式匹配,git,bash,shell,Git,Bash,Shell,我正在尝试为您将要在git上提交的消息创建一个钩子。我通常在即将提交时做的是[SOME_DESCRIPTION]Refs#[0-9]+ 我以前从未做过shell脚本编写,但总体上我相当擅长编程。我正在尝试用commit msg编写一个脚本,该脚本将验证您试图保存的当前数据是否具有模式“*Refs#[0-9]+”。但是我没有shell语法的经验,也没有太多的linux 我认为$1是为了得到当前的提交消息,但我可能错了 我检查模式的方法可能是错误的 requireTicketRef=$1 如果[
- 我认为$1是为了得到当前的提交消息,但我可能错了
- 我检查模式的方法可能是错误的
requireTicketRef=$1
如果[$requireTicketRef==*Refs\#[0-9]+]]
然后
echo“包含票证引用”
出口0
其他的
echo“需要添加票据参考”
出口1
fi
假设您关于提交消息的$1
是正确的,那么您的代码很接近,但是bash在[[[
..]
中使用的模式不是正则表达式。相反,它们是用于扩展文件名的同一种通配符,通常称为“globs”,通常无法量化特定的匹配项(如“1或更多数字”)
(它们也必须是一个单词,因此在参考
和#
之间的空格前面需要另一个反斜杠。如果#
不是一个单词中的第一件事,那么实际上在#
前面不需要反斜杠。)
你有几个选择来解决这个问题。最简单的方法可能是使用实际的正则表达式,您可以在[[[
..]]
内部使用=~
而不是=
:
if [[ ! $requireTicketRef =~ Refs\ #[0-9]+ ]]; then
echo >&2 "Need to add ticket reference."
exit 1
fi
另一个选项是打开extglob
(“扩展glob”)选项,该选项借用了KornShell的一些语法,将类似regex的功能(否定、替换、量化)引入glob模式
shopt -s extglob
if [[ ! $requireTicketRef == *Refs\ #+([0-9])* ]]; then
echo >&2 "Need to add ticket reference."
exit 1
fi
这里有一些细节不太正确:1)对于
[[
,有一个=~
正则表达式操作符,因此,如果在您的版本中有它,您可以使用正则表达式。2)您不必逃出空格/
如果您不想,您可以使用更可读的*“Refs”+([0-9])
相反。3)您不必在shebang行上指定extglob
,因为bash
不会一次解析整个脚本,它会按块解析,如果您在开始时启用它,您的示例对我有效(更多).3)第一个if
非常令人伤心,因为缺少了分号;-)我刚刚在bash
更改日志中读到,extglob
总是打开(!)如果你使用[
和=
或!
因为bash-4.1-alpha
(可能是为了ksh
兼容性),因此,对于任何最新版本,似乎您只需要单括号表示法的extglob
选项[
。这不是您希望与较旧的bash
版本兼容的东西,但很高兴知道,因为手册页中没有提到这一点。@AdrianFrühwirth-我想说的是在前后加上双引号“Refs#”算作是逃离空间。:)感谢对分号和extglob设置的更正。至于=~
操作符,我应该提到它,但我会远离Bash 4isms,直到它变得更普遍。鉴于我的同事中mac的激增,这可能意味着”不幸的是,在Linux下,您不能将#!/bin/bash-O extglob
放入shebang,因为Linux将shebang的其余部分作为单个arg(单个字符串)传递,而bash认为它被赋予了一个空格作为短选项(将“-O
”解释为“-O
”和“-
“,但空格是一个无效的短选项。)谢谢大家的评论。对答案进行了大量修改。