Github Action中Curl请求Body含环境变量的引号冲突问题求解
Github Action中curl请求Body使用环境变量的引号冲突解决方案
方案1:用单引号包裹toJson生成的Payload
通过toJson生成的JSON字符串本身包含双引号,直接用双引号包裹会触发shell的引号解析冲突。改用单引号包裹整个请求体,让Github Actions先完成变量替换,再传递给curl:
- name: Send JSON request with toJson env: # 用toJson构造结构化的JSON环境变量 REQUEST_BODY: ${{ toJson({ actor: github.actor, repo: github.repository, event_type: github.event_name }) }} run: | curl -X POST https://your-api-endpoint.com \ -H "Content-Type: application/json" \ -d '${{ env.REQUEST_BODY }}'
原理:单引号在shell中不会解析内部的双引号,Github Actions会先把${{ env.REQUEST_BODY }}替换为完整的JSON字符串,再作为一个整体参数传递给curl,避免引号嵌套冲突。
方案2:使用Here-doc构造请求体
如果不需要提前用环境变量存储JSON,直接用shell的Here-doc语法编写请求体,变量替换更直观,完全规避引号问题:
- name: Send request with Here-doc run: | curl -X POST https://your-api-endpoint.com \ -H "Content-Type: application/json" \ -d @- <<EOF { "actor": "${{ github.actor }}", "repo": "${{ github.repository }}", "trigger_message": "Workflow triggered by ${{ github.event_name }} event" } EOF
原理:-d @-表示curl从标准输入读取请求体,EOF包裹的内容会原样传递,仅替换${{ }}中的Github Actions变量,无需手动转义引号。
方案3:用jq生成合法JSON
如果需要处理复杂的变量或特殊字符(比如包含空格、引号的内容),用jq工具自动生成符合规范的JSON,彻底避免引号问题:
- name: Send request with jq env: ACTOR_NAME: ${{ github.actor }} EVENT_TYPE: ${{ github.event_name }} run: | # 用jq构造JSON,自动处理引号和特殊字符 PAYLOAD=$(jq -n \ --arg actor "$ACTOR_NAME" \ --arg event "$EVENT_TYPE" \ '{actor: $actor, event: $event}') curl -X POST https://your-api-endpoint.com \ -H "Content-Type: application/json" \ -d "$PAYLOAD"
原理:jq会自动处理变量中的特殊字符,生成语法正确的JSON字符串,用双引号包裹$PAYLOAD传递给curl时,shell会将其作为单一参数解析,不会拆分。
错误原因说明
之前遇到的"command not found"错误,本质是shell解析引号时出现混乱:
- 若用
-d "${{ env.PAYLOAD }}",toJson生成的{"key": "value"}会被替换成-d "{"key": "value"}",shell会把第一个}后的内容识别为新命令 - 直接用
$VAR或${{ github.actor }}嵌入双引号包裹的JSON时,若变量包含空格/特殊字符,会被shell拆分为多个参数,导致curl解析出错
内容的提问来源于stack exchange,提问作者Saqlain 1020
相关产品推荐
相关产品推荐

