我有一个调用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中也应该有效。