shell步骤中的Groovy插值(Jenkins管道)

shell步骤中的Groovy插值(Jenkins管道),jenkins,groovy,sh,string-interpolation,Jenkins,Groovy,Sh,String Interpolation,出于好奇,我有一个关于shell步骤中groovy行为的问题 我在Jenkins中定义了一个环境变量REGISTRY_和一个构建参数版本。我知道Groovy要对变量进行替换,它们需要用双引号括起来,根据经验,下面的示例是有效的 示例: dir('metrics/metrics client'){ “嘘” .... docker build-t“${REGISTRY\u AT}”/metrics客户端:“${VERSION}”。 ''' }在这种情况下,没有字符串插值。因为您将变量REGISTR

出于好奇,我有一个关于shell步骤中groovy行为的问题

我在Jenkins中定义了一个环境变量REGISTRY_和一个构建参数版本。我知道Groovy要对变量进行替换,它们需要用双引号括起来,根据经验,下面的示例是有效的

示例:

dir('metrics/metrics client'){
“嘘”
....
docker build-t“${REGISTRY\u AT}”/metrics客户端:“${VERSION}”。
'''

}
在这种情况下,没有字符串插值。因为您将变量
REGISTRY_AT
VERSION
定义为环境变量,所以它们也作为环境变量存在于shell脚本中


因此,在三个单引号处没有字符串插值,但是shell脚本本身有字符串插值。

在本例中,没有字符串插值。因为您将变量
REGISTRY_AT
VERSION
定义为环境变量,所以它们也作为环境变量存在于shell脚本中


因此,在三重单引号处没有字符串插值,但在shell脚本本身中有字符串插值。

三重单引号字符串不插值。在您的例子中可以看到,groovy并没有完成插值,但它只是按原样发送字符串,除了转义字符。三重单引号字符串不进行插值。在你的例子中,插值不是由groovy完成的,但它只是按原样发送字符串,除了转义字符。你是说groovy在这种情况下没有做任何事情(根据文档),因为字符串由单引号定义并按原样传递,但另一方面,当shell进程接收到这个字符串时,它会扩展变量,因此在shell扩展中删除了“”。因此我一直遵循你的逻辑,直到shell部分。基本上,当您使用三重单引号时,它就像用shell代码传递一个文件,然后通过
shmyfile.sh
运行它。行
docker build-t“${REGISTRY\u AT}”/metrics client:“${VERSION}”
是shell字符串插值。这与groovy没有任何关系。同样,字符串插值按预期工作的原因是Jenkins将这些变量作为环境变量注入。例如,如果您使用PowerShell,您可以通过
$env:REGISTRY\u在
上访问这些变量。我错了,没有使用、、插值”术语。我理解您的意思()谢谢您的解释。哦,好的,我想我明白了。那么您是说groovy在这种情况下不做任何事情(根据文档)由于字符串由单引号定义,并按原样传递,但当shell进程接收到该字符串时,它会扩展变量,因此“在外壳扩展中被删除。因此我遵循您的逻辑,直到外壳部分。基本上,当您使用三重单引号时,它就像用shell代码传递一个文件,然后通过
shmyfile.sh
运行它。行
docker build-t“${REGISTRY\u AT}”/metrics client:“${VERSION}”
是shell字符串插值。这与groovy没有任何关系。同样,字符串插值按预期工作的原因是Jenkins将这些变量作为环境变量注入。例如,如果您使用PowerShell,您可以通过
$env:REGISTRY\u在
访问这些变量。我的错误是没有使用、、插值”术语。我理解您的意思()谢谢您的解释。