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

在bash脚本中执行curl返回无效类别提示的问题求助

问题修复方案

核心错误点

  • curl头参数误用:你用了小写的-h,这是curl的帮助命令(用于查看指定类别的选项),而设置HTTP请求头必须用大写的-H,这是触发"Invalid category provided"错误的直接原因。
  • JSON变量未加引号:--data $mergedTest中的变量没有用双引号包裹,shell会把JSON里的空格当成参数分隔符,导致curl收到大量无效参数。
  • 冗余语法导致的shell错误:生成newTest.json的代码里,外层的{}是多余的,会触发shell语法错误。
  • JSON换行问题:合并后的JSON如果带有换行,直接传给curl会引发格式异常,建议用jq -c生成紧凑格式的JSON。

修正后的完整代码

# 生成newTest.json,移除多余的{}
jq -cn --arg url "$url" --arg key "$key" '{things: { stuff: $ARGS.named}}' > newTest.json

# 合并JSON并生成紧凑格式,避免换行干扰
mergedTest=$(jq -sc '.[0] * .[1]' test.json newTest.json)

# 修正curl参数:用-H设置请求头,给mergedTest加双引号,用--data-raw保留JSON原始格式
test2=$(curl -X POST "https://test.com/test/test" -u username:password -H "Content-Type: application/json" --data-raw "$mergedTest")

echo "$test2"

额外优化建议

  • 用--data-raw代替--data,可以避免curl将JSON中的特殊字符(如&、=)解析为表单参数,更适配纯JSON传输场景。
  • 所有变量引用都加上双引号(如"$url"、"$key"),防止shell对变量内容进行分词或路径扩展。
  • 如果不需要保留临时文件test.json和newTest.json,可以直接用管道完成合并,简化流程:
mergedTest=$(curl -X GET "https://test.com/test/test" -u username:password | jq '{id, things}' | jq -cn --arg url "$url" --arg key "$key" '{things: { stuff: $ARGS.named}}' | jq -sc '.[0] * .[1]')

test2=$(curl -X POST "https://test.com/test/test" -u username:password -H "Content-Type: application/json" --data-raw "$mergedTest")

echo "$test2"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:10:14