我正在尝试遍历all
索引中包含的所有元素。这是我的json字符串:
{
"all":[
{
"id":"51a"
},
{
"id":"52b"
},
{
"id":"53c"
}
]
}
我尝试用jq
进行迭代:
for id in $(jq '.all.id | keys | .[]' <<< "$json"); do
echo "$id"
done
但是出现以下错误:
jq:错误(在9处):无法索引字符串为“ id”的数组
我希望得到以下输出:
51a
52b
53c
答案 0 :(得分:2)
喜欢:
for id in $(jq -r '.all[].id' <<< "$json"); do
echo "$id"
done
请注意,如果要删除双引号,则必须使用-r
选项:
· --raw-output / -r: With this option, if the filter´s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.
整个脚本如下所示:
#!/usr/bin/env bash
json='{
"all":[
{
"id":"51a"
},
{
"id":"52b"
},
{
"id":"53c"
}
]
}'
for id in $(jq -r '.all[].id' <<< "$json"); do
echo "$id"
done
但是如注释中所述,for x in $(...)
是反模式,不应使用:https://mywiki.wooledge.org/DontReadLinesWithFor。
要将两个索引分配给2个单独的变量:
#!/usr/bin/env bash
json='{
"all":[
{
"id":"51a",
"name":"Steve"
},
{
"id":"52b",
"name":"Phoebe"
},
{
"id":"53c",
"name":"Dino"
}
]
}'
jq -r '.all[] | .id + " " + .name' <<< "$json" |
while read -r id name; do
echo id: "$id"
echo name: "$name"
done
答案 1 :(得分:1)
这是基于JSON的步行路径Unix工具的替代解决方案: jtc
:
bash $ for id in $(jtc -qq -w'[all][:][id]' <<< "$json"); do echo "$id"; done
51a
52b
53c
bash $
PS>披露:我是jtc
工具的创建者