2016-10-25 6 views
-1

私はとしてJSON文字列を得た:私がやりたいことは、ループ内のすべてのid、 は、私は次のコードを使用して取得することですどのように私はJQで変数を使用することができます(MacOSの、シェル)

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

:それは動作しません

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

しかし、私は、変数の使用方法が間違っている、私はjqここに有益な何かを見つけることができませんと思います。

+1

それはあなたが持っている入力のどのような形は明らかではありません。 'jsonString'は実際のシェル配列で、オブジェクトごとに1つの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エコー "hello $ id"; 完了 –

関連する問題