Aposto que o seu loop faz parte de um pipeline
seq 5 | while read num; do x+=$num; done; echo $x
# expect "12345", actually see ""
No bash, quando você constrói um pipeline, ele gera sub-shells para todas as partes. Quando o subshell sai, qualquer variável modificada dentro dele é destruída também.
Você precisa codificar com mais cuidado para garantir que você use a variável no mesmo shell em que você a modifica.
Este exemplo ecoa o var na mesma sub-lista:
$ seq 5 | { while read num; do x+=$num; done; echo $x; }
12345
Este exemplo usa substituição de processo para que o loop seja executado no shell atual
$ while read num; do x+=$num; done < <(seq 5)
$ echo $x
12345