Bash 本身不支持二维数组,但我想模拟一个。作为一个最小的工作示例,假设我有两个数组,a0
并且a1
:
a0=(1 2 3 4)
a1=(5 6 7 8)
我想编写一个for
循环来打印a0
and的第三个元素a1
。当然,我可以通过两次显式调用手动执行此操作echo
:
echo ${a0[2]}
echo ${a1[2]}
但是,我想用for
循环来概括这一点。我怎样才能做到这一点?
我尝试了以下方法:
for i in ${a0[@]} ${a1[@]}
do
echo {$i}[2]
echo ${i[2]}
echo ${i}[2]
echo ${$i[2]}
echo ${${i}[2]}
done
但这些尝试都没有成功。我得到这个输出:
{1}[2]
1[2]
chgreen.sh: line 30: ${$i[2]}: bad substitution
你有什么想法?
答案1
你正在迭代错误的事情。您for
将数组的每个元素保存为$i
,而不是数组的索引。你想要的是类似的东西
#!/usr/bin/env bash
a0=(1 2 3 4)
a1=(5 6 7 8)
for ((i=0;i<${#a0[@]};i++))
do
echo ${a0[$i]} ${a1[$i]};
done
答案2
正如您现在可能从研究中了解到的那样,bash 不支持多维数组本身,但它确实支持“关联”数组。这些基本上是由字符串而不是数字索引的,因此您可以拥有,例如,
grade[John]=100
grade[Paul]=100
grade[George]=90
grade[Ringo]=80
正如您链接到的问题的接受答案中所演示的(但没有很好地解释),关联数组的索引可以包含逗号,因此一个常见的技巧是将您的各个索引(0-1 × 0-3)连接成一个字符串,以逗号分隔。虽然这比普通数组更麻烦,但它是有效的:
$声明-A a <-- 创建关联数组。 $a[0,0]=1 $a[0,1]=2 $a[0,2]=3 $a[0,3]=4 $a[1,0]=5 $a[1,1]=6 $a[1,2]=7 $a[1,3]=8 $ 为 i 在 0 1 > 做 > 回显 ${a[$i,2]} > 完成 3 <-- 这是你的输出。 7
答案3
这是一种奇怪的方法,但在某些情况下可能很有用。问题是for
循环会将数组解析为其元素并单独处理每个元素。
因此,解构你的数组并重新创建它们。
a0=(1 2 3 4)
a1=(5 6 7 8)
a0=${a0[@]} # deconstruction
a1=${a1[@]}
for arr in "$a0" "$a1"; do a=( $arr ); echo ${a[2]}; done
输出
3
7