无法将变量传递给curl --包含atlassian_doc_format 格式的正文的数据

问题描述 投票:0回答:1

我正在尝试使用命令更新汇合页面

curl --request PUT --url "https://<url>/wiki/rest/api/content/<id>" --user $TOKEN --header 'Accept: application/json' --header 'Content-Type: application/json' --data '{
                                            "id": <id>",
                                            "type": "page",
                                            "status": "current",
                                            "pageId": <id>",
                                            "title": <title>,
                                            "body": {
                                                  "atlas_doc_format": {
                                                      "value": "{\"version\":1,\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"TXT CONTENT\"}]}]}",
                                                      "representation": "atlas_doc_format",
                                                      "content": {
                                                          "id": <id>
                                                      }
                                                  }
                                              },
                                            "version": {
                                              "number": <no>,
                                              "message": "test"
                                            }
                                          }'

它工作正常,但是当我尝试传递变量值而不是 TXT CONTENT 时,变量的内容不会传递,例如当我有 导出VV =“测试文本” 并尝试将其传递到体内:

"body": {
                                                  "atlas_doc_format": {
                                                      "value": "{\"version\":1,\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"$VV\"}]}]}",
                                                      "representation": "atlas_doc_format",
                                                      "content": {
                                                          "id": <id>
                                                      }
                                                  }
                                              }

页面更新为“$VV”而不是“测试文本”

我还尝试了“'”$VV”'”,{{VV}},“'$VV'”,“'{{VV}}'”,“%VV%”,其中一个解决方案对我有用。我想用我从文件中读取并存储在变量中的内容更新页面。有什么想法吗?

bash curl confluence confluence-rest-api
1个回答
0
投票

Bash 变量不会在单引号内扩展。如果您可以信任变量的内容,并且它很简单,因为它不需要任何特殊的 JSON 编码(例如,由于包含特殊字符),只需关闭单引号字符串,打开双引号字符串,将您的变量,并以相反的顺序关闭/打开报价:

curl … --data '{ … \"text\":\"'"$VV"'\" … }'
                              ^^^^^^^

但稳健的方法是让 JSON 处理器将外部值引入到 JSON 数据中。这会自动解决任何编码问题。以 jq 为例,使用

--arg text "$VV"
定义 jq 内部变量,并使用
$text
在内部对其求值:

curl … --data "$(jq -nc --arg text "$VV" '{
  id: "<id>", type: "page", status: "current", pageId: "<id>", title: "<title>",
  body: {
    atlas_doc_format: {
      value: {
        version: 1, type: "doc",
        content: [{
          type: "paragraph",
          content: [{type: "text", $text}]
        }]
      } | @json,
      representation: "atlas_doc_format",
      content: {id: "<id>"}
    }
  },
  version: {number: "<no>", message: "test"}
}')"
© www.soinside.com 2019 - 2024. All rights reserved.