如何从Bash脚本循环遍历JSON键结果

3

input.json:-

{
"menu": {
  "id": "file",
  "value": "File",
  "user": {
    "address": "USA",
    "email": "user@gmail.com"
  }
}
}

指令:

result=$(cat input.json | jq -r '.menu | keys[]')

结果:

id
value
user

遍历结果:

for type in "${result[@]}"
do
    echo "--$type--"
done

输出:

--id
value
user--

我希望能在循环中处理键值。但是,上述方法的结果是一个字符串。
如何在Bash脚本中用json键做循环?

在这种情况下使用bash是多余的。 - RomanPerekhrest
2个回答

7

规范的方法:

file='input.json'
cat "$file" | jq -r '.menu | keys[]' | 
while IFS= read -r value; do
    echo "$value"
done

bash faq #1


但是你似乎想要一个数组,所以语法应为(缺少括号):

file='input.json'

result=( $(cat "$file" | jq -r '.menu | keys[]') )

for type in "${result[@]}"; do
    echo "--$type--"
done

输出:

--id--
--value--
--user--

当执行第二种方法时,我遇到了jq:错误:语法错误,意外的IDENT,期望$end(Unix shell引用问题?)在<top-level>,第1行。 - Galet
即使在您的更新后,我仍然在这一行中得到错误 result=( $(jq -r '.menu | keys[]' input.json) )。另外,我希望input.json的名称是动态的。 - Galet
结果 =($(cat input.json | jq -r '.menu | keys []'))。这个有效。 - Galet
你需要安装它(无依赖项)。 - Gilles Quénot
谢谢,这是唯一有效的解决方案! - Nicolas Henneaux

2

仅使用bash从JSON数据中打印对象键是多余的。
Jq可以自行处理它。 使用以下简单的jq解决方案:

jq -r '.menu | keys_unsorted[] | "--"+ . +"--"' input.json

输出结果:
--id--
--value--
--user--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接