假设我有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。
答案 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)
在空格上拆分它,将字符串转换回数组。