我遇到了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脚本。提前感谢您的帮助。
答案 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按字面意思对待它们,而使用"
会将它们替换为变量的值