Usar curl POST con variables definidas en las funciones de script bash

Cuando hago eco obtengo esto, que se ejecuta cuando lo ingreso a la terminal

curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"account":{"email":"akdgdtk@test.com","screenName":"akdgdtk","type":"NIKE","passwordSettings":{"password":"Starwars1","passwordConfirm":"Starwars1"}},"firstName":"Test","lastName":"User","middleName":"ObiWan","locale":"en_US","registrationSiteId":"520","receiveEmail":"false","dateOfBirth":"1984-12-25","mobileNumber":"9175555555","gender":"male","fuelActivationDate":"2010-10-22","postalCode":"10022","country":"US","city":"Beverton","state":"OR","bio":"This is a test user","jpFirstNameKana":"unsure","jpLastNameKana":"ofthis","height":"80","weight":"175","distanceUnit":"MILES","weightUnit":"POUNDS","heightUnit":"FT/INCHES"}' https://xxx:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx 

Pero cuando se ejecuta en el archivo de script bash, obtengo este error

 curl: (6) Could not resolve host: application; nodename nor servname provided, or not known curl: (6) Could not resolve host: is; nodename nor servname provided, or not known curl: (6) Could not resolve host: a; nodename nor servname provided, or not known curl: (6) Could not resolve host: test; nodename nor servname provided, or not known curl: (3) [globbing] unmatched close brace/bracket at pos 158 

este es el código en el archivo

 curl -i \ -H '"'Accept: application/json'"' \ -H '"'Content-Type:application/json'"' \ -X POST --data "'"'{"account":{"email":"'$email'","screenName":"'$screenName'","type":"'$theType'","passwordSettings":{"password":"'$password'","passwordConfirm":"'$password'"}},"firstName":"'$firstName'","lastName":"'$lastName'","middleName":"'$middleName'","locale":"'$locale'","registrationSiteId":"'$registrationSiteId'","receiveEmail":"'$receiveEmail'","dateOfBirth":"'$dob'","mobileNumber":"'$mobileNumber'","gender":"'$gender'","fuelActivationDate":"'$fuelActivationDate'","postalCode":"'$postalCode'","country":"'$country'","city":"'$city'","state":"'$state'","bio":"'$bio'","jpFirstNameKana":"'$jpFirstNameKana'","jpLastNameKana":"'$jpLastNameKana'","height":"'$height'","weight":"'$weight'","distanceUnit":"MILES","weightUnit":"POUNDS","heightUnit":"FT/INCHES"}'"'" "https://xxx:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx" 

Supongo que hay un problema con mis comillas, pero he jugado mucho con ellas y he recibido errores similares. Todas las variables se definen con diferentes funciones en el guión real

No necesita pasar las comillas que encierran los encabezados personalizados para curl. Además, sus variables en el medio del argumento de data deben ser citadas.

Primero, escriba una función que genere los datos de publicación de su secuencia de comandos. Esto le ahorra todo tipo de dolores de cabeza relacionados con las cotizaciones de shell y hace que sea más fácil leer y mantener el script que alimentar los datos de publicación en la línea de invocación de curl como en su bash:

 generate_post_data() { cat < 

Entonces es fácil usar esa función en la invocación de curl:

 curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data "$(generate_post_data)" "https://xxx:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx" 

Dicho esto, aquí hay algunas aclaraciones sobre las reglas de cotización de shell:

Las comillas dobles en los argumentos -H (como en -H "foo bar" ) le dicen a bash que guarde lo que hay dentro como un solo argumento (incluso si contiene espacios).

Las comillas simples en el argumento --data (como en --data 'foo bar' ) hacen lo mismo, excepto que pasan todo el texto textualmente (incluidos los caracteres de comillas dobles y el signo de dólar).

Para insertar una variable en el medio de un solo texto entre comillas, debe finalizar la comilla simple, luego concatenar con la variable de comillas dobles y volver a abrir la comilla simple para continuar el texto: 'foo bar'"$variable"'more foo' .

Solución probada con https://httpbin.org/ y script bash en línea
1. Para variables sin espacios en ella, es decir 1 :
Simplemente agregue ' antes y después $variable cuando reemplace la cadena deseada

 for i in {1..3}; do \ curl -X POST -H "Content-Type: application/json" -d \ '{"number":"'$i'"}' "https://httpbin.org/post"; \ done 

2. Para entrada con espacios:
Ajustar la variable con " ie "el a" adicional:

 declare -a arr=("el a" "el b" "el c"); for i in "${arr[@]}"; do \ curl -X POST -H "Content-Type: application/json" -d \ '{"elem":"'"$i"'"}' "https://httpbin.org/post"; \ done 

Wow funciona 🙂

Curl puede publicar datos binarios de un archivo, así que he estado usando sustitución de procesos y aprovechando los descriptores de archivos cada vez que necesito publicar algo desagradable con curl y aún quiero tener acceso a los vars en el shell actual. Algo como:

 curl "http://localhost:8080" \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ --data @<(cat < 

Esto termina pareciendo --data @/dev/fd/ que simplemente se procesa como un archivo normal. De todos modos, si quieres ver que funcione localmente solo ejecuta nc -l 8080 primero y en un shell diferente dispara el comando anterior. Verás algo como:

 POST / HTTP/1.1 Host: localhost:8080 User-Agent: curl/7.43.0 Accept: application/json Content-Type:application/json Content-Length: 43 { "me": "username", "something": 1465057519 } 

Como puede ver, puede llamar a subcapas y otras cosas, así como a vars de referencia en el heredoc. Feliz hackeo espero que esto ayude con los '"'"'""""'''""'' .

  • la información de Sir Athos funcionó perfectamente !!

Así es como tuve que usarlo en mi script curl para couchDB. Realmente ayudó mucho. ¡Gracias!

 bin/curl -X PUT "db_domain_name_:5984/_config/vhosts/$1.couchdb" -d '"/'"$1"'/"' --user "admin:*****" 

Unos años tarde, pero esto podría ayudar a alguien si está utilizando la sustitución de eval o backtick:

 postDataJson="{\"guid\":\"$guid\",\"auth_token\":\"$token\"}" 

Usar sed para quitar citas desde el principio y el final de la respuesta

 $(curl --silent -H "Content-Type: application/json" https://${target_host}/runs/get-work -d ${postDataJson} | sed -e 's/^"//' -e 's/"$//')