Bashで配列範囲を設定解除する方法

Bashで配列範囲を設定解除する方法

さまざまな配列要素を削除しようとすると失敗します。

私の配列

root@ubuntu:~/work# echo ${a[@]}
cocacola.com airtel.com pepsi.com

0-1 配列の印刷は大丈夫に見えます。

root@ubuntu:~/work# echo ${a[@]::2}
cocacola.com airtel.com

今、私はこれらの要素だけを削除しようとしています:

root@ubuntu:~/work# unset a[@]::2
root@ubuntu:~/work# echo ${a[@]}

配列全体を削除します。

私は何が間違っていましたか?

配列範囲を削除する別の方法を見つけましたが、上記の方法が機能しないのはなぜですか?

for ((i=0; i<2; i++)); do unset a[$i]; done

編集私も試しましたが運がありませんでした

unset -v 'a[@]::2'

ベストアンサー1

覚えておくべきことの1つは、このような配列がつまり、キーが正の整数に制限されている連想配列で実装されているbashことです(たとえば、他の言語とは対照的に)。kshperlzsh

存在する:

a[123]=foo a[456]=bar a[789]=baz

Bashには3つの要素を持つ連想配列があり、Bashにはperl790個の要素(zshの場合は789個の要素)がある配列があります。

kshまたは、キーがゼロ以上のキーに基づいて数値でソートされた要素のリストから、配列の最初の要素を返しますbash${a[@]:0:1}したがって、この場合は${a[123]}代わりに返されます${a[0]}

unset 'a[123]'

(引用することを忘れないでください。そうしないと、現在のディレクトリにa1、a2、またはa3というファイルがある場合は失敗します。)配列から特定のキーを削除するので意味があります。

unset 'a[@]::2'

しかし、それは大きな意味がありません。 、またはそれ以降のすべての項目は無視されるbashため、同じことを行います。配列全体を設定解除します。unset aunset 'a[123]'unset 'a[*/@]'unset 'a[@]::2'unset 'a[@]please'

キー範囲を設定解除するには、キーを繰り返す必要があります。

配列のキーリストを取得するには、構文はです"${!a[@]}"。残念ながら、カバレッジは機能しないため、bash一時的なksh配列が必要です。

keys=("${!a[@]}")
for i in "${keys[@]::2}"; do unset "a[$i]"; done

今、これらの配列を他の言語のように考えたい場合は、使用したくありませんunset。たとえば、配列が最初から稀でなく、それを稀に維持したい場合(たとえば、すべての要素を2に移動して最初の2つを設定解除する代わりに、次のことを実行できます。

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

つまり、保持する要素のリストに配列を再割り当てします。

比較のためにzsh

a=({1..20})
unset 'a[12,16]'

要素12〜16はnullに設定されます。 whileはunset 'a[16,20]'配列を15要素に縮小します。

a=({1..20})
a[12,16]=()

(still zsh)は、要素17を20の5つの位置に移動するため、a[12]含まれます17

おすすめ記事