Jenkins 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}" 但它给出了一些错误,即在步骤[…]中找不到$ 这不可能吗?${

我试图在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}"
但它给出了一些错误,即在步骤[…]中找不到$


这不可能吗?

${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实际上在编译时处理普通字符串中的占位符,所以当占位符名称仅在运行时(即生成)时才知道时,您不能简单地执行此操作。我在你的代码上修正了一些拼写错误,它能正常工作。