如何在Bash脚本的curl请求中条件性发送Body参数?
解决Bash脚本中curl动态添加JSON参数的问题
你遇到的问题是在curl请求的JSON体中,想仅当objects_count非空时才包含该参数,但直接在--data-raw里嵌入Bash条件判断导致了语法错误。
你的原代码:
objects='[]' objects_count='' curl --location --request POST 'http://0.0.0.0:5000' \ --header 'Content-Type: application/json' \ --data-raw '{ "objects":'$objects', '[ ! -z "$objects_count" ] && "objects_count":$objects_count' }'
报错信息:
curl: (3) URL using bad/illegal format or missing URL curl: (3) unmatched close brace/bracket in URL position 1: ] ^
错误原因
你直接把Bash的条件判断写到了--data-raw的字符串里,这部分内容不会被Bash解析执行,而是被当作原始文本传给curl,导致JSON格式彻底混乱,curl误将部分内容识别为URL参数,从而抛出错误。
解决方案
方法1:提前拼接JSON字符串(纯Bash实现)
先构建基础JSON内容,再根据objects_count是否为空动态添加字段,最后传给curl:
objects='[]' objects_count='' # 初始化基础JSON结构 json='{"objects":'"$objects"'}' # 判断objects_count是否非空,非空则拼接字段 if [ -n "$objects_count" ]; then # 去掉基础JSON末尾的},添加新字段后再补回 json="${json%}}"', "objects_count":'"$objects_count"'}' else # 保持基础JSON结构不变 json="$json}" fi # 发起请求 curl --location --request POST 'http://0.0.0.0:5000' \ --header 'Content-Type: application/json' \ --data-raw "$json"
方法2:用jq工具构建动态JSON(更简洁可靠)
如果系统安装了jq(大多数Linux发行版默认自带),可以用它来处理条件性的JSON字段,避免手动拼接的语法问题:
objects='[]' objects_count='' # 用jq生成动态JSON,空值字段自动省略 jq -n \ --argjson objects "$objects" \ --arg objects_count "$objects_count" \ '{ objects: $objects, objects_count: ($objects_count | select(length > 0)) }' | curl --location --request POST 'http://0.0.0.0:5000' \ --header 'Content-Type: application/json' \ --data @-
这里select(length > 0)会在objects_count为空时自动省略该字段,完美符合需求。
内容的提问来源于stack exchange,提问作者inquisitivemongoose
相关产品推荐
相关产品推荐

