我有一个包含键和值的 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
奇怪的是我只正确显示了 key
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 循环在 fork 子 shell 中运行,因此所有变量仅在 fork 子 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
关于arrays - 在循环中将变量添加到 bash 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72287313/