Shell脚本拼接JSON调用curl报大括号不匹配错误如何排查?
问题原因与修复方案
核心问题点
- curl的
-u参数书写错误:你把身份验证凭据和请求URL放在了同一个单引号包裹的参数中,curl无法识别拆分,导致URL解析异常。 - JSON字符串拼接的引号逻辑错误:你混用了单双引号和转义符,最终生成的JSON字符串携带多余的转义符、首尾单引号,不符合JSON格式要求。
--data参数后没有给$json变量加双引号:shell会将变量内容按空白字符拆分为多个独立参数,curl会把拆分后的片段当成新的URL请求,直接导致Could not resolve host: "refs这类报错。
修复代码
纯shell拼接版(适合简单场景)
CLUSTER_NAME=testclu Node_name=testnode # 外层用双引号,内部双引号转义,变量直接嵌入 json="{\"definition\":{\"id\":5474},\"sourceBranch\": \"refs/heads/feature/node-memory-clean-up\",\"parameters\": {\"system.debug\":\"false\",\"Cluster_name\":\"$CLUSTER_NAME\",\"Node_name\":\"$Node_name\"}}" printf '%s\n' "$json" # 拆分-u参数和URL,--data后变量加双引号 curl -X POST \ -u 'xxyv.x.xxx' \ 'https://dev.azure.com/sample/RD%20Tech%20AIML%20DevOps/_apis/build/builds?api-version=5.0' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ --data "$json"
jq生成版(更稳妥,自动处理特殊字符转义)
如果变量可能包含引号、空格等特殊字符,推荐用jq生成标准JSON,避免格式错误:
CLUSTER_NAME=testclu Node_name=testnode # 用jq自动拼接合法JSON json=$(jq -n \ --arg cluster "$CLUSTER_NAME" \ --arg node "$Node_name" \ '{ "definition": {"id": 5474}, "sourceBranch": "refs/heads/feature/node-memory-clean-up", "parameters": { "system.debug": "false", "Cluster_name": $cluster, "Node_name": $node } }') printf '%s\n' "$json" curl -X POST \ -u 'xxyv.x.xxx' \ 'https://dev.azure.com/sample/RD%20Tech%20AIML%20DevOps/_apis/build/builds?api-version=5.0' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ --data "$json"
内容的提问来源于stack exchange,提问作者Rajendar Talatam
相关产品推荐
相关产品推荐

