在bash中将条件参数传递给curl



我有一个调用curl的bash脚本,只有在满足某些条件时,我才想传递某个参数:

result=$( curl -sS --retry 3 --retry-delay 10 
# some more stuff
$([[ $b=="b" ]] && echo -F "foo=bar") 
"https://www.someurl.org")

出于某种原因,效果就像我只是这样做:

result=$( curl -sS --retry 3 --retry-delay 10 
# some more stuff
"https://www.someurl.org")

如何找出问题所在?我试过

result=$( echo -sS --retry 3 --retry-delay 10 
$([[ $b=="b" ]] && echo -F "foo=bar") 
"https://www.someurl.org")
echo result

-F "foo=bar"在那里。但为什么它似乎没有影响我的卷发呢?

尝试使用命令替换(即$( )表达式(生成参数实际上并不起作用,因为shell在执行命令替换之前会解析引号和转义。这意味着命令输出中的引号和转义符不会被shell完全解析,它们只是作为数据的文字部分传递。因此,在您的示例中,您将发送一个名为"foo的表单字段(包括一个文本双引号(,其值为bar"(同样是一个文本引号(。如果字段值包含任何空格,情况会更糟,因为shell会对命令替换的值进行分词,而不管它包含任何引号。

那么你怎么能做到这一点呢?最常见的方法是提前计算条件参数,并将其存储在数组中:

extraArgs=()
if [[ $b == "b" ]]; then    # Note: the spaces around == are required
extraArgs+=(-F "foo=bar")
fi
result=$( curl -sS --retry 3 --retry-delay 10 
"${extraArgs[@]}" 
"https://www.someurl.org")

在特殊情况下,如果变量设置为非空值,则需要传递条件参数,可以直接在命令行中执行:

fooValue=something
result=$( curl -sS --retry 3 --retry-delay 10 
${fooValue:+ -F "foo=$fooValue"} 
"https://www.someurl.org")

仅当variable已设置并且具有非空值时,${variable:+something}扩展告诉bash在命令中包含something。在这种情况下,something部分中的引用被解析并受到shell的尊重。顺便说一句,这种方法即使在不支持数组(例如dash(的shell中也应该有效。

最新更新