さまざまな配列要素を削除しようとすると失敗します。
私の配列
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
ことです(たとえば、他の言語とは対照的に)。ksh
perl
zsh
存在する:
a[123]=foo a[456]=bar a[789]=baz
Bashには3つの要素を持つ連想配列があり、Bashにはperl
790個の要素(zshの場合は789個の要素)がある配列があります。
ksh
または、キーがゼロ以上のキーに基づいて数値でソートされた要素のリストから、配列の最初の要素を返しますbash
。${a[@]:0:1}
したがって、この場合は${a[123]}
代わりに返されます${a[0]}
。
unset 'a[123]'
(引用することを忘れないでください。そうしないと、現在のディレクトリにa1、a2、またはa3というファイルがある場合は失敗します。)配列から特定のキーを削除するので意味があります。
unset 'a[@]::2'
しかし、それは大きな意味がありません。 、またはそれ以降のすべての項目は無視されるbash
ため、同じことを行います。配列全体を設定解除します。unset a
unset '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
。