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.