gpt4 book ai didi

arrays - 在循环中将变量添加到 bash 数组

转载 作者:行者123 更新时间:2023-12-01 22:59:17 24 4
gpt4 key购买 nike

我有一个包含键和值的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com