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
unsetbuiltin 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, wherenameis an array, orunset name[subscript], wheresubscriptis*or@, removes the entire array.