設定されていない要素を持つbash配列をインデックス付けするときに奇妙な動作が見つかりました。次の3つの要素で配列を作成します。
$ arry[3]=a
$ arry[4]=b
$ arry[5]=c
配列が正しいようです。
$ echo ${#arry[@]}
3
$ echo ${!arry[@]}
3 4 5
しかし、配列の最初の3つの値を取得しようとすると、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は私が知っている唯一の配列スパースシェルです(つまり、キーが正の整数に制限され、キーに基づいて数字でソートされる連想配列です)。
私が知っている他のすべてのシェル(zsh、yash、fish、csh、tcsh、rc、es ...)の配列は通常の配列です(インデックスは1から始まります。0ではなく1(少なくとも私は)が予想されます。
答え2
~によるとBashのパラメータ拡張
: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