我在使用 bash shell 脚本时遇到问题,尝试使用 cURL 发布可变 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
我发现这个问题有点帮助,我也阅读了这个cURL 教程。这些处理静态数据,我认为我只是缺少一些基本的 bash 脚本。预先感谢您的帮助。