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.
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