Você está dizendo que enquanto o IFS foi definido como $' \t\n' , seu loop será executado. Deve ser algo assim:
while IFS=$' \t\n' read -r val
do
((lines++))
echo "lines=$lines val=$val"
done < myfile
O valor padrão de IFS deve ser $' \t\n' , portanto, defini-lo como redundante. Eu também acredito que read por padrão lerá linhas inteiras, e eu acho que mesmo configurar o IFS para $' ' ainda fará com que ele leia toda a linha.
Se você quiser que read delimite por espaços, você pode usar a opção -d desta forma:
read -r -d' ' val
do
((lines++))
echo "lines=$lines val=$val"
done < myfile
Isso irá percorrer todas as strings delimitadas por espaços em myfile .