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

标签 arrays json bash hash

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

相关文章:

java - Robospice:在 HTTP 请求正文中发送 JSON 数据

bash - 如何从 Jenkinsfile 加载第二个 Jenkinsfile 但继续使用原始工作区 - 多分支管道

bash - 当我将任何命令通过管道传输到 telnet session 时会发生什么,为什么 session 会关闭

java - 如何使用 Ctrl+Z 停止请求输入?

sql - PostgreSQL 在 json 中插入动态值

javascript - jquery 删除数组中的空元素

macos - Mac终端发送带附件的邮件

php - 从二维数组的子数组中删除 "columns"

ios - 如何从 swift 中的一系列 Sprite 中进行选择

c++ - 使用递归将数组中的元素相乘