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