Великая магия оператора for о которую приходится биться каждый раз пока не усвоишь урок, кроется в том что он рубит входные данные по символам разделителям которые перечислены в переменной IFS=
Не менее странным является и то, что этой переменной невозможно присвоить один байт-символ CR (возврат каретки) 0xA.
Никакие танцы с бубнами и операторы echo не дают этой возможности.
Два символа можно
IFS=$(echo -en "\n\b") # работает echo -en "$IFS" | hexdump -C 00000000 0a 08 |..| 00000002
но один или много \n — не получается.
IFS=$(echo -en "\n\n\n\n\n") # не работает. Переменная будет пустой. echo -en "$IFS" | hexdump -C # да говорю же следующая строка будет пустой IFS=$(echo -en "A" | tr 'A' '\n') # не пойдёт! IFS="\ \ " # тоже не будет работать
Но есть вот такой хак описанный на http://www.tldp.org/LDP/abs/html/loops1.html
IFS=$'\012' echo -en "$IFS" | hexdump -C 00000000 0a |..| 00000002
После этого можно оператором for построчно читать файлы, переменные и вывод программ.