Como expandir um loop iterando dinamicamente em um array em BASH?

1

Preciso iterar em uma matriz e expandir a matriz enquanto iterativo. Como faço isso em BASH?

Por exemplo:

req="a b c d"
read -a MODULES <<<$req

for MODULE_NAME in "${MODULES[@]}"; do
    echo $MODULE_NAME
    if something-happens-only-one-time; then 
        MODULES+=( "e" )
    fi
done

Eu quero obter a seguinte saída:

a
b
c
d
e

Editar:

Seguir o código funciona por agora:

i=0
while true; do
    MODULE_NAME="${MODULES[$i]}"
    echo ${MODULE_NAME}

    if something-happens-only-one-time; then 
        MODULES+=( "e" )
    fi

    i=$((i+1))
    num_of_modules=${#MODULES[@]}
    if (("$i" >= "$num_of_modules")) ; then 
        break
    fi
done 
ceremcem
fonte
Você pode canalizar a matriz para classificar, em seguida, uniq -u. Ele produzirá quaisquer membros que apareçam apenas uma vez. Vejo stackoverflow.com/questions/618378/…
Argonauts

Respostas:

1

Não funciona com um for ... in "${arr[@]}" loop porque "${arr[@]}" é avaliado imediatamente. Ou seja, mesmo que você adicione elementos a ele durante o loop, o intervalo do loop já está determinado e não será afetado.

Você poderia reescrever como uma contagem for loop:

for ((i = 0; i < "${#MODULES[@]}"; i++)); do
    MODULE_NAME=${MODULES[$i]}
    echo $MODULE_NAME
    if something-happens-only-one-time; then 
        MODULES+=( "e" )
    fi
done

Isso funciona porque ${#MODULES[@]} na condição de loop é reavaliado em cada ciclo de loop. Então, depois que um valor é anexado durante o loop, em seguida, no início do próximo ciclo, o valor de ${#MODULES[@]} será aumentado em 1.

janos
fonte
O código a seguir não funciona gist.github.com/ceremcem/2f399afef92332bcd5d7b778a1da302d
ceremcem
1
@ceremcem você cometeu alguns erros lá. Aqui está a correção: gist.github.com/janosgyerik/fa5e4b2c342123f9f18d022a02f1ca47
janos
oh, sim, meu erro! :)) obrigado :))
ceremcem