【问题标题】:Associative array populate in a for loop关联数组填充在 for 循环中
【发布时间】:2021-05-06 01:03:09
【问题描述】:

我必须根据我的 API Get 调用来填充我的关联数组。我的脚本是这样的,其中“get_fileshares”是一个定义的函数,它返回一个文件列表,其中包含名称和 ID 作为字段。现在,我想在旅途中填充我的关联数组,这样对于这个 JSON,我的数组应该如下所示 我的数组应该是:

name=07bff899-4440-4ba9-85f5-c3e47555dc0e
name2=07bff899-4440-4ba9-85f5-c3e47555dc02

JSON

    "values": [
            {
                "name": "test",
                "id": "07bff899-4440-4ba9-85f5-c3e47555dc0e"
            }
    
            {
                "name2": "test",
                "id": "07bff899-4440-4ba9-85f5-c3e47555dc02"
            }
           ]



declare -A a
n=($(get_fileshares | jq --raw-output '.values[].name'))
aa=($(get_fileshares | jq --raw-output '.values[].id'))
for (( i=0; i<${#n[@]}; i++ )); do
    #echo ${d}
    a[("${n[i]}")]+=("${aa[i]}")
done

错误:无法将列表分配给数组成员

【问题讨论】:

  • "无法将列表分配给数组成员" -- bash 数组是严格的一维数组。如果您需要更复杂的数据结构,则必须选择另一种语言。
  • 但我没有将列表分配为值。我只是将一个键分配给一个值。但很明显,我的关联数组有很多 K,V 对。这在 bash 中可行吗?
  • 我打算这样做:a[n[I]]=a[aa[I]]
  • But I am not assigning a list as value - 您正在将数组元素添加到数组元素 - a[...] += ( ... ) - bash 中没有二维数组。

标签: bash associative-array


【解决方案1】:

您正在将+= 新数组元素( ..) 添加到数组元素a[...]。而是分配实际值。

n=(name name2)
aa=(samplevalue samplevalue2)
declare -A a
for (( i=0; i<${#n[@]}; i++ )); do
    a[${n[i]}]="${aa[i]}"
done
declare -p a

建议使用更具描述性的变量名称,然后是“aa”“n”或“a”...

使用 https://shellcheck.net 检查您的脚本。修改一些 bash 介绍。

考虑写一个更好的jq,比如jq -r '.[] | to_entries | (.[] | select(.value == "test") | .key), (.[] | select(.value != "test") | .value)',而不是使用arr=(..)来分割元素。研究何时在 shell 中使用引用,研究分词和文件名扩展。

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多