在Groovy Shell命令中如何转义美元符号

118次阅读
没有评论

问题描述

在创建一个声明性的Jenkins流水线时,我有一个for循环用于迭代一个bash命令的输出。在该命令中,需要使用bash参数,例如”$1″表示第一个参数。而且这是一个由许多类型引号组成的管道系列。
我尝试使用三重双引号来创建一个原始字符串,但似乎Groovy仍然试图解析”$1″,认为我在尝试引用名为”1″的变量的值。所以,这不是我期望的“原始字符串”行为。
我该如何处理这种情况?

以下是命令的示例:

kubectl get namespaces --no-headers -o=custom-columns=":.metadata.name,:.metadata.creationTimestamp" | grep -E "myproject_" | awk '$2 <= "'$(date -d'now-2 days' -Ins --utc | sed 's/+0000/Z/')'"{print $1}' | sed 's/myproject_//g'

请忽略命令的细节。我的问题纯粹是如何解决美元符号语法错误。实际的命令与此不同。

解决方案

以下解决方案基于Groovy语法,适用于Jenkins流水线等场景。

要在Groovy Shell命令中处理美元符号,有两种方法可以解决。你可以使用单引号字符串或使用反斜杠转义美元符号。

使用单引号字符串

单引号字符串在Groovy中被视为原始字符串,不会对其内容进行变量解析。因此,如果你希望保留美元符号的字面值,可以使用单引号字符串。

def command = 'kubectl get namespaces --no-headers -o=custom-columns=":.metadata.name,:.metadata.creationTimestamp" | grep -E "myproject_" | awk \'$2 <= "' + new Date().format("yyyy-MM-dd'T'HH:mm:ssXXX") + '"{print $1}\' | sed \'s/myproject_//g\''
sh command

在上面的示例中,command变量保存了包含原始bash命令的单引号字符串。然后,通过sh步骤执行该命令。

使用反斜杠转义

在Groovy中,可以使用反斜杠来转义美元符号,从而防止变量解析。

def command = "kubectl get namespaces --no-headers -o=custom-columns=\":.metadata.name,:.metadata.creationTimestamp\" | grep -E \"myproject_\" | awk '\$2 <= \"'${new Date().format("yyyy-MM-dd'T'HH:mm:ssXXX")}'\"{print \$1}' | sed 's/myproject_//g'"
sh command

在上面的示例中,command变量保存了一个双引号字符串,其中美元符号前面加上了反斜杠来防止变量解析。然后,通过sh步骤执行该命令。

请根据你的需求选择其中一种方法,并在Jenkins流水线中适当地使用。需要注意的是,实际情况中,你可能需要根据命令的要求进行一些调整。

注意:此问题已在Stack Overflow上得到解答,你可以在这个链接上找到更多讨论。

正文完