Arrays 当一些元素未定义时,如何迭代数组中的所有元素?

Arrays 当一些元素未定义时,如何迭代数组中的所有元素?,arrays,bash,Arrays,Bash,比如说: $ a[0]=1 $ a[2]=2 然后,当我这样做时: $ for b in "${a[@]}"; do echo $b; done 1 3 这不是我想要的。因为我跳过了a[1],所以它的扩展意义不大。跳过“未定义”索引。我希望它能为这些显示一条空行,即: 1 3 甚至数组的长度也不是很理想: $ echo ${#a[@]} 2 将其明确化也行不通: $ unset a $ declare -a a $ a[0]=1 $ a[2]=2 $ for b in "${a[@]}

比如说:

$ a[0]=1
$ a[2]=2
然后,当我这样做时:

$ for b in "${a[@]}"; do echo $b; done
1
3
这不是我想要的。因为我跳过了
a[1]
,所以它的扩展意义不大。跳过“未定义”索引。我希望它能为这些显示一条空行,即:

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

(我知道这是一个易受外壳冲击的版本。我可怜的公司。)

你所描述的是正确的行为。然而,如果你想在一个连续的范围内迭代,因为你知道开始和结束索引,你可以简单地做

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

你所描述的是正确的行为。然而,如果你想在一个连续的范围内迭代,因为你知道开始和结束索引,你可以简单地做

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

注意:这是一致的。考虑关键点,而不是索引。
“${a[@]}”
的展开是数组中的值。
“${!a[@]}”
的扩展是数组中带有值的索引。
“${#a[@]}”的展开式是数组中的元素数。要想得到你想要的,你需要自己维护一个“最大索引”。。。我不认为这是一致的。如果它混淆了数组和关联数组,它从一开始就失去了一致性。@HuStmpHrrr不要混淆稀疏数组和关联数组。注意:它是一致的。考虑关键点,而不是索引。
“${a[@]}”
的展开是数组中的值。
“${!a[@]}”
的扩展是数组中带有值的索引。
“${#a[@]}”的展开式是数组中的元素数。要想得到你想要的,你需要自己维护一个“最大索引”。。。我不认为这是一致的。如果它混淆了数组和关联数组,它从一开始就失去了一致性。@HuStmpHrrr不要混淆稀疏数组和关联数组。注意:它是一致的。考虑关键点,而不是索引。
“${a[@]}”
的展开是数组中的值。
“${!a[@]}”
的扩展是数组中带有值的索引。
“${#a[@]}”的展开式是数组中的元素数。要想得到你想要的,你需要自己维护一个“最大索引”。。。我不认为这是一致的。如果它混淆了数组和关联数组,它从一开始就失去了一致性。@hustmphrr不要混淆稀疏数组和关联数组。