如何在未定义某些元素时迭代数组中的所有元素?

时间:2015-06-02 19:39:26

标签: arrays bash

让我们说:

$ a[0]=1
$ a[2]=2

然后,当我这样做时:

$ for b in "${a[@]}"; do echo $b; done
1
3

这不是我想要的。因为我跳过a[1],所以它没有在很好的意义上延伸。 " undefined"索引被跳过。我希望它能为那些人显示一条空行,即:

1

3

甚至不太期待数组的长度:

$ echo ${#a[@]}
2

明确表示也不会工作:

$ unset a
$ declare -a a
$ a[0]=1
$ a[2]=2
$ for b in "${a[@]}"; do echo $b; done
1
2
$ echo ${#a[@]}
2

所以解决这个问题的方法呢?这导致数组长度,索引和迭代之间的不一致。

bash版本不是太旧了:

$ bash --version
GNU bash, version 4.0.28(1)-release

(我知道它是一个外壳震惊易受攻击的版本。我的穷人公司。)

1 个答案:

答案 0 :(得分:0)

您所描述的是sparse arrays的正确行为。但是,如果你想迭代连续范围,因为你知道开始和结束索引,你可以简单地做...

for (( i=0; i<=lastIndex; i++ )); do
    echo "${array[i]}"
done

如果未设置array[i],则展开将为空字符串,因此您将获得所要求的内容。

如果您知道索引,您可以使用其他数组获取它们:

indices=( "${!array[@]}" )
firstIndex="${indices[0]}"
lastIndex="${indices[-1]}"
for (( i=firstIndex; i<=lastIndex; i++ )); do
    echo "${array[i]}"
done