Erro ao substituir parte do comando curl por variável

2

Estou escrevendo um script no qual estou executando comandos curl várias vezes. O uso do comando curl varia ao longo do script e eu gostaria de economizar tempo (no futuro, quando eu tiver que depurar o script) usando uma variável para substituir uma parte do comando que seria reutilizada várias vezes. / p>

Exemplo de um script que usa o comando curl curl -g -x "" -k várias vezes, mas de forma diferente

# Usage 1
curl -g -x "" -k http://www.example.com/rest/v1/blah

# Usage 2
curl -g -x "" -k -i -X POST -H "Content-Type:application/json" -d "{'Username':'sally','Password':'password'}" http://www.example.com/rest/v1/blahblah

Gostaria de reescrever o script acima usando uma variável para curl -g -x "" -k

# Snippet of curl command that will be used several times in script
curl_command="curl -g -x \"\" -k"

# Usage 1
$curl_command http://www.example.com/rest/v1/blah

# Usage 2
$curl_command -i -X POST -H "Content-Type:application/json" -d "{'Username':'sally','Password':'password'}" http://www.example.com/rest/v1/blahblah

A execução do script reescrito resulta em um erro:

curl: (5) Could not resolve proxy: ""; Name or service not known

Para o Uso 1, parece estar executando curl -g -x '""' -k http://www.example.com/rest/v1/blah , resultando no erro mostrado acima. Eu tentei atribuir curl_command="curl -g -x '' -k" e envolvendo a variável em chaves {} na execução, mas recebo erro semelhante. Como isso pode ser escrito para funcionar?

Agradecemos antecipadamente:)

    
por Sandy 18.11.2015 / 00:49

1 resposta

2

Basicamente, seu problema é Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais?

Quando você escreve $curl_command fora de aspas, isso pega o valor da variável curl_command e a divide em palavras separadas em cada seqüência de espaço em branco. (E então cada palavra é interpretada como um padrão curinga e substituída pela lista de nomes de arquivos correspondentes, se houver nomes de arquivos correspondentes, mas, no seu caso, não há curingas, portanto, essa etapa não altera nada.)

As cotações fazem parte da sintaxe do shell. Eles não são afetados pela expansão de variáveis não citadas. Portanto, o comando $curl_command executa curl com os argumentos -g , -x , "" e -k .

Você está tentando inserir uma lista de strings (argumentos de comando) em uma string. Isso não funciona bem. Nada te dará uma palavra vazia, de fato.

A solução robusta é usar uma variável do tipo lista de strings para armazenar a lista de strings. Isso é chamado de array no shell. Matrizes de suporte Bash, ksh e zsh:

curl_command=(curl -g -x "" -k)
…
"${curl_command[@]}" http://www.example.com/rest/v1/blah

A variável curl_command contém uma matriz de 5 elementos, cujos elementos são curl , -g , -x , uma sequência vazia e -k .

Se você precisa de um script sh simples, você pode usar os parâmetros posicionais, supondo que você não precise deles para mais nada.

set -- curl -g -x "" -k
…
"$@" http://www.example.com/rest/v1/blah

Outra possibilidade seria usar uma função para encapsular o código que você deseja usar várias vezes.

curl_command () {
  curl -g -x "" -k "$@"
}
…
curl_command http://www.example.com/rest/v1/blah
    
por 18.11.2015 / 01:13