使用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
相关产品推荐
相关产品推荐

