Bash for循环会跳过关联数组中的元素

时间:2020-05-10 18:17:18

标签: linux bash

我有以下两个关联数组

P=([5]=0 [2]=1 [3]=2)
Q=([4]=0 [1]=5 [1]=3)

我有一个循环,迭代P中的每个元素和Q中的每个元素,以将P中的每个元素与Q中的所有元素对应,如下所示< / p>

for i in ${!P[@]}; do 
   for j in ${!Q[@]}; do 
      echo ${P[i]}
      echo "-" 
      echo ${Q[j]} 
      echo "-----------"
    done 
done

预期输出为

1
-
3
-----------
1
-
0
----------- ################# it skips that
1
-
5
----------- #################
2
-
3
-----------
2
-
0
----------- ################# it skips that
2
-
5
----------- #################
0
-
3
-----------
0
-
0
----------- ################# it skips that
0
-
5             
----------- #################

但是它会跳过第二个数组5中的一个元素。

1 个答案:

答案 0 :(得分:3)

您是否在数组Q初始化中实现了错字?您已经用1索引了数组两次?

Q=([4]=0 [1]=5 [1]=3)
#        ^^^   ^^^

因此,该数组的行为将取第二个索引条目的值。因此,数组扩展"${!Q[@]}"永远不会看到包含值5

的键。
declare -p Q
declare -A Q=([1]="3" [4]="0" )

也许您想将数组初始化更改为

Q=([4]=0 [5]=5 [1]=3)

这也很奇怪,您在发布的代码中根本看不到任何输出。因为数组是按索引打印的,所以应该在下标中使用扩展值,即使用"$i""$j"

for i in "${!P[@]}"; do 
   for j in "${!Q[@]}"; do 
      echo "${P[$i]}"
      echo "-" 
      echo "${Q[$j]}" 
      echo "-----------"
    done 
done
相关问题