whileループでcURLを使用してjsonデータを公開する - bashシェル

whileループでcURLを使用してjsonデータを公開する - bashシェル

IDを抽出し、それを繰り返し、REST APIを実行するためにカールを使用してAPIに複数の要求を送信する必要があるJSON出力があります。たとえば、

JSON出力は次のとおりです。

{
    "glossary": [
        {
            "Title": "example glossary1",
            "id": 1,
            "description": "Hello Glossary1"
        },
        {
            "Title": "example glossary2",
            "id": 2,
            "description": "Hello Glossary2"
        },
        {
            "Title": "example glossary3",
            "id": 3,
            "description": "Hello Glossary3"
        },
        {
            "Title": "example glossary4",
            "id": 4,
            "description": "Hello Glossary4"
        }
    ]
}

シェルスクリプトは、このJSONファイルを繰り返し、IDを抽出し、繰り返し、CURLを使用してREST API呼び出しを実行する必要があります。

例は次のとおりです。

for (( i = 0 ; i < ${#id[@]} ; i++ ))
do 
     POST REST API 
done

答え1

tmp.json というファイルで出力する場合は、以下を使用してください。ジャック行ごとにIDのリストを取得し、単純なforループを使用してAPIに投稿を公開します。

for i in `cat tmp.json  | jq .glossary[].id`; do 
   curl -X POST http://host/api/$i"
done

答え2

以下は、次の使用例ですawk

#!/bin/bash

for id in $(awk '/"id":/ {sub(/,/, ""); print $2}' inputfile.json); do
    curl -X POST ...
done

答え3

awk最大3桁のIDがありません。 STDINを介してJSON結果をプッシュし、whileループを使用して読みます。

digits=0; 
while read line
do 
  foo=`echo $line|grep id|cut -c 7-$((7+digits))`
  if [[ ! $foo -eq '' ]]
    then 
      echo "curl http://webaddress/api?id=$foo"
      if [[ '$foo' == '9' ]] || [[ '$foo' == '99' ]]
      then 
        digits=$((digits+1)) 
      fi 
  fi 
done<your-json-output.json

答え4

{...}Curlを使用すると、URLに中括弧()を使用して、同じエンドポイントに対して一度に複数の要求を実行できます。

たとえば、エンドポイントが次のような場合

http://example.com/api/endpoint

その後、次のように特定のパラメータに対して3つの値を使用して呼び出すことができますid

curl 'http://example.com/api/endpoint?id={123,345,456}'

JSONドキュメントの中かっこ内にカンマで区切られた整数セットにIDを取得するには、jq次のように使用します。

jq -r '.glossary | map(.id) | "{\(join(","))}"' file

質問に記載されている文書の場合は文字列を返します{1,2,3,4}

その後、単一の呼び出しで使用できますcurl

ids=$( jq -r '.glossary | map(.id) | "{\(join(","))}"' file )

curl -s "http://example.com/api/endpoint?id=$ids"

関連情報