19

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 スクリプトがいくつか欠けていると思います。よろしくお願いいたします。

4

1 に答える 1

26

'適切に使用して"エスケープするだけです。

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 はそれらを文字どおりに扱いますが、使用"すると変数の値に置き換えられます。

于 2014-10-28T17:18:05.967 に答える