如何在curl请求中有条件地发送body参数

twh00eeo  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(495)

我正在创建一个简单的bash脚本,我有一个curl请求,如果objects_count不为空,我只想在原始数据体中发送它。
我知道这行代码是有效的:'[ ! -z "$objects_count" ] && echo "not empty"'
然而,当我在curl请求中实现它时,我得到一个错误
第一个

wbrvyc0a

wbrvyc0a1#

Bash没有可在表达式中使用的条件运算符。请使用简单的if语句将变量设置为要发送的数据。

if [ -z "$objects_count" ]
then
    data='{"objects":'$objects'}'
else
    data='{"objects":'$objects', "objects_count":'$objects_count'}'
fi

curl --location --request POST 'http://0.0.0.0:5000' \
    --header 'Content-Type: application/json' \
    --data-raw "$data"
x33g5p2x

x33g5p2x2#

你不能在表达式中间使用这样的表达式。如果你真的想要一个表达式,你需要一个子shell,在子shell echo中你想要的字符串:

curl --location --request POST 'http://0.0.0.0:5000' \
--header 'Content-Type: application/json' \
--data-raw '{
    "objects":'$objects',
    '$([ ! -z "$objects_count" ] && echo '"objects_count":'$objects_count)'
}'

然而,使用参数替换有一个技巧,你可以扩展一个字符串,只有一个变量不是空的(或未设置):

echo ${objects_count:+non empty}

那么就不需要表达式了:

curl --location --request POST 'http://0.0.0.0:5000' \
--header 'Content-Type: application/json' \
--data-raw '{
    "objects":'$objects',
    '${objects_count:+'"objects_count":'$objects_count}'
}'

我不明白为什么需要有选择地输出这个元素,在JSON中,通常可以只输出"object_counts": null或类似的内容。
顺便说一句,你可以只做[ -n $foo ],而不是做[ ! -z "$foo" ]

相关问题