使用curl提交JSON数据时遭遇未知选项错误的技术求助
问题分析
你的脚本报错的核心原因是**send_command函数里的"$@"会把传入的参数拆分成独立的bash参数,导致curl错误地将--files1这类参数识别为自身的命令行选项,而非POST数据的一部分**。
当调用command_1时,send_command接收到的参数是test_command、-I、{{files1}}、--files1、my_file.txt。在curl命令中使用"$@"会让bash把这些参数分别作为独立项传递给curl,最终curl会把--files1当成自己的命令行选项,而非--data-raw中的JSON内容。
修复方案
修改send_command函数,将所有传入的参数合并成单个字符串后再放入JSON中,避免参数被bash拆分。可以用"$*"替代"$@"($*会将所有参数用系统默认分隔符连接成一个字符串):
send_command () { # 将所有参数合并为单个字符串 local cmd_str="$*" echo "{\"cmd\":\"$cmd_str\"}" curl --request POST \ --data-raw "{\"cmd\":\"$cmd_str\"}" \ -H "Content-Type: application/json" \ "http://localhost:8080/addCmd/" } command_1 () { send_command test_command \ -I {{files1}} \ --files1 'my_file.txt' }
额外优化建议
- 原脚本中
-H "Content-Type: application/json"行末尾的反斜杠前没有空格,虽然bash解析时可能不会出问题,但为了可读性和避免潜在错误,建议在反斜杠前保留空格。 - 如果你的参数中包含特殊字符(比如引号),直接拼接字符串可能会导致JSON格式错误,这时可以用
jq工具安全生成JSON,避免手动转义的麻烦:send_command () { local cmd_str="$*" # 用jq生成合法的JSON local json_data=$(jq -n --arg cmd "$cmd_str" '{"cmd": $cmd}') echo "$json_data" curl --request POST \ --data-raw "$json_data" \ -H "Content-Type: application/json" \ "http://localhost:8080/addCmd/" }
内容的提问来源于stack exchange,提问作者ntriisii
相关产品推荐
相关产品推荐

