如何在GitHub工作流中安全写入含特殊字符的JSON到文件?
解决GitHub Actions中JSON含特殊字符的处理问题
问题原因
你当前的echo '${{ steps.release.outputs.data }}'命令失败,是因为JSON内容中的单引号会提前闭合shell的单引号字符串,触发语法解析错误。
方案一:安全写入文件(保留原流程)
使用bash的单引号here-doc,确保所有特殊字符(单引号、$、反引号等)都被原封不动写入文件,完全规避shell解析问题:
- name: Get Information from Release run: | cat <<'EOF' > release.json ${{ steps.release.outputs.data }} EOF jq -r '.assets[].browser_download_url' release.json > assets.txt jq -r '.body' release.json > changelog.txt
<<'EOF'会将中间内容视为纯字面量,shell不会解析任何特殊符号,完美解决引号冲突。
方案二:无需中间文件的最优方案
直接用bash的单引号here-string将JSON内容传给jq,省去写入文件的IO操作,效率更高:
- name: Get Information from Release run: | jq -r '.assets[].browser_download_url' <<<'${{ steps.release.outputs.data }}' > assets.txt jq -r '.body' <<<'${{ steps.release.outputs.data }}' > changelog.txt
<<<'...'是单引号包裹的here-string,会把内容当作纯文本传递给jq,彻底避免shell对特殊字符的解析。
进阶优化(大JSON场景)
如果JSON体积较大,不想重复解析,可以先将内容存入变量,再多次复用:
- name: Get Information from Release run: | release_data=$(cat <<<'${{ steps.release.outputs.data }}') printf '%s' "$release_data" | jq -r '.assets[].browser_download_url' > assets.txt printf '%s' "$release_data" | jq -r '.body' > changelog.txt
内容的提问来源于stack exchange,提问作者void.pointer
相关产品推荐
相关产品推荐

