将带有空行的 JSON 字段解析为 env var 时,Bash 抛出错误:环境变量格式“”无效

将带有空行的 JSON 字段解析为 env var 时,Bash 抛出错误:环境变量格式“”无效

我将 JSON 字段 保存.body到 ENV 变量。该字段的内容始终会随着多个字符串和字符而变化,它是 GitHub 中拉取请求的正文消息。所以 markdown 也会被传递:

下面是一个准确的例子,摘自.body

#Title

## SubTitle

*date*

1. Item 1
2. Item 2
3. Item 3

当我使用 jq 和 -r 解析 JSON 的原始内容时:

echo "PR_BODY=$(jq -r '.body' $HOME/pr.json)" >> $GITHUB_ENV

我从 GitHub 操作中收到错误:

在此输入图像描述

作为参考,我的计划是将.body数据保存到一个 markdown 文件中,如下所示:

      run: |
        ed changelog.md <<'END_ED'
        1i

        ${{ env.PR_BODY }}

        .
        wq
        END_ED
        echo >> changelog.md

我怎样才能在.body没有空格的情况下提取数据而引发错误?也许 ENV 变量不是解决这个问题的方法?

编辑:这是 .body 中的原始原始 JSON:

"body": "Manually configuring ports for DEV, CAT/QA environments. Migrating from managed service to self-serve \"GCP resource\". \r\n\r\n- [x] DEV\r\n- [x] CAT/QA\r\n- [ ] PROD\r\n\r\n```\r\n# Allow healthcheck on ports 80, 443\r\nresource \"google_compute_firewall\" \"allow-healthcheck\" {\r\n  name = \"${format(\"%s\",\"${var.gcp_resource_name}-${var.gcp_env}-fw-allow-healthcheck\")}\"\r\n  network = \"${google_compute_network.vpc.name}\"\r\n  allow {\r\n    protocol = \"tcp\"\r\n    ports    = [\"80\",\"443\"]\r\n  }\r\n  source_ranges = [\"2.2.0.0/16\", \"1.1.0.0/22\"]\r\n}\r\n```\r\nConfiguring for bug, link here:\r\n[Link To Terraform provider update](https://www.terraform.io/)"

答案1

基于“GitHub Actions 的工作流程命令”,看起来多行值的语法$GITHUB_ENV类似于:

PR_BODY<<EOF
multiline string
here
...
EOF

使用来自命令替换的值,您可以使用以下命令从 shell 生成该值:

printf "PR_BODY<<EOF\n%s\nEOF\n" "$(jq -r '.body' $HOME/pr.json)"

(您很可能想使用printf而不是echothere,因为它使得在插入换行符时更容易不是破坏命令替换中的数据。看为什么 printf 比 echo 更好?供讨论。)

相关内容