Como adicionar / remover um elemento de / para o array no bash?

23

Eu tenho uma matriz contendo alguns elementos, mas quero empurrar novos itens para o início da matriz; Como eu faço isso?

    
por Gaurav KS 08.12.2016 / 08:47

2 respostas

24

Para adicionar um elemento ao início de um uso de matriz.

arr=("new_element" "${arr[@]}")

Geralmente, você faria.

arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")

Para adicionar um elemento ao final de um uso de matriz.

arr=( "${arr[@]}" "new_element" )

Ou

arr+=( "new_element" )

Geralmente, você faria.

arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )

Para adicionar um elemento ao índice específico de um uso de matriz.

Digamos que queremos adicionar um elemento à posição de Index2 arr [2] , nós realmente nos fundiríamos abaixo dos sub-arrays:

  1. Obtenha todos os elementos antes da posição do índice2 arr [0] e arr [1] ;
  2. Adicione um elemento ao array;
  3. Obtenha todos os elementos com Index position2 até o último arr [2] , arr [3] ,

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )
    

Removendo um elemento da matriz

Além de remover um elemento de uma matriz (digamos, elemento # 2), precisamos concatenar duas sub-matrizes. A primeira sub-matriz manterá os elementos antes do elemento nº 2 e a segunda sub-matriz conterá os elementos após o elemento nº 2.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2} terá dois elementos arr [0] e arr [1] começa no início da matriz.
  • ${arr[@]:3} irá obter todos os elementos de index3 arr [3] para o último.

Outra possibilidade de remover um elemento é

  1. Usando unset (na verdade, atribua valor 'nulo' ao elemento)

    unset arr[2]
    
  2. Use o padrão de substituição se você souber o valor de seus elementos.

    arr=( "${arr[@]/PATTERN/}" )
    
por 29.09.2017 / 07:42
2

Observe que os arrays em bash (copiados do ksh) são matrizes associativas.

a=(newvalue "$a[@]")

criaria uma nova matriz $a com newvalue as ${a[0]} e os elementos da matriz original acrescentados na ordem numérica de sua chave com as teclas 1, 2 ...

Por exemplo, se você tivesse:

bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")

Isso explica por que não há operador interno para isso.

Se você quiser inserir newvalue as ${a[0]} e alterar todas as outras chaves em um, precisará de um array temporário:

b=newvalue
for k in "${!a[@]}"; do
  b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
  a[k]=${b[k]}
done
unset b

Shells como zsh ou yash que possuem arrays normais possuem operadores para isso:

  • zsh :

    a[1,0]=newvalue
    

    (também funciona para prepending strings para variáveis escalares)

  • yash :

    array -i a 0 newvalue
    
por 29.09.2017 / 11:12