在 bash 中使用 for 循环遍历多个数组

在 bash 中使用 for 循环遍历多个数组

Bash 本身不支持二维数组,但我想模拟一个。作为一个最小的工作示例,假设我有两个数组,a0并且a1

a0=(1 2 3 4)
a1=(5 6 7 8)

我想编写一个for循环来打印a0and的第三个元素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

相关内容