【发布时间】:2023-03-23 15:40:01
【问题描述】:
我正在使用jq 来解析一个 json 文件 -
json 文件看起来像 -
{
"values": [
{
"email": "user1@domain.com",
"id": "USER1_ID"
},{
"email": "user2@domain.com",
"id": "USER2_ID"
},
.
]
}
我可以打印/遍历下面的 id
for k in $(cat input.json | jq .values | jq .[].id); do
echo $k
done
这会按预期打印每个单独的 id。
但是,我想要的是在循环中同时访问电子邮件和 id。
我尝试将值分配给 SHELL 变量,如下所示 -
emails=$(cat input.json | jq .values | jq .[].email)
ids=$(cat input.json | jq .values | jq .[].id)
这在大多数情况下都可以工作,但ids 也可以有空格,这打破了这一点。
我基本上可以有 2 个循环,一个用于 email,另一个用于 id,并在循环中为数组赋值
i=0
for k in $(cat input.json | jq .values | jq .[].id); do
ids[$i]=$k
i=$(($i +1))
done
和
i=0
for k in $(cat input.json | jq .values | jq .[].email); do
emails[$i]=$k
i=$(($i +1))
done
一旦我拥有数组中的两个值,我就可以并行遍历它们。
我不是 shell 专家,所以我想知道是否有任何巧妙的方法可以用更少的循环/代码行来做到这一点。
感谢您的帮助!
【问题讨论】:
-
顺便说一句,
cat foo | anything总是更好地替换为anything <foo,或者当程序支持它时,anything foo。其中任何一个都为anything提供了foo上的直接文件句柄,因此它可以四处寻找、乱序读取等;这让sort分成不同的线程来并行读取和排序文件的不同部分,或者tail直接跳到最后等等。相比之下,cat只按顺序从前到后读取,没有能力跳过。 -
...而
for anything in $(...)本身就是有缺陷的; bash 和 zsh 之间存在一些差异,但大部分 BashPitfalls #1 都适用。