让我们说:
$ 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
(我知道它是一个外壳震惊易受攻击的版本。我的穷人公司。)
答案 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