Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell/Git脚本:当前提交消息的模式匹配_Git_Bash_Shell - Fatal编程技术网

Shell/Git脚本:当前提交消息的模式匹配

Shell/Git脚本:当前提交消息的模式匹配,git,bash,shell,Git,Bash,Shell,我正在尝试为您将要在git上提交的消息创建一个钩子。我通常在即将提交时做的是[SOME_DESCRIPTION]Refs#[0-9]+ 我以前从未做过shell脚本编写,但总体上我相当擅长编程。我正在尝试用commit msg编写一个脚本,该脚本将验证您试图保存的当前数据是否具有模式“*Refs#[0-9]+”。但是我没有shell语法的经验,也没有太多的linux 我认为$1是为了得到当前的提交消息,但我可能错了 我检查模式的方法可能是错误的 requireTicketRef=$1 如果[

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

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

  • 我认为$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
”和“
-
“,但空格是一个无效的短选项。)谢谢大家的评论。对答案进行了大量修改。