麻烦bash shell脚本,尝试使用cURL POST变量JSON数据

时间:2014-10-28 17:12:50

标签: json bash curl hipchat

我遇到了bash shell脚本的问题,尝试使用cURL POST可变JSON数据。我是从Mac上运行的。我可以成功发布静态数据,但我似乎无法弄清楚如何合并变量。

我介绍了< room>和< token>为了这些例子。

此脚本成功运作:

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

现在,我想介绍一个格式化的日期。这个脚本成功发布,但“$ 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>

我尝试使用printf格式化JSON有效负载。日期字符串被正确替换。但是,这失败并出现错误:“请求正文无法解析为有效JSON:无法解码JSON对象:第1行第0列(字符0)” - 所以看起来我误用了$ payload。

#!/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 tutorial。这些处理静态数据,我想我只是缺少一些基本的bash脚本。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:24)

您只需要正确使用'"转义:

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按字面意思对待它们,而使用"会将它们替换为变量的值