lis="a:b:c:d:"
IFS=:
Se eu executar o seguinte código,
for i in "a:b:c:d:";
do
echo the output is $i
done
Eu recebo:
the output is a b c d
Se eu substituir "a:b:c:d:" por $lis:
for i in $lis;
do
echo the output is $i
done
Eu tenho a saída esperada:
the output is a
the output is b
the output is c
the output is d
Eu me pergunto o que há de errado, $lis é basicamente o mesmo que "a:b:c:d"
Responder1
A grande diferença é onde a divisão de palavras é realizada. Aspas duplas garantem que uma string literal ou variável entre aspas "$lis"
seria tratada como um único item
for i in "a:b:c:d:";
do
echo the output is $i
done
Portanto, neste loop, as aspas duplas "a:b:c:d:"
são um único item, por isso você vê apenas uma linha de saída
the output is a b c d
for i in $lis;
do
echo the output is $i
done
Aqui o $lis
não está entre aspas, portanto o shell realizará a divisão de palavras de acordo com o IFS
valor que você definiu. O shell verá que há 4 itens fornecidos para o loop for. É por isso que você vê quatro linhas de saída.
Se você colocar aspas duplas na "$lis"
variável, a divisão do Word não será executada, portanto você deverá ver uma saída idêntica - apenas uma linha - ao primeiro caso.