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"
заключите переменную в двойные кавычки, разбиение по словам не будет выполнено, поэтому вы должны увидеть идентичный результат — только одну строку — как в первом случае.