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 $lis
no está entre comillas, por lo tanto, el shell realizará la división de palabras según el IFS
valor 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.