設定されていない要素がある配列の Bash 部分文字列の拡張

設定されていない要素がある配列の Bash 部分文字列の拡張

設定されていない要素を持つ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(少なくとも私は)が予想されます。

おすすめ記事