O Mapfile é uma maneira conveniente de ler linhas de um arquivo em uma matriz indexada, não tão portátil quanto a leitura, mas um pouco mais rápido. Ao usar o loop for, você evita criar um subshell.
#!/bin/bash
mapfile -t < file.txt
for line in "${MAPFILE[@]}"; do
echo $line
done
Lembre-se de que ao usar pipelines, ele colocará o loop while em um subshell. Alterações dentro das variáveis do loop while não serão propagadas para a parte externa do script.
Exemplo:
#!/bin/bash
a=0
printf %s\\n {0..5} | while read; do
((a++))
done
echo $a # 'a' will always be 0.
(Melhor solução):
#!/bin/bash
b=0
while read; do
((b++))
done < <(printf %s\\n {0..5})
echo $b # 'b' equal to 6 (works as expected).