Unix脚本中带JSON的curl命令执行与变量赋值问题排查
问题解决:curl执行JSON参数时出现unmatched close brace/bracket错误
错误原因
这个错误来自两个核心问题:
- curl默认启用globbing(通配符匹配),会把JSON里的
{}当成通配符解析,导致括号不匹配报错。 - 将完整curl命令存为字符串再执行时,引号转义逻辑混乱,bash解析参数时出现拆分错误。
修正方案(推荐用bash数组)
使用bash数组存储curl的所有参数,既能避免引号转义问题,又能通过-g参数关闭curl的globbing功能,正确处理JSON格式的请求体。修正后的脚本如下:
iterationid=12345 domain_name=abcd service=xyz api_to_trigger="http://$domain_name/system/services/$service" # 用数组存储curl参数,保留参数边界,避免解析错误 curl_args=( curl -g # 关闭globbing,禁止curl解析{}为通配符 --location "$api_to_trigger" --header "Content-Type: application/json" --data '{"body": {"instruction":"START"}}' ) # 打印含iterationid的完整curl命令 echo "$iterationid ${curl_args[*]}" # 执行curl命令并捕获输出 output=$("${curl_args[@]}") # 打印含iterationid的执行结果 echo "$iterationid $output"
关键说明
-g参数:强制curl忽略{}和[]的通配符含义,确保JSON结构被正确传递给API。- bash数组:每个参数作为数组的独立元素,bash会自动处理参数中的空格和特殊字符,避免字符串存储时的转义混乱。
- 执行数组时用
"${curl_args[@]}":每个数组元素被当作独立参数传递,保证curl收到的参数和预期一致。
不推荐的字符串存储方案(仅作参考)
如果必须用字符串存储命令,需要额外转义JSON里的大括号,同时用eval执行,但这种方式存在安全风险(若变量含恶意内容会被执行):
iterationid=12345 domain_name=abcd service=xyz api_to_trigger="http://$domain_name/system/services/$service" # 转义JSON中的{},同时关闭globbing curl="curl -g --location '$api_to_trigger' --header \"Content-Type: application/json\" --data '\{\"body\": \{\"instruction\":\"START\"\}\}'" echo $iterationid $curl output=$(eval $curl) echo $iterationid $output
内容的提问来源于stack exchange,提问作者Malaiselvan
相关产品推荐
相关产品推荐

