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

无法将变量传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:43:16