Jenkins报告构建shell语法错误但bash中没有错误

时间:2016-08-18 09:57:56

标签: shell jenkins

我想在Jenkins(v.2.17)构建步骤' Execute shell'

中读取 gradle.properties 文件中工件ID的值。

要阅读的行是这样的:artifactId = myArtifact

我使用的脚本命令:

ARTIFACT_ID=$((grep -Po "(?<=^artifactId).*" gradle.properties) | tr -d '=' | tr -d ' ')

jenkins作业因此错误而失败:

  

/tmp/hudson7118904411564834774.sh:19:/tmp/hudson7118904411564834774.sh:语法错误:缺少&#39;))&#39;

但是,我可以使用bash中的适当用户在作业工作区目录中的同一构建机器上执行此命令行,并且我没有语法错误!为什么它在Jenkins中不起作用?

我知道这行由于之前和之后的调试输出而失败。没有更改目录命令,即。脚本的工作目录仍然是作业的工作空间目录。

2 个答案:

答案 0 :(得分:2)

问题是$((算术扩展的开头,与$((x + y))一样,需要终止))令牌。如果要在命令替换中使用子shell,请使用额外的空格以避免合并标记$((

ARTIFACT_ID=$( ( grep ... ) ... )

正如Jonathan Leffler正确地观察到的那样,在你的特定命令中,( grep )的子shell是无用的,可以被删除。

答案 1 :(得分:0)

这个花了我一会儿!似乎Jenkins shell不喜欢我的括号。此命令按预期工作:

ARTIFACT_ID=$( grep -Po "(?<=^artifactId).*" gradle.properties | tr -d '=' | tr -d ' ' )