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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:09:11