Uso de IFS en “bucle for”

Uso de IFS en “bucle for”
lis="a:b:c:d:"

IFS=:

Si ejecuto el siguiente código,

for i in "a:b:c:d:";
do 
    echo the output is $i
done

Yo obtengo:

the output is a b c d

Si reemplazo "a:b:c:d:" con $lis en su lugar:

for i in $lis;
do 
    echo the output is $i
done

Tengo el resultado esperado:

the output is a
the output is b
the output is c
the output is d

Me pregunto qué pasa, $lis es básicamente lo mismo que "a:b:c:d"

Respuesta1

La gran diferencia es dónde se realiza la división de palabras. Las comillas dobles garantizan que una cadena literal o una variable entre comillas "$lis"se trate como un solo elemento

for i in "a:b:c:d:";
do 
    echo the output is $i
done

Por lo tanto, en este bucle, las comillas dobles "a:b:c:d:"son un solo elemento, de ahí que solo vea una línea de salida.

the output is a b c d

for i in $lis;
do 
    echo the output is $i
done

Aquí el $lisno está entre comillas, por lo tanto, el shell realizará la división de palabras según el IFSvalor que haya establecido. El shell verá que hay 4 elementos proporcionados al bucle for. De ahí que vea cuatro líneas de salida.

Si comillas dos veces "$lis"la variable, no se realizará la división de palabras, por lo que deberías ver un resultado idéntico (solo una línea) al primer caso.

información relacionada