2016-10-25 4 views
-1

ich als JSON-String bekam:, wie ich Variable in jq verwenden (MacOS, Shell)

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

, was ich will ist, jede id in einer Schleife tun bekommen, ich den folgenden Code verwenden:

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

aber es funktioniert nicht, ich glaube, die Art, wie ich verwende Variable falsch ist, kann ich nichts nützlich hier jq finden.

+1

Es ist nicht klar, welche Form der Eingabe, die Sie haben. Ist 'jsonString' ein tatsächliches Shell-Array mit einem JSON-Element pro Objekt? 'jq' kann bereits selbst iterieren. Wenn Sie also ein richtiges JSON-Array wie' [{...}, {...}] 'hätten, würden Sie einfach etwas wie 'echo" $ json "| verwenden jq '.id''. – chepner

+0

hast du recht wenn ich alle ID einfach ausgeben möchte. Aber ich muss jede ID im nächsten Befehl in dieser Schleife verwenden. –

Antwort

1

Lassen Sie jq die Iteration machen. (Das heißt, lassen jq durch den Eingangsstrom von JSON-Objekte die Iterieren tun.) Zum Beispiel:

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

Ausgang:

hello 3397 
hello 3396 

Auf diese Weise müssen Sie viele JSON nicht wissen, wie Objekte sind in der Eingabe. Vielleicht möchten Sie "read -r" oder "IFS = read -r" verwenden.

Die Alternativen sind hässlich und ineffizient, z.B .:

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

hat es funktioniert.ich benutze dies: echo $ requestJsonbyDate | jq '. []. id' | während ID lesen; do \t echo "hallo $ id"; erledigt –