Я читал эту ветку: Как перебрать строки файла?
Что такое IFS
? И как его использовать в контексте for
-loops?
Я читал эту ветку: Как перебрать строки файла?
Что такое IFS
? И как его использовать в контексте for
-loops?
IFS
обозначает - это символ, который разделяет поля. В примере, который вы разместили, он установлен на символ новой строки ( ); поэтому после его установки текст будет обрабатываться построчно. В этом примере вы можете изменить значение (на некоторую букву, которая есть во входном файле) и проверить, как будет разделяться текст.Input
Internal Field Separator
\n
for
IFS
Кстати, из ответа вы опубликовали второе решение, которое рекомендуется ...
Как @jasonwryan заметил, что это не Input
но Internal
. Название Input
пришло из awk
которого тоже есть OFS
- Output Field Separator
.
S
был для сепаратора в оболочке Bourne, откуда он произошел. В оболочке Korn и в большинстве других оболочек типа Bourne, как это было определено ранееPOSIX
, параметрS
is for Delimiter (просто немного напрягает воображение),A::B:
например, разделен на «A», «» и «B» (без дополнительных ""). Это отличается отawk
'sFS
илиs
флага расширения параметраzsh
.IFS
не имеет прямого отношения к зацикливанию, это связано с разделением слов.IFS
косвенно определяет, как выходные данные команды разбиваются на части, по которым цикл повторяется.Если у вас есть незащищенная замена переменных
$foo
или подстановка команд$(foo)
, есть два случая:"$foo"
или в присваивании переменнойx=$foo
, тогда строка, полученная в результате подстановки, используется как есть.$IFS
, считается разделителем слов. Например,IFS=":"; foo="12:34::78"; echo $foo
печатает12 34 78
(с двумя пробелами между34
и78
, так как есть пустое слово).foo="*"; echo $foo
печатает список файлов в текущем каталоге.Для циклов, как и во многих других контекстах, ожидайте список слов. Так
разбивается
$(foo)
на слова и рассматривает каждое слово как шаблон глобуса. Значением по умолчаниюIFS
является пробел, табуляция и новаяfoo
строка , поэтому, если вывести две строки,hello world
аhowdy
затем выполнить тело цикла с помощьюx=hello
, тоx=world
иx=howdy
. ЕслиIFS
явно изменить только на новую строку, цикл выполняется дляhello world
иhowdy
. ЕслиIFS
изменяется , чтобы бытьo
, то цикл выполняется дляhell
, w
,rldh
(где
это символ новой строки) иwdy
.источник
"IFS indirectly determines how ..."
?IFS
(напрямую) определяет способ разбиения выходных данных подстановки команд, который затем (косвенно) определяет цикл.Из
man bash
Это одна из внутренних переменных Bash. Он определяет, как Bash распознает поля или границы слов при интерпретации символьных строк.
Хотя по умолчанию используется пробел (пробел, табуляция и новая строка), его можно изменить, например, для анализа файла данных, разделенных запятыми.
http://tldp.org/LDP/abs/html/internalvariables.html
источник
В дополнение к предыдущим отличным ответам, позвольте мне добавить, что IFS очень полезен для эффективного и переносимого анализа в простых случаях в сочетании с set . Эффективно, потому что избегает использования подоболочек и нерестильных инструментов, таких как grep или sed:
Просто отметьте, что нам нужно сохранить и восстановить предыдущее значение IFS, чтобы избежать нежелательных поломок в других частях скрипта.
источник