BashスクリプトからJSON配列へのループ

BashスクリプトからJSON配列へのループ

APIにカールリクエストを行い、jqを使用してjsonを再インポートします。

結果

{
  "errors": [],
  "metadata": {
    "clientTransactionId": "",
    "serverTransactionId": "20190318164551347"
  },
  "responses": [
    {
      "comment": "",
      "keyData": {
        "algorithm": 13,
        "flags": 257,
        "protocol": 3,
        "publicKey": "a1"
      },
      "keyTag": 28430
    },
    {
      "comment": "",
      "keyData": {
        "algorithm": 13,
        "flags": 257,
        "protocol": 3,
        "publicKey": "a4"
      },
      "keyTag": 28430
    },
    {
      "comment": "",
      "keyData": {
        "algorithm": 13,
        "flags": 257,
        "protocol": 3,
        "publicKey": "fa4"
      },
      "keyTag": 33212
    }
  ],
  "status": "success",
  "warnings": []
}

これで、keyDataの4つの値を使用して2番目のAPIリクエストを作成するループが必要です。

しかし、どうすればいいですか?長い間検索しましたが見つかりませんでした。

私の要求:

curl -v -X POST --data '{
    "authToken": ".......",
    "clientTransactionId": "",
}' https:/domain.tld/api/v1/json/keysList | jq .

jq '.responses []'を使用すると、「配列」がありますが、私の値を含むループの解決策を見つけることはできません。

答え1

jq「keyData」オブジェクトを検索した後、次のパイプに使用できますwhile read

jq -c '.responses[].keyData' file.json

{"algorithm":13,"flags":257,"protocol":3,"publicKey":"a1"}
{"algorithm":13,"flags":257,"protocol":3,"publicKey":"a4"}
{"algorithm":13,"flags":257,"protocol":3,"publicKey":"fa4"}

そこから:

jq -c '.responses[].keyData' file.json | 
while read keydata; do curl --data "'$keydata'" http://example.com/service ; done

curlのコマンドを入力すると、パイプライン全体は次のようになります。

curl -v -X POST --data '{ "authToken": ".......", "clientTransactionId": "",}' https:/domain.tld/api/v1/json/keysList | 
jq -c '.responses[].keyData' file.json | 
while read keydata; do curl --data "'$keydata'" http://example.com/service ; done

curl実行する前に、実際のURL、オプションなどを使用して2番目のコマンドを変更する必要があります。必要に応じて、echoコマンドの前に/ステートメントを追加して、要求がどのように表示されるかを確認できます。printfcurl

答え2

または、UNIXユーティリティを使用できます。jtcトラバースキーデータ:

bash $ <file.json jtc -w'[responses][:][keyData]' -r
{ "algorithm": 13, "flags": 257, "protocol": 3, "publicKey": "a1" }
{ "algorithm": 13, "flags": 257, "protocol": 3, "publicKey": "a4" }
{ "algorithm": 13, "flags": 257, "protocol": 3, "publicKey": "fa4" }
bash $ 

カーリングに与える。

bash $ <file.json jtc -w'[responses][:][keyData]' -r | while read keydata; do curl --data "'$keydata'" http://example.com/service ; done

関連情報