O problema é com o uso incorreto de exit 127 em seu loop for, que está saindo após a primeira iteração for-loop. Você precisa agrupar a instrução echo e o exit como um bloco composto em {..} para evitar isso.
echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }
Sem esse agrupamento, o que acontece é que || defined se aplica somente para o comando echo e sempre executa o comando exit , não importa se redirecionar para arquivo passado ou falhou porque você tem um separador de comando ; definido lá.
Agora, com o agrupamento composto ativado, todo o conjunto de ações dentro de {..} é tratado como um bloco e ambos são executados se a ação de gravação para USERS.txt falhar.