我想在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中不起作用?
我知道这行由于之前和之后的调试输出而失败。没有更改目录命令,即。脚本的工作目录仍然是作业的工作空间目录。
答案 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 ' ' )