Проблема с bash оболочкой script, попытка использования данных POST переменной JSON с использованием cURL
У меня возникли проблемы с оболочкой bash script, пытаясь использовать данные POST переменной JSON, используя cURL. Я бегу от Mac. Я могу успешно опубликовать статические данные, но я не могу понять, как включить переменные.
Я ввел <room> и < токен > для этих примеров.
Этот script работает успешно:
#!/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>
Теперь я хотел бы ввести отформатированную дату. Этот script успешно отправляется, но "$ now" отправляется буквально: например, "Build failed $now", а не "Build failed 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>
Я попытался отформатировать полезную нагрузку JSON с помощью printf. Строка даты заменяется должным образом. Однако это не удается с ошибкой: "Тело запроса не может быть проанализировано как действительное JSON: объект JSON не может быть декодирован: строка 1 столбец 0 (char 0)" - поэтому мне кажется, что я неправильно использую $полезную нагрузку.
#!/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>
Наконец, я попытался оценить всю команду. Это не удается, вися, и может быть, что я злоупотребляю побегами. Я пробовал много вариантов экранирования.
#!/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
Я нашел этот question несколько полезным, и я также прочитал это Учебник cURL. Они имеют дело со статическими данными, и я думаю, что мне просто не хватает фундаментальных сценариев bash. Заранее благодарю вас за помощь.
Ответы
Ответ 1
Вам просто нужно правильно использовать '
и "
:
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>
или, альтернативно:
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>
Обертывание переменных в '
сделает bash обрабатывать их буквально, тогда как использование "
заставит их заменить значение переменной