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

