无法将变量传入curl请求中atlassian_doc_format格式的body内容
解决curl更新Confluence页面时变量不展开的问题
核心问题原因
shell中单引号会阻止变量解析,如果你的curl请求体是用单引号包裹的,$VV会被当作纯文本直接发送,而不会替换成变量实际值。另外如果变量内容包含特殊字符(双引号、换行、反斜杠等),直接拼接还可能破坏JSON结构。
具体解决方法
方法1:混合引号实现变量展开
把请求体中需要替换变量的部分,从单引号块中拆出来,用双引号包裹变量,再拼接回单引号结构:
# 假设已读取文件内容到变量VV VV=$(cat your-content-file.txt) # 正确的curl命令 curl -X PUT \ -u "你的用户名:API令牌" \ -H "Content-Type: application/json" \ "https://你的Confluence域名/rest/api/content/页面ID" \ -d '{ "version": {"number": 2}, # 版本号需比当前页面大1 "body": { "storage": { "value": "'"$VV"'", "representation": "storage" } } }'
这里'"$VV"'的逻辑是:关闭外层单引号→用双引号包裹变量让shell解析展开→重新打开外层单引号,保证JSON结构的完整性。
方法2:用jq构建JSON(推荐,避免转义问题)
如果变量内容包含特殊字符(比如双引号、换行),直接拼接容易破坏JSON格式,用jq工具可以自动处理转义,生成合法的JSON:
# 读取文件内容到变量(保留换行和特殊字符) VV=$(<your-content-file.txt) # 获取当前页面的最新版本号,自动加1避免冲突 current_version=$(curl -s -u "你的用户名:API令牌" "https://你的Confluence域名/rest/api/content/页面ID?expand=version" | jq '.version.number') new_version=$((current_version + 1)) # 用jq生成请求体并发送 curl -X PUT \ -u "你的用户名:API令牌" \ -H "Content-Type: application/json" \ "https://你的Confluence域名/rest/api/content/页面ID" \ -d "$(jq -n \ --arg content "$VV" \ --argjson version $new_version \ '{ "version": {"number": $version}, "body": { "storage": { "value": $content, "representation": "storage" } } }')"
注意事项
- 确保变量
$VV的内容是Confluence支持的格式(比如Storage格式的HTML标签),否则页面可能无法正常渲染。 - 如果是在脚本中使用,无需
export变量,只要在同一个shell会话中定义即可直接使用。 - 版本号必须大于页面当前的版本号,否则Confluence会返回409冲突错误,方法2中自动获取版本号的方式可以避免这个问题。
内容的提问来源于stack exchange,提问作者Bibi
相关产品推荐
相关产品推荐

