Aqui está uma maneira engraçada de fazer o seu loop:
for item in ${list//\n/
}
do
echo "Item: $item"
done
Um pouco mais sensível / legível seria:
cr='
'
for item in ${list//\n/$cr}
do
echo "Item: $item"
done
Mas isso é muito complexo, você só precisa de um espaço:
for item in ${list//\n/ }
do
echo "Item: $item"
done
A variável $line
não contém novas linhas. Ele contém instâncias de \
seguidas por
%código%. Você pode ver isso claramente com:
$ cat t.sh
#! /bin/bash
list="One\ntwo\nthree\nfour"
echo $list | hexdump -C
$ ./t.sh
00000000 4f 6e 65 5c 6e 74 77 6f 5c 6e 74 68 72 65 65 5c |One\ntwo\nthree\|
00000010 6e 66 6f 75 72 0a |nfour.|
00000016
A substituição está substituindo aqueles com espaços, o que é suficiente para trabalhar em loops forçados:
$ cat t.sh
#! /bin/bash
list="One\ntwo\nthree\nfour"
echo ${list//\n/ } | hexdump -C
$ ./t.sh
00000000 4f 6e 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f |One two three fo|
00000010 75 72 0a |ur.|
00000013
Demo:
$ cat t.sh
#! /bin/bash
list="One\ntwo\nthree\nfour"
echo ${list//\n/ } | hexdump -C
for item in ${list//\n/ } ; do
echo $item
done
$ ./t.sh
00000000 4f 6e 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f |One two three fo|
00000010 75 72 0a |ur.|
00000013
One
two
three
four