unset
remove um elemento. Não renumerar os elementos restantes.
Podemos usar declare -p
para ver exatamente o que acontece com 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")
Observe que numbers
não possui mais um elemento 4
.
Outro exemplo
Observe:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
A matriz a
não possui elementos de 2 a 21. O Bash não exige que os índices da matriz sejam consecutivos.
Método sugerido para forçar uma renumeração dos índices
Vamos começar com a matriz numbers
com o elemento em falta 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Se quisermos que os índices mudem, então:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Existe agora um número de elemento 4
e o valor 69
.
Método alternativo para remover um elemento & renumerar array em uma etapa
Mais uma vez, vamos definir numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Como sugerido por Toby Speight nos comentários, um método para remover o quarto elemento e renumerar o elementos restantes em um único passo:
$ 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")
Como você pode ver, o quarto elemento foi removido e todos os demais elementos foram renumerados.
${numbers[@]:0:4}
array de fatias numbers
: leva os primeiros quatro elementos começando com o elemento 0.
Da mesma forma, ${numbers[@]:5}
matriz de partições numbers
: leva todos os elementos, começando pelo elemento 5 e continuando até o final da matriz.
Obtendo os índices de uma matriz
Os valores de uma matriz podem ser obtidos com ${a[@]}
. Para encontrar os índices (ou chaves ) que correspondem a esses valores, use ${!a[@]}
.
Por exemplo, considere novamente nossa matriz numbers
com o elemento ausente 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Para ver quais índices são atribuídos:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Novamente, 4
está faltando na lista de índices.
Documentação
De man bash
:
The
unset
builtin is used to destroy arrays.unset name[subscript]
destroys the array element at indexsubscript
. Negative subscripts to indexed arrays are interpreted as described above. Care must be taken to avoid unwanted side effects caused by pathname expansion.unset name
, wherename
is an array, orunset name[subscript]
, wheresubscript
is*
or@
, removes the entire array.