You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins中curl传递含换行变量报Illegal unquoted character code10错误如何解决

错误原因

你遇到的报错是因为JSON语法要求字符串中的控制字符(包括换行符、制表符等)必须经过转义才能使用,你直接把包含原始换行的文件内容拼接进JSON请求体,导致JSON格式非法,同时shell执行命令时直接展开换行也会破坏curl命令的结构。另外你原始curl命令中-u username:password和-X POST之间缺少空格,也会导致命令执行异常,修改时注意补全。

解决方案

方案1:使用Groovy内置JSON序列化工具(最推荐)

不需要依赖额外工具,直接在Jenkins Pipeline层面完成JSON转义,避免手动拼接JSON出错:

import groovy.json.JsonOutput

pipeline {
    // 保留你的其他pipeline配置
    stages {
        stage('上传Jira评论') {
            steps {
                script {
                    FPR_LOW = readFile('fpr_low.txt').trim()
                    // 直接构造整个请求体,自动处理所有特殊字符转义
                    def requestBody = JsonOutput.toJson([
                        body: FPR_LOW
                    ])
                }
                sh """ curl -u username:password -X POST \
                          -H "Content-Type: application/json" \
                          --url 'http://10.10.10.10:8080/rest/api/2/issue/${env.TASK_KEY}/comment' \
                          -d '${requestBody}'
                """
            }
        }
    }
}

方案2:使用curl标准输入+jq转义(适合不想改Groovy代码的场景)

如果你的Jenkins节点安装了jq工具,可以在shell层完成字符串转义,通过标准输入传递payload避免命令行展开换行:

script {
    FPR_LOW = readFile('fpr_low.txt').trim()
}
sh '''
# 用单引号包裹sh块避免Jenkins提前展开变量,TASK_KEY从环境变量读取
printf '%s' "$FPR_LOW" | jq -R '{body: .}' | curl -u username:password -X POST \
  -H "Content-Type: application/json" \
  --url "http://10.10.10.10:8080/rest/api/2/issue/${TASK_KEY}/comment" \
  -d @-
'''

说明:curl的-d @-参数表示从标准输入读取请求体内容,避免了变量在命令行参数中展开导致的格式破坏;jq的-R参数会把输入的原始内容自动转义为合法的JSON字符串。

内容的提问来源于stack exchange,提问作者user630702

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:06:01