unset
remove um elemento Não renumera 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 há mais um elemento 4
.
Outro exemplo
Observar:
$ 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 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 numbers
matriz 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")
Se gostaríamos que os índices mudassem, 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")
Agora existe um número de elemento 4
e ele tem valor 69
.
Método alternativo para remover um elemento e renumerar uma matriz em uma etapa
Novamente, vamos definir numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Conforme sugerido por Toby Speight nos comentários, um método para remover o quarto elemento e renumerar os elementos restantes em uma única etapa:
$ 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 elementos restantes foram renumerados.
${numbers[@]:0:4}
matriz de fatias numbers
: leva os quatro primeiros elementos começando com o elemento 0.
Da mesma forma, ${numbers[@]:5}
array de fatias numbers
: leva todos os elementos começando com o elemento 5 e continuando até o final do array.
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 estã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
:
O unset
builtin é usado para destruir matrizes. unset name[subscript]
destrói o elemento da matriz no índice subscript
. Os subscritos negativos para matrizes indexadas são interpretados como descrito acima. Deve-se tomar cuidado para evitar efeitos colaterais indesejados causados pela expansão do nome do caminho. unset name
, onde name
é uma matriz, ou unset name[subscript]
, onde subscript
é *
ou @
, remove a matriz inteira.