Uso de IFS em “for loop”

Uso de IFS em “for loop”
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 $lisnão está entre aspas, portanto o shell realizará a divisão de palavras de acordo com o IFSvalor 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.

informação relacionada