A substituição de comandos remove novas linhas finais, por isso $(printf '\n')
é a mesma coisa que $(printf '\n\n\n\n')
, ou seja, a string vazia.
Para incluir uma nova linha em uma string, coloque-a entre aspas simples ou duplas.
for i in 1 2 3; do
foo="$foo
$i"
done
Você pode achar menos feio definir uma variável para armazenar apenas uma nova linha.
nl='
'
for i in 1 2 3; do
foo="$foo$nl$i"
done
No ksh93, bash, FreeBSD sh, mksh e zsh, mas não sh simples (ainda), você também pode usar aspas simples, o que permite escapes de barra invertida.
for i in 1 2 3; do
foo="$foo"$'\n'"$i"
done