Использование IFS в цикле «for»

Использование IFS в цикле «for»
lis="a:b:c:d:"

IFS=:

Если я запущу следующий код,

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

Я получил:

the output is a b c d

Если я заменю "a:b:c:d:" на $lis:

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

У меня есть ожидаемый результат:

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

Интересно, что не так, $lis по сути то же самое, что и "a:b:c:d"

решение1

Большая разница в том, где выполняется разделение слов. Двойные кавычки гарантируют, что литеральная строка или заключенная в кавычки переменная, как "$lis"будет рассматриваться как один элемент

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

Следовательно, в этом цикле двойные кавычки "a:b:c:d:"являются одним элементом, поэтому вы видите только одну строку вывода.

the output is a b c d

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

Здесь $lisне кавычки, поэтому оболочка выполнит разбиение слов в соответствии с IFSустановленным вами значением. Оболочка увидит, что в цикл for предоставлено 4 элемента. Поэтому вы видите четыре строки вывода.

Если вы "$lis"заключите переменную в двойные кавычки, разбиение по словам не будет выполнено, поэтому вы должны увидеть идентичный результат — только одну строку — как в первом случае.

Связанный контент