unset
要素を削除します。残りの要素の番号は付け直しません。
declare -p
何が起こるかを正確に確認するために使用できますnumbers
。
$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
守っていないnumbers
、もはや要素を持っています4
。
もう一つの例
観察する:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
配列にa
は2から21までの要素はありません。Bashでは、配列のインデックスが連続している必要はありません。
インデックスの再番号付けを強制する推奨方法
numbers
要素のない配列から始めましょう4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
インデックスを変更する場合は、次のようにします。
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
要素番号が4
あり、値があります69
。
1つの手順で要素を削除して配列の番号を付け直す別の方法
もう一度、定義しましょうnumbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Toby Speightのコメントで示唆されているように、4番目の要素を削除し、残りの要素の番号をすべて1つのステップで再設定する方法:
$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
ご覧のとおり、4番目の要素が削除され、残りのすべての要素の番号が付け直されました。
${numbers[@]:0:4}
スライス配列numbers
:要素0から始まる最初の4つの要素を取得します。
同様に、${numbers[@]:5}
配列のスライスnumbers
:要素5で始まり、配列の最後まで続くすべての要素を取得します。
配列のインデックスを取得する
配列の値はで取得できます${a[@]}
。これらの値に対応するインデックス(またはキー)を見つけるには、を使用します${!a[@]}
。
たとえば、numbers
要素が欠落している配列をもう一度考えてみましょう4
。
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
どのインデックスが割り当てられているかを確認するには:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
繰り返しますが、4
はインデックスのリストにありません。
ドキュメンテーション
からman bash
:
unset
組み込みは、配列を破壊するために使用されます。 unset name[subscript]
インデックスの配列要素を破棄しますsubscript
。インデックス付き配列への負の添え字は、上記のように解釈されます。パス名の展開による不要な副作用を回避するように注意する必要があります。 unset name
、ここでname
配列され、又はunset name[subscript]
、ここsubscript
であり *
又は @
、全体の配列を除去します。