Groovy + Shell:字符转义

5

我是使用Groovy沙盒的Jenkins管道。我正在尝试在groovy sh函数中运行一个shell脚本。

原始的shell脚本是:

sed -i 's/sometext/'"${othertext}"'/' filename

我想替换特定的文本为其他文本(动态获取)。当直接执行脚本时,它可以正常运行。 但是我想在Jenkins Groovy SH函数中使用它。
sh(script: '<above shell script>',  returnStdout:false)

但是有一个转义字符的问题。 我尝试了这种转义字符的方式。

sh (script: '''sed -i 's/sometext/othertext/' filename''', returnStdout:false)

它能正常工作,但是othertext没有被动态获取。有人可以帮我用原始脚本转义字符吗?或者请提供其他方法。


2
你看过 https://gist.github.com/Faheetah/e11bd0315c34ed32e681616e41279ef4 吗?那可能有助于理解转义的一些怪癖。 - mkobit
3个回答

3

在得到来自daggettmkobit的反馈并进行了一些实验后,以下脚本运行良好

def l_othertext = sh(script: 'echo ${othertext}', returnStdout: true).trim()
print('l_othertext='+l_othertext)
sh "sed -i 's/sometext/'${l_othertext}'/' filename"

0

如果othertext是Groovy变量,那么这应该可以工作:

def othertext = 'newtext'
sh (script: """sed -i 's/sometext/${othertext}/' filename""", returnStdout:false)

othertext 不是 Groovy 变量。它是 Jenkins 流水线作业的参数。othertext 是动态的。 - Siddarth
当使用像这样的变量时,要注意插值注入。更安全的选择是使用环境变量(并在Groovy字符串周围使用单引号)。 - Bruno

0
node{
   sh 'sed -i 's/sometext/'"${othertext}"'/' filename'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接