带有某些未设置元素的数组的 Bash 子字符串扩展

带有某些未设置元素的数组的 Bash 子字符串扩展

我刚刚在索引到未设置元素的 bash 数组时发现了一个奇怪的行为。我用这三个元素创建一个数组:

$ arry[3]=a
$ arry[4]=b
$ arry[5]=c

该数组似乎是正确的:

$ echo ${#arry[@]}
3
$ echo ${!arry[@]}
3 4 5

但是,如果我尝试获取数组中的前三个值,我会得到a所有这些值:

$ echo ${arry[@]:0:1}
a
$ echo ${arry[@]:1:1}
a
$ echo ${arry[@]:2:1}
a

我必须使用实际的键来获取我设置的元素:

$ echo ${arry[@]:3:1}
a
$ echo ${arry[@]:4:1}
b
$ echo ${arry[@]:5:1}
c

看起来子字符串扩展“offset”意味着实际的数组索引,如果未设置,Bash 就会继续滚动,直到找到设置的元素。

承认这一点,是否有任何直接的方法来获取具有某些未设置元素的索引数组的第 n 个值?

答案1

有没有直接的方法来获取带有某些未设置元素的索引数组的第 n 个值?

我认为并非没有临时数组:

a=([3]=2 [1]=12 [12]=4 [23]=5)

a_indices=("${!a[@]}")

third_element=${a[${a_indices[2]}]}

或者

a_normalized=("${a[@]}")
third_element=${a_normalized[2]}

这是 ksh 的遗产。 ksh 和 bash 是我所知道的唯一数组稀疏的 shell(或者换句话说,它们是关联数组,其键仅限于正整数并按其键进行数字排序)。

我所知道的所有其他 shell 的数组(zsh、yash、fish、csh、tcsh、rc、es...)都是普通数组(索引从 1 开始就像 1(至少我)所期望的那样,而不是 0)。

答案2

根据Bash 中的参数扩展

返回:x从该索引到末尾的元素。

返回第一次提取的元素:x:yy

它必须是一个接一个的视图。

ar[2]=a
ar[3]=b
ar[5]=y
ar[6]=z

echo ${ar[@]:0}
# a b z y

echo ${ar[@]:0:3}
# a b z

echo ${ar[@]:4}
# y z

相关内容