cURL を使用して可変 JSON データを POST しようとして、bash シェル スクリプトに問題があります。私は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 10-28-2014」ではなく「Build failed $now」です。
#!/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)」 - $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 スクリプトがいくつか欠けていると思います。よろしくお願いいたします。