Bash中的多维关联数组

Bash中的多维关联数组,bash,hash,multidimensional-array,hashtable,associative-array,Bash,Hash,Multidimensional Array,Hashtable,Associative Array,我正在尝试创建多维关联数组,但需要一些帮助。我已经复习了,但它让我更加困惑。到目前为止,我的情况如下: 剧本: #!/bin/bash declare -A PERSONS declare -A PERSON PERSON["FNAME"]='John' PERSON["LNAME"]='Andrew' PERSONS["1"]=${PERSON[@]} PERSON["FNAME"]='Elen' PERSON[&

我正在尝试创建多维关联数组,但需要一些帮助。我已经复习了,但它让我更加困惑。到目前为止,我的情况如下:

剧本:

#!/bin/bash
declare -A PERSONS
declare -A PERSON
PERSON["FNAME"]='John'
PERSON["LNAME"]='Andrew'
PERSONS["1"]=${PERSON[@]}
PERSON["FNAME"]='Elen'
PERSON["LNAME"]='Murray'
PERSONS["2"]=${PERSON[@]}
for KEY in "${!PERSONS[@]}"; do
 TMP="${PERSONS["$KEY"]}"
 echo "$KEY - $TMP"
 echo "${TMP["FNAME"]}"
 echo "${TMP["LNAME"]}"
done
输出:

1 - John Andrew
John Andrew
John Andrew
2 - Elen Murray
Elen Murray
Elen Murray
如您所见,尝试访问for循环中$TMP数组的特定索引将返回整个数组

[Q]我需要做什么才能分别访问
for
循环中$TMP数组的“FNAME”和“LNAME”索引?

谢谢

#!/bin/bash
declare -A PERSONS
declare -A PERSON
PERSON["FNAME"]='John'
PERSON["LNAME"]='Andrew'
PERSONS["1"]=${PERSON[@]}
PERSON["FNAME"]='Elen'
PERSON["LNAME"]='Murray'
PERSONS["2"]=${PERSON[@]}
for KEY in "${!PERSONS[@]}"; do
 TMP="${PERSONS["$KEY"]}"
 echo "$KEY - $TMP"
 **echo "${PERSON["FNAME"]}"
 echo "${PERSON["LNAME"]}**"
done

因为单独名称的原始数组仍然处于活动状态,并且它仍然可以在
for
循环中引用。

您无法执行您试图执行的操作:是一维的

$ declare -A PERSONS
$ declare -A PERSON
$ PERSON["FNAME"]='John'
$ PERSON["LNAME"]='Andrew'
$ declare -p PERSON
declare -A PERSON='([FNAME]="John" [LNAME]="Andrew" )'
$ PERSONS[1]=([FNAME]="John" [LNAME]="Andrew" )
bash: PERSONS[1]: cannot assign list to array member
您可以通过组合合适的数组索引字符串来伪造多维性:

declare -A PERSONS
declare -A PERSON

PERSON["FNAME"]='John'
PERSON["LNAME"]='Andrew'
i=1
for key in "${!PERSON[@]}"; do
  PERSONS[$i,$key]=${PERSON[$key]}
done

PERSON["FNAME"]='Elen'
PERSON["LNAME"]='Murray'
((i++))
for key in "${!PERSON[@]}"; do
  PERSONS[$i,$key]=${PERSON[$key]}
done

declare -p PERSONS
# ==> declare -A PERSONS='([1,LNAME]="Andrew" [2,FNAME]="Elen" [1,FNAME]="John" [2,LNAME]="Murray" )'

我知道你需要什么。我也希望在几周内保持同样的状态。 我不知道是使用Python还是Bash。 最后,在探索其他东西时,我发现了这个

在这里,我了解了如何分配一些字符串,并在以后将其用作命令。 然后,凭借我的创造力,我找到了解决您问题的方法,如下所示:-



输出:- 1-声明-一个人='([FNAME]=“John”[LNAME]=“Andrew”)'

声明-A PERSON='([FNAME]=“John”[LNAME]=“Andrew”)'

内FNAME-John

内名-安德鲁

2-声明-一个人='([FNAME]=“Elen”[LNAME]=“Murray”)'

声明-一个人='([FNAME]=“Elen”[LNAME]=“Murray”)'

内部FNAME-Elen

内名-默里


bash中多维数组的实际问题,特别是在您的方法中,是将PERSON数组值分配给数组元素PERSONS[1],在分配它时,数组元素PERSONS[1]被转换为列表而不是assoc数组。 因此,它不再将其作为数组的两个元素,因为您没有在值中保留任何有关数组数据结构的信息。
因此,我发现这种方法已经足够了,只有一个限制,即每次需要存储/检索值时都必须这样做。但这会解决你的问题。

对不起,我不明白你的解决办法。我不想访问$PERSON数组,因为一旦创建了$PERSON数组,就不能再访问它了。抱歉-我已经通读了我的解决方案,它是错误的,稍后我会再回来。我尝试了你的解决方案,但这不是我要找的,因为当我在$PERSON中循环时,我按以下顺序得到了这4个元素:“1,LNAME=Andrew”、“2,FNAME=Elen”、“1,FNAME=John”和“2,LNAME-Murray”这些我无法使用的元素。我仍然不明白为什么bash不能支持多维数组。最后我所做的就是将一个变量($PERSON数组)赋给数组元素($PERSONS[“X”])。为什么这个变量的类型很重要?bash是否检查并阻止将数组分配给数组元素?@user359650,这是bash开发人员的设计决策。引用bash手册中我的话:“bash提供一维索引和关联数组变量。”您所做的是分配字符串(“我想你需要再看看你在做什么——如果你一定要有多维数组,那么你使用的工具就错了。另外,关联数组没有特定的顺序。另请参见:and.niccccccce..我希望我使用python!!1
#!/bin/bash

declare -A PERSONS
declare -A PERSON

PERSON["FNAME"]='John'
PERSON["LNAME"]='Andrew'
string=$(declare -p PERSON)
#printf "${string}\n"
PERSONS["1"]=${string}
#echo ${PERSONS["1"]}

PERSON["FNAME"]='Elen'
PERSON["LNAME"]='Murray'
string=$(declare -p PERSON)
#printf "${string}\n"
PERSONS["2"]=${string}
#echo ${PERSONS["2"]}

for KEY in "${!PERSONS[@]}"; do
   printf "$KEY - ${PERSONS["$KEY"]}\n"
   eval "${PERSONS["$KEY"]}"
   printf "${PERSONS["$KEY"]}\n"
   for KEY in "${!PERSON[@]}"; do
      printf "INSIDE $KEY - ${PERSON["$KEY"]}\n"
   done
done