web-dev-qa-db-ja.com

bashシェルスクリプトでのトラブル、POST cURLを使用して可変JSONデータを試みる

Bashシェルスクリプトで問題があり、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 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

私はこれを見つけました question やや有用であり、これも読みました cURL tutorial 。これらは静的データを処理するものであり、基本的なbashスクリプトが欠落しているだけだと思います。よろしくお願いします。

17
Davey Johnson

'および"エスケープを適切に使用するだけです。

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は文字列をそのまま処理しますが、"を使用すると変数の値に置き換えられます。

24
fejese