2014-10-28 2 views
14

Ich habe Probleme mit einem Bash-Shell-Skript, versucht, Variable JSON-Daten mit cURL POST. Ich renne von einem Mac. Ich kann statische Daten erfolgreich veröffentlichen, aber ich kann nicht herausfinden, wie man Variablen integriert.Problem mit Bash Shell-Skript versucht POST Variable JSON-Daten mit cURL

Ich habe für diese Beispiele <Raum> und <Token> eingeführt.

Dieses Skript arbeitet erfolgreich:

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

Nun würde Ich mag eine formatierte Datum einzuführen. Diese Skript Beiträge erfolgreich, aber der „$ jetzt“ wörtlich geschrieben wird: also eher „Build jetzt $ fehlgeschlagen“ als

„Build 2014.10.28 fehlgeschlagen“
#!/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> 

ich versuchte, die JSON-Nutzlast-Format mit printf wie damit. Die Datumszeichenfolge wird ordnungsgemäß ersetzt. Dies schlägt jedoch mit einem Fehler fehl: "Der Anfragetext kann nicht als gültiger JSON analysiert werden: Es konnte kein JSON-Objekt dekodiert werden: Zeile 1 Spalte 0 (Char 0)" - so scheint es, als würde ich $ Payload missbrauchen.

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

Schließlich versuchte ich, den gesamten Befehl auszuwerten. Das scheitert am Hängen und es könnte sein, dass ich Fluchten missbrauche. Ich habe viele Fluchtvarianten ausprobiert.

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

Ich fand diese question etwas hilfreich sein, und ich habe auch dieses cURL tutorial lesen. Diese befassen sich mit statischen Daten und ich denke, ich vermisse nur grundlegende Bash Scripting. Vielen Dank im Voraus für Ihre Hilfe.

+1

[Wie verwendet man Zitate in Bash] (http://mywiki.wooled.org/Quotes) – l0b0

Antwort

23

Sie müssen nur ' verwenden und " richtig entkommen:

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> 

oder alternativ:

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> 

Wrapping Variablen in ' wird sie machen, während bash behandeln buchstäblich " verwendet, wird sie ersetzt durch machen der Wert der Variablen