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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:58:18