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

1

Eu preciso fazer uma iteração em uma matriz e expandir a matriz durante a iteração. Como faço isso no 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 enquanto:

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 
    
por ceremcem 25.04.2016 / 22:32

1 resposta

1

Ele não funciona com um loop for ... in "${arr[@]}" 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ê pode reescrever como um loop for de contagem:

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, então, no início do próximo ciclo, o valor de ${#MODULES[@]} será aumentado em 1.

    
por 21.12.2016 / 23:59

Tags