Você pode tentar preencher as strings de formato com especificadores de comprimento zero até a contagem máxima de parâmetros esperada:
template_get_entry='get_entry:%s %0.0s'
Estou escrevendo uma função de shell que faz uma chamada de API externa via cURL (a sintaxe da API externa não está sob meu controle). Eu me aproximei assim (simplificado):
#!/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.....
}
Existem 2 problemas com este código.
Primeiro, o número de args é variável. Se a linha que define apicmd
for chamada com menos que o número máximo de args, printf interpreta quaisquer comandos em excesso como instâncias extras de impressão da string de formato a ser anexada. Não consigo ver a maneira correta de contornar isso.
eval
e não de curl
, e eu não sei o caminho certo para evitar / corrigir isso.
Como devo fazer algo assim, que precisa de um número variável de argumentos?
O que você pode fazer é obter o argumento de string de formato, deslocá-lo da lista de argumentos e usar $@
:
call_api () {
fmt=$1
shift
apicmd=$( printf "$fmt" "$@" )
# ...
}