2016-10-25 3 views
-1

(맥 OS, 쉘) :나는 같은 JSON 문자열을 가지고

{ 
    "id": 3397, 
    "title": "title_1" 
} 
{ 
    "id": 3396, 
    "title": "title_2" 
} 

제가하고 싶은 것은, 루프에서 나는 다음과 같은 코드를 사용 을 모든 id을 얻을 수 있습니다 :

for ((i = 0; i < requestCount; i++)); do 
     requestId=$(echo $jsonString[$i] | jq '.id') 
     echo requestId; 
done 

하지만이 작동하지 않습니다, 나는 내가 변수가 잘못 사용하는 방법은, 내가 여기 jq 유용한 아무것도 찾을 수 있다고 생각합니다.

+1

, 예컨대을 추하고 비효율적 그것은 당신이 입력 어떤 형태로 분명하지 않다. 'jsonString'은 객체 당 하나의 JSON 요소를 가진 실제 쉘 배열입니까? 'jq'는 이미 자체적으로 반복 할 수 있으므로'[{...}, {...} '와 같은 적절한 JSON 배열이 있다면'echo "$ json"| jq '.id' '. – chepner

+0

당신이 옳다면 나는 모든 id를 간단하게 출력하고 싶습니다. 하지만이 루프의 다음 명령에서 모든 ID를 사용해야합니다. –

답변

1

jq를 반복합니다. (즉, JQ는 JSON 객체의 입력 스트림을 통해 반복하는 작업을 수행 할 수 있습니다.) 예를 들어 :

$ jq .id <<< "$json" | while read id ; do echo "hello $id"; done 

출력 :

hello 3397 
hello 3396 

이 방법, 당신은하지 않아도 얼마나 많은 JSON을 알고 객체가 입력에 있습니다. "read -r"또는 "IFS = read -r"을 사용하고자 할 수 있습니다.

대안은 :

$ for ((i=0;i<2;i++)) ; do jq -s --argjson i "$i" '.[$i].id' <<< "$json" ; done 
+0

그것이 작동했습니다. 이걸 사용하십시오 : echo $ requestJsonbyDate | jq '. []. id'| 동안 읽기 ID; do \t echo "hello $ id"; 완료 –