web-dev-qa-db-fra.com

Problème avec le script Shell bash, essayant de POST données JSON variables en utilisant cURL

Je rencontre des problèmes avec un script Shell bash, essayant de POST données JSON variables en utilisant cURL. Je cours à partir d'un Mac. Je peux publier avec succès des données statiques mais je n'arrive pas à comprendre comment incorporer des variables.

J'ai présenté <room> et <token> pour ces exemples.

Ce script fonctionne correctement:

#!/bin/bash
curl -X POST -H "Content-Type: application/json" --data '{ "color":"red", "message":"Build failed", "message_format":"text" }' https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

Maintenant, je voudrais introduire une date formatée. Ce script est publié avec succès, mais le "$ maintenant" est affiché littéralement: c'est-à-dire "La construction a échoué $ maintenant" plutôt que "La construction a échoué le 28/10/2014"

#!/bin/bash
now=$(date +"%m-%d-%Y")
curl -X POST -H "Content-Type: application/json" --data '{ "color":"red", "message":"Build failed $now", "message_format":"text" }' https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

J'ai essayé de formater la charge utile JSON avec printf comme ça. La chaîne de date est remplacée correctement. Cependant, cela échoue avec une erreur: "Le corps de la demande ne peut pas être analysé en tant que JSON valide: aucun objet JSON n'a pu être décodé: ligne 1 colonne 0 (caractère 0)" - il semble donc que j'utilise mal la charge utile $.

#!/bin/bash
now=$(date +"%m-%d-%Y")
payload=$(printf "\'{\"color\":\"red\",\"message\":\"Build failed %s\",\"message_format\":\"text\"}\'" $now)
curl -X POST -H "Content-Type: application/json" --data $payload https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

Enfin, j'ai tenté d'évaluer la commande entière. Cela échoue en se bloquant et il se peut que j'utilise les évasions de manière abusive. J'ai essayé de nombreuses variantes d'évasion.

#!/bin/bash
now=$(date +"%m-%d-%Y")
payload=$(printf "\'{\"color\":\"red\",\"message\":\"Build failed %s\",\"message_format\":\"text\"}\'" $now)
cmd=$(curl -X POST -H \"Content-Type: application\/json\" --data '{\"color\":\"red\",\"message\":\"Build failed $now\",\"message_format\":\"text\"}' https:\/\/api.hipchat.com\/v2\/room\/<room>\/notification?auth_token=<token>)
eval $cmd

J'ai trouvé cette question quelque peu utile et j'ai également lu cette tutoriel cURL . Ceux-ci traitent de données statiques et je pense qu'il me manque juste quelques scripts bash fondamentaux. Merci d'avance pour votre aide.

17
Davey Johnson

Vous avez juste besoin d'utiliser ' et " s'échapper correctement:

now=$(date +"%m-%d-%Y")
curl -X POST -H "Content-Type: application/json" \
    --data '{ "color":"red", "message":"Build failed '"$now"'", "message_format":"text" }' \
    https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

ou bien:

now=$(date +"%m-%d-%Y")
curl -X POST -H "Content-Type: application/json" \
    --data "{ \"color\":\"red\", \"message\":\"Build failed $now\", \"message_format\":\"text\" }" \
    https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

Envelopper les variables dans ' fera que bash les traitera littéralement en utilisant " les remplacera par la valeur de la variable

24
fejese