我刚刚在索引到未设置元素的 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
返回:x
从该索引到末尾的元素。
返回第一次提取的元素:x:y
。y
它必须是一个接一个的视图。
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