cURL solicitações no bash

0

Estou tentando escrever um script que executará duas solicitações de curl no bash. Este é o meu código:

#!/bin/bash

ipadd="192.168.1.1"
start_url="http://$ipadd/startPlayer"
stop_url="http://$ipadd/stopPlayer"
header1="Accept: application/json"
header2="Content-Type: application/json"
stp="28508ab5-9591-47ed-9445-d5e8e9bafff6"

function start_player {
        curl --verbose -H \"${header1}\" -H \"${header2}\" -X PUT -d '{\"id\": \"$stp\"}' ${start_url}
}

function stop_player {
        curl -X PUT $stop_url
}

stop_player
start_player

A função stop_player funciona sem problemas, mas a primeira função não funciona. Eu só quero executar a seguinte solicitação CURL: curl --verbose -H "Accept: application/json" -H "Content-Type: application/json" -X PUT -d '{"id": "c67664db-bef7-4f3e-903f-0be43cb1e8f6"}' http://192.168.1.1/startPlayer Se eu fizer eco da função start_player, a saída é exatamente como deveria ser, mas se eu executar a função start_player, recebo um erro: Could not resolve host: application . Eu acho que é porque o bash está dividindo os cabeçalhos, mas porque funciona bem com o eco, mas não no bash?

    
por Georgе Stoyanov 01.03.2018 / 16:56

1 resposta

2

Você escreveu:

curl --verbose -H \"${header1}\" -H \"${header2}\" ...

mas parece que você realmente quer:

curl --verbose -H "${header1}" -H "${header2}" ...

Com os valores definidos para header1 e header2 , o antigo faria com que curl recebesse como parâmetros --verbose , -H , "Accept: , application/json" , -H , "Content-Type: e application/json" , enquanto você realmente deseja que cada valor de cabeçalho seja próprio token, que as aspas duplas sem escape fornecerão.

Além disso, vejo você passando -d '{\"id\": \"$stp\"}' . Você provavelmente quer -d "{\"id\": \"$stp\"}" lá.

Quanto à sua pergunta sobre por que os whings parecem funcionar bem dentro do eco, "mas não no bash", bem, as coisas não funcionaram bem com o eco, é só que isso dificulta ver esse fato.

Compare:

$ h1='Accept: foo'; h2='Content-Type: bar'

## Looks good, is actually wrong:
$ echo curl -H \"$h1\" -H \"$h2\"
curl -H "Accept: foo" -H "Content-Type: bar"

## If we ask printf to print one parameter per line:
$ printf '%s\n' curl -H \"$h1\" -H \"$h2\"
curl
-H
"Accept:
foo"
-H
"Content-Type:
bar"

Com:

## Looks different from the bash command, is actually right:
$ echo curl -H "$h1" -H "$h2"
curl -H Accept: foo -H Content-Type: bar

## This is more obvious if we ask printf to print one parameter per line:
$ printf '%s\n' curl -H "$h1" -H "$h2"
curl
-H
Accept: foo
-H
Content-Type: bar
    
por 01.03.2018 / 17:17