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개 값을 사용하여 두 번째 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, 옵션 등을 사용하여 두 번째 명령을 수정해야 합니다. 필요한 경우 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

관련 정보