for循环每次取整个数组的值

时间:2014-06-27 00:04:38

标签: arrays bash for-loop

假设我有3个数组,A,B和C

我想做以下事情:

A=("1" "2")
B=("3" "4")
C=("5" "6")

for i in $A $B $C; do
   echo ${i[0]} ${i[1]}
   #process data etc
done

因此,基本上i每次都获取整个数组的值,并且我能够访问存储在每个数组中的特定数据。

在第一个循环中,i应该取第一个数组A的值,在第二个循环中取数组B的值等。

上面的代码只是用i迭代得到每个数组的第一个元素的值,这显然不是我想要实现的。

因此代码只输出1,3和5。

2 个答案:

答案 0 :(得分:4)

您可以完全安全且可支持的方式执行此操作,但仅限于bash 4.3(添加namevar支持),一个从ksh移植的功能:

for array_name in A B C; do
  declare -n current_array=$array_name
  echo "${current_array[0]}" "${current_array[1]}"
done

那就是说,其他地方有可用的hackery。例如,您可以使用eval(允许恶意变量名执行任意代码,但在其他方面是安全的):

for array_name in A B C; do
  eval 'current_array=( "${'"$array_name"'[@]}"'
  echo "${current_array[0]}" "${current_array[1]}"
done

答案 1 :(得分:1)

如果数组的元素不包含空格或通配符,就像在您的问题中一样,您可以这样做:

for i in "${A[*]}" "${B[*]}" "${C[*]}"
do
    iarray=($i)
    echo ${iarray[0]} ${iarray[1]}
    # process data etc
done

"${A[*]}"扩展为包含${A[*]}所有元素的单个字符串。然后iarray=($i)在空格上拆分它,将字符串转换回数组。