我有一个json文件,其中包含我想添加到bash数组中的键和值,但我无法让它工作.

1、使用数据创建JSON文件

# JSON file
echo '{"persons": [{"name":"John", "age":30, "car":"big"}, {"name":"Alice", "age":29, "car":"big"}]}' > my.json

2、迭代姓名和年龄

# Looping over JSON
jq -c '.persons[]' my.json | while read p;
do
    name=$(echo $p | jq -r '.name')
    age=$(echo $p | jq -r '.age')
    echo "Name: $name"
    echo "Age: $age"
done

姓名和年龄按预期打印出来.

3、手动向数组中添加名称和年龄

# Creating array and adding elements
declare -A mylookup
key="James"
value="31"
mylookup[$key]=$value

4、判断是否添加了值

for key in "${!mylookup[@]}"
do
    echo "Key: $key"
    echo "Value: ${lookup[$value]}"
done

奇怪的是,我只正确地显示了 keys

5、向循环中的数组添加名称和年龄

# Creating array and adding elements
declare -A mylookup
jq -c '.persons[]' my.json | while read p;
do
    name=$(echo $p | jq -r '.name')
    age=$(echo $p | jq -r '.age')
    mylookup[$name]=$age
done

6、打印数组中的键和值

现在,我判断添加到数组中的内容.

for key in "${!mylookup[@]}"
do
    echo "Key: $key"
    echo "Value: ${lookup[$value]}"
done

未打印任何内容.....我在哪里失败了?我怀疑在向数组中添加键和值时出现了问题,但我无法找出问题所在.

推荐答案

数组值正在丢失,因为您在此处使用的是管道.由于while循环在Forking 子shell中运行,因此所有变量都只在Forking 子shell中设置,并且在父shell中没有看到任何更改.

您可以使用此选项来避免:

declare -A mylookup

while IFS=$'\t' read n a; do
   mylookup[$n]="$a"
done < <(jq -r '.persons[] | "\(.name)\t\(.age)"' my.json)

# check array content
declare -p mylookup
declare -A mylookup=([Alice]="29" [John]="30" )

< <(...)等于process substitution

Json相关问答推荐

最新版本的Deneb在数据溢出时不支持滚动

如何创建可由Gin序列化到json的排序键值映射?

处理输入数据并转换为更简单的格式-PowerBI

如何让JSON子查询在没有行的情况下返回空数组而不是NULL

使用Kotlin限制序列化类属性的允许整数值

将部分数据字节解组到自定义 struct 中

简单条形图和有序分类中条形图的 colored颜色 梯度

使用 jq 从带有转义反斜杠字符的嵌套 JSON 中提取数据

NoneType 对象的 Python 类型错误

迭代powershell双维json对象

如何在 terraform 输出中打印一组用户信息

Golang 解组行为:字段过多?

将 json 文件转换为 json 对象会打乱对象的顺序

PowerShell:如何将哈希表输出为 json 并使用 foreach 循环将其存储在变量中?

如何使用 Newtonsoft.Json 反序列化 JSON 数组

如何使用 C# 将 JSON 文本转换为对象

如何在 django rest 框架中定义列表字段?

有什么方法可以在 elasticsearch 服务器中导入 json 文件(包含 100 个文档).?

FastAPI:如何将正文读取为任何有效的 json?

使用 jQuery 和 JSON 填充表单?