[
{
"name": "John",
"age": 20
},
{
"name": "Alice",
"age": 25
},
{
"name": "Bob",
"age": 14
}
]
length
を使ってインデックスでアクセスする
json=$(cat list.json)
len=$(echo $json | jq length)
for i in $( seq 0 $(($len - 1)) ); do
row=$(echo $json | jq .[$i])
done
よく、in の次にjqコマンドを書く例を見かけるが、これは良くない
for item in $(jq -c '.[]' list.json); do
name=$(echo "$item" | jq -r '.name')
age=$(echo "$item" | jq -r '.age')
echo "name: $name, age: $age"
done
何度もjqを呼び出すのでパフォーマンスが良くない
while read -r
を使う
詳細解説 jqコマンドとシェルスクリプトの正しい使い方と考え方 〜 データの流れを制するUNIX哲学流シェルプログラミング - Qiita
TAB=$(printf '\t')
jq -r '.[] | [.name, .age, .count] | @tsv' list.json | {
while IFS="$TAB" read -r name age; do
printf "name: %-10s age: %2d\n" "$name" "$age"
done
}
while文の中で変数を更新したい場合
パイプで渡すと変数が更新されないので注意 shellでwhile readの中で変数を変更しても反映されない
$ TAB=$(printf '\t')
$ children=0
$ while IFS="$TAB" read -r name age; do
printf "name: %-10s age: %2d\n" "$name" "$age"
if [[ $age -lt 18 ]]; then
children=$((children+1))
fi
done < <(jq -r '.[] | [.name, .age] | @tsv' list.json)
$ echo $children
1