Iterar através de uma matriz e adicionar novos itens à matriz

1

Eu tenho uma configuração de matriz:

target_array=(
    "item1 -a100 -b250 -caaa"
    "item2 -a110 -cbbb -d1sa"
    "item3 -d2sa -exxx -fyyy"
)

Eu então faço uma iteração no array e executo várias ações:

for target_item in "${target_array[@]}"; do
    #Do Stuff Here
    #and create new items
    x=111
    y=222
    z=333
done

Dentro do loop eu recebo novas variáveis e preciso adicioná-las ao array, então eu acabaria com algo como:

target_array=(
    "item1 -a100 -b250 -caaa -x111 -y222 -z333"
    "item2 -a110 -cbbb -d1sa -x112 -y223 -z334"
    "item3 -d2sa -exxx -fyyy -x113 -y224 -z335"
)

Mas como posso adicionar esses itens à matriz? Devo adicioná-los ao array existente ou criar um novo array?

Estou tentando portar um script de powershell onde eu usaria um 'objeto' que continha itens (item1) e propriedades (-a) com valores (100). Mas não conseguíamos ver um equivalente no Linux, então um array parecia ser a próxima melhor coisa.

    
por IGGt 05.01.2016 / 17:13

2 respostas

3

Supondo que você esteja usando bash , é possível iterar o array usando índices, em vez de valores, com a construção ${!array[@]} e, em seguida, substitua cada elemento pelo novo valor:

for target_item in "${!target_array[@]}"; do
    x=111
    y=222
    z=333
    target_array["$target_item"]+=" -x$x -y$y -z$z"
done

Infelizmente, não é possível, em bash , desdobrar o índice de um elemento da matriz do seu valor.

Em zsh você pode simplificar o procedimento com um chamado sinalizador subscrito especial (i) e fazer um loop sobre uma matriz normalmente:

for target_item in "${target_array[@]}"; do
     x=111                    
     y=222                    
     z=333
     i="${target_array[(i)$target_item]}"
     target_array[$i]+=" -x$x -y$y -z$z"
done
    
por 05.01.2016 / 17:49
0

Criando uma nova matriz no loop e definindo a matriz original para essa nova matriz:

target_array=(
    "item1 -a100 -b250 -caaa"
    "item2 -a110 -cbbb -d1sa"
    "item3 -d2sa -exxx -fyyy"
)

for target_item in "${target_array[@]}"; do
    # Do Stuff Here
    # and create new items
    x=111
    y=222
    z=333

    new_array+=( "$target_item -x$x -y$y -z$z" )
done

target_array=( "${new_array[@]}" )

Usando /bin/sh (porque eu prefiro a sintaxe necessária para trabalhar com a sintaxe de matriz um pouco volumosa de $@ over bash ):

set -- \
    "item1 -a100 -b250 -caaa" \
    "item2 -a110 -cbbb -d1sa" \
    "item3 -d2sa -exxx -fyyy"

for target_item do
    # Do Stuff Here
    # and create new items
    x=111
    y=222
    z=333

    set -- "$@" "$target_item -x$x -y$y -z$z"
    shift
done

A matriz modificada é "$@" .

    
por 18.07.2018 / 21:03