在 Jenkins 管道文件的 shell 命令中转义双引号

Arc*_*ora 9 bash groovy jenkins

以下是我的 Jenkins 文件中的一个片段 -

stage('Configure replication agents') {
            environment {
                AUTHOR_NAME="XX.XX.XX.XX" 
                PUBLISHER_NAME="XX.XX.XX.XX"
                REPL_USER="USER"
                REPL_PASSWORD="PASSWORD"
                AUTHOR_PORT="4502"
                PUBLISHER_PORT="4503"
                AUTHOR="http://${AUTHOR_NAME}:${AUTHOR_PORT}"
                PUBLISHER="http://${PUBLISHER_NAME}:${PUBLISHER_PORT}"
                S_URI= "${PUBLISHER}/bin/receive?sling:authRequestLogin=1"
            }
            steps {
                sh 'curl -u XX:XX --data "status=browser&cmd=createPage&label=${PUBLISHER_NAME}&title=${PUBLISHER_NAME}&parentPath =/etc/replication/agents.author&template=/libs/cq/replication/templates/agent" ${AUTHOR}/bin/wcmcommand'
            }
Run Code Online (Sandbox Code Playgroud)

上面的命令,在 Jenkins 控制台中,打印为

curl -u XX:XX --data status=browser&cmd=createPage&label=XXXX&title=XXX&parentPath =/etc/replication/agents.author&template=/libs/cq/replication/templates/agent http://5XXXX:4502/bin/wcmcommand
Run Code Online (Sandbox Code Playgroud)

注意双引号""是如何丢失的。

我需要--data在此命令之后保留双引号。我该怎么做?我尝试使用正斜杠,但没有用。

干杯

Dom*_*art 24

为了扩展我的评论,一个快速测试揭示了它的情况。

您需要转义两次,一次是用斜线表示 shell 的引号,另一次是用斜线表示 groovy 本身。

node() {
    sh 'echo "asdf"'
    sh 'echo \"asdf\"'
    sh 'echo \\"asdf\\"'
}
Run Code Online (Sandbox Code Playgroud)

结果

[Pipeline] {
[Pipeline] sh
+ echo asdf
asdf
[Pipeline] sh
+ echo asdf
asdf
[Pipeline] sh
+ echo "asdf"
"asdf"
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Run Code Online (Sandbox Code Playgroud)

  • `sh 'echo \\"asdf\\"'` 是我的解决方案,因为我无法使用单引号来包裹 '\\"asdf\\"` (2认同)

tee*_*jay 10

经过长时间的努力和谷歌搜索,这就是我在类似用例中的工作原理:

sh("ssh root@my.server.com \"su user -c \\\"mkdir ${newDirName}\\\"\"")
Run Code Online (Sandbox Code Playgroud)

更新:我认为它是如何解释的

1] sh 扩展首先剥离转义(\"变得"\\成为\,第一个和最后一个"不是输入的一部分)

ssh root@my.server.com "su user -c \"mkdir ${newDirName}\""
Run Code Online (Sandbox Code Playgroud)

2] ssh 命令剥离第二级转义(\"变成",而外部"也不是输入的一部分)

su user -c "mkdir ${newDirName}"
Run Code Online (Sandbox Code Playgroud)