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 abordei 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 argumentos é variável. Se a definição de linha apicmd
for chamada com menos do que o número máximo de argumentos, 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.
Segundo, porque eu usei eval, isso cria um problema knockon com eval, nesse retcode certamente pegará o código de retorno de eval
e não de curl
, e eu não sei a maneira correta de 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 da string de formato, deslocá-lo da lista de argumentos e depois usar
$@
:Você pode tentar preencher as strings de formato com especificadores de comprimento zero até a contagem máxima de parâmetros esperada: