Usando o shell 'printf', em que a string de formato está em uma variável e não possui um número fixo de espaços reservados de campo?

0

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.

Em segundo lugar, porque eu usei eval, isso cria um problema com eval, nesse código, certamente, pegar o código de retorno de 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?

    
por Stilez 07.08.2018 / 09:17

2 respostas

1

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'
    
por 07.08.2018 / 09:47
1

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" "$@" )

    # ...
}
    
por 07.08.2018 / 09:30