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

使用awscurl通过AppSync添加条目时的双引号转义问题

解决awscurl调用AppSync时带JSON数组参数的引号问题

问题根源

你遇到的错误是因为bash解析变量时,${args}中的双引号会被shell识别为参数分隔符,导致awscurl把数组内容当成了额外的命令行参数,而非请求体的一部分。

可行解决方案

方法一:使用Heredoc结合--data-binary

这种方式能完全避免shell对引号的解析,直接传递完整的JSON请求体:

awscurl -X POST \
    --service appsync \
    --region ap-northeast-1 \
    -H 'Content-Type: application/json' \
    --data-binary @- <<EOF
{ 
  "query":"mutation MyMutation(\$input: CreateTaskInput!) { createTask(input: \$input) { jobIdOrder } }", 
  "variables": { 
    "input": { 
      "jobIdOrder": "${jobIdOrder}", 
      "version": "${version}", 
      "product": "${product}", 
      "batch": "${batch}", 
      "batchName": "${batchName}", 
      "versionProductBatch": "${versionProductBatch}",
      "jobId": "${jobId}", 
      "order": "${order}", 
      "title": "${title}", 
      "args": ${args} 
    } 
  } 
}
EOF
  • 注意query中的$input要转义为\$input,防止shell误解析为变量
  • args本身是合法JSON数组,无需额外加引号,直接插入即可

方法二:用jq构建标准JSON请求体

如果需要确保JSON格式绝对正确,推荐用jq工具生成完整请求体,彻底规避shell引号问题:

# 用jq组装请求JSON
REQUEST_BODY=$(jq -n \
  --arg query 'mutation MyMutation($input: CreateTaskInput!) { createTask(input: $input) { jobIdOrder } }' \
  --argjson input_args "$args" \
  --arg jobIdOrder "$jobIdOrder" \
  --arg version "$version" \
  --arg product "$product" \
  --arg batch "$batch" \
  --arg batchName "$batchName" \
  --arg versionProductBatch "$versionProductBatch" \
  --arg jobId "$jobId" \
  --arg order "$order" \
  --arg title "$title" \
  '{query: $query, variables: {input: {jobIdOrder: $jobIdOrder, version: $version, product: $product, batch: $batch, batchName: $batchName, versionProductBatch: $versionProductBatch, jobId: $jobId, order: $order, title: $title, args: $input_args}}}'
)

# 执行awscurl请求
awscurl -X POST \
    --service appsync \
    --region ap-northeast-1 \
    -H 'Content-Type: application/json' \
    -d "$REQUEST_BODY"
  • --argjson会直接把args作为JSON对象解析,无需转义
  • jq会自动处理所有变量的格式,确保生成的JSON完全合规

方法三:手动转义args中的双引号

如果坚持用原始-d参数方式,需要先转义args里的双引号:

# 转义args中的双引号
ESCAPED_ARGS=$(echo "$args" | sed 's/"/\\"/g')

# 执行awscurl请求
awscurl -X POST \
    --service appsync \
    --region ap-northeast-1 \
    -H 'Content-Type: application/json' \
    -d '{ "query":"mutation MyMutation($input: CreateTaskInput!) { createTask(input: $input) { jobIdOrder } }", "variables": { "input": { "jobIdOrder": "'"${jobIdOrder}"'", "version": "'"${version}"'", "product": "'"${product}"'", "batch": "'"${batch}"'", "batchName": "'"${batchName}"'", "versionProductBatch": "'"${versionProductBatch}"'","jobId": "'"${jobId}"'", "order": "'"${order}"'", "title": "'"${title}"'", "args": "'"${ESCAPED_ARGS}"'" } } }'
  • 变量周围使用'"${var}"'的嵌套引号,确保shell正确展开变量同时保留JSON引号
  • 此方法仅适用于args格式简单的场景,复杂JSON容易出错

内容的提问来源于stack exchange,提问作者user41469

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:15:22