我正在编写一个 shell 函数,它通过 cURL 进行外部 API 调用(外部 API 语法不受我的控制)。我已经像这样接近它(简化):
#!/bin/sh
template_get_entry='get_entry:%s'
template_set_entry='set_entry:%s=%s'
curlheaders='-H stuff'
curluri="https://www.domain.com:1234/api.php"
# make an API call to get entry "foo"
call_api "$template_get_entry" "foo"
# make an API call to set entry "foo" to "bar"
call_api "$template_set_entry" "foo" "bar"
call_api() {
apicmd="$( printf "$1" "$2" "$3" )"
result="$( eval "/usr/local/bin/curl" "$curlheaders" "-d" "$apicmd" "$curluri" )"
retcode="$?"
.....stuff.....
}
这段代码有两个问题。
首先,args 的数量是可变的。如果调用行定义apicmd
时使用的参数少于最大数量,则 printf 将任何多余的命令解释为打印格式字符串的额外实例,以附加。我看不到解决此问题的正确方法。
其次,因为我使用了 eval,这会产生 eval 的连锁问题,因为 retcode 肯定会eval
从而不是从获取返回码curl
,而且我不知道防止/修复它的正确方法。
我应该怎么做这样的事情,它需要可变数量的参数?
您可以做的是获取格式字符串参数,将其从参数列表中移出,然后使用
$@
:您可以尝试使用零长度说明符填充格式字符串,直至达到最大预期参数计数: