Jenkins groovy字符串插值可以嵌套吗?
我试图在Jenkins groovy shell脚本中添加参数,然后想知道groovy字符串插值是否可以像这样嵌套使用Jenkins groovy字符串插值可以嵌套吗?,jenkins,groovy,Jenkins,Groovy,我试图在Jenkins groovy shell脚本中添加参数,然后想知道groovy字符串插值是否可以像这样嵌套使用 node{ def A = 'C' def B = 'D' def CD = 'Value what I want' sh "echo ${${A}${B}}" } 那么我所期待的是这样的, 'Value what I want' 好像我做了 sh "echo ${CD}" 但它给出了一些错误,即在步骤[…]中找不到$ 这不可能吗?${
node{
def A = 'C'
def B = 'D'
def CD = 'Value what I want'
sh "echo ${${A}${B}}"
}
那么我所期待的是这样的,
'Value what I want'
好像我做了
sh "echo ${CD}"
但它给出了一些错误,即在步骤[…]中找不到$
这不可能吗?
${A}${B}
不是正确的groovy语法
插值只是在${}
之间插入表达式的值
即使您更改为正确的语法并创建$
方法,结果也不会是您想要的
def nested = "${${A}+${B}}"
println nested
static $(Closure closure) { //define $ method
closure.call()
}
CD
将被打印。像这样吗
import groovy.text.GStringTemplateEngine
// processes a string in "GString" format against the bindings
def postProcess(str, Map bindings) {
new GStringTemplateEngine().createTemplate(str).make(bindings).toString()
}
node{
def A = 'C'
def B = 'D'
def bindings = [
CD: 'Value what I want'
]
// so this builds the "template" echo ${CD}
def template = "echo \${${"${A}${B}"}}"
// post-process to get: echo Value what I want
def command = postProcess(template, bindings)
sh command
}
关于公认的答案,如果您在地图中输入值,那么您可以插入[key]:
def A = 'C'
def B = 'D'
def bindings = [ CD: 'Value what I want' ]
bindings["${A}${B}"] == 'Value what I want'
谢谢到目前为止看起来是这样的,所以我发布了一个问题来确认是否有人可能知道。我没有在詹金斯尝试过。但如果运行此脚本,它将打印
echo${CD}
。我猜这就是OP想要的。如果没有,那么我不理解这个问题。我要找的是打印CD的值-“我想要的值”。我使用GStringTemplateEngine更新了我的答案。唯一的改变是你需要把你的“占位符”放在地图上。之所以在一行中“嵌套”不简单,是因为Groovy实际上在编译时处理普通字符串中的占位符,所以当占位符名称仅在运行时(即生成)时才知道时,您不能简单地执行此操作。我在你的代码上修正了一些拼写错误,它能正常工作。