2014-10-28 10 views
14

Ho problemi con uno script di shell bash, il tentativo di dati JSON variabili POST utilizzando cURL. Sto scappando da un Mac. Posso inserire correttamente i dati statici ma non riesco a capire come incorporare le variabili.Problemi con lo script di shell bash, tentativo di dati JSON variabili POST utilizzando cURL

Ho introdotto <room> e <token> per il gusto di questi esempi.

Questo script funziona con successo:

#!/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> 

Ora, vorrei introdurre una data formattata. Questo script messaggi con successo, ma il "$ ora" è pubblicato letteralmente: vale a dire "generazione non riuscita $ ora" piuttosto che "generazione non riuscita 2014/10/28"

#!/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> 

ho tentato di formattare il payload JSON con printf come così. La stringa della data è stata sostituita correttamente. Tuttavia, ciò non riesce con un errore: "Il corpo della richiesta non può essere analizzato come JSON valido: Nessun oggetto JSON può essere decodificato: riga 1 colonna 0 (char 0)" - quindi sembra che io stia utilizzando in modo errato il carico 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> 

Infine, ho tentato di valutare l'intero comando. Questo fallisce impiccandosi e potrebbe essere che sto abusando delle fughe. Ho provato molte varianti di fuga.

#!/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 

ho trovato questo question di essere un po 'utile e Ho anche letto questo cURL tutorial. Si tratta di dati statici e penso che mi manchi solo alcuni fondamentali script di bash. Grazie in anticipo per il vostro aiuto.

+1

[Come utilizzare le virgolette in Bash] (http://mywiki.wooledge.org/Quotes) – l0b0

risposta

23

Hai solo bisogno di usare ' e " fuga correttamente:

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> 

o in alternativa:

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> 

variabili wrapping ' farà bash li trattano letteralmente mentre usando " li renderà sostituiti da il valore della variabile

Problemi correlati