2014-10-28 12 views
14

Mam problem ze skryptem powłoki bash, próbując POST zmiennej danych JSON przy użyciu cURL. Używam Maca. Mogę z powodzeniem publikować dane statyczne, ale nie mogę wymyślić, jak włączyć zmienne.Problemy ze skryptem powłoki bash, próby wprowadzenia danych JSON zmiennej POST przy użyciu cURL

Wprowadziłem < pokój > i <token> dla tych przykładów.

Skrypt ten działa skutecznie:

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

Teraz chciałbym przedstawić sformatowaną datę. Ten skrypt posty pomyślnie, ale „$ teraz” jest zamieszczona dosłownie: czyli „Budowa udało $ teraz” zamiast „Budowa udało 10-28-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> 

Próbowałem sformatować ładunek JSON z printf jak więc. Ciąg daty zostanie poprawnie zastąpiony. Jednak błąd ten kończy się błędem: "Treść żądania nie może być analizowana jako poprawny JSON: Żaden obiekt JSON nie może zostać zdekodowany: wiersz 1 kolumna 0 (znak 0)" - więc wydaje się, że nadużywałem $ ładunku.

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

W końcu próbowałem ocenić całe polecenie. To zawiedzie przez powieszenie i może to być, że niewłaściwie używam ucieczek. Próbowałem wielu odmian ucieczki.

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

Znalazłem to question być nieco pomocny i mam również przeczytać ten cURL tutorial. Te dotyczą statycznych danych i myślę, że po prostu brakuje mi podstawowych skryptów basha. Z góry dziękuję za Twoją pomoc.

+1

[Jak używać cytatów w Bash] (http://mywiki.wooledge.org/Quotes) – l0b0

Odpowiedz

23

Wystarczy użyć ' i " uciec odpowiednio:

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> 

lub alternatywnie:

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> 

zmienne Zawijanie ' uczyni bash traktować je dosłownie podczas korzystania " uczyni je zastępuje wartość zmiennej

Powiązane problemy