Bash, читайте построчно из файла, с IFS - PullRequest
10 голосов
/ 08 декабря 2010

У меня есть этот код из http://bash.cyberciti.biz/guide/While_loop,, используемый для построчного чтения из файла

file=/etc/resolv.conf
while IFS= read -r line
do
        # echo line is stored in $line
    echo $line
done < "$file"

часть, которую я не понимаю, это IFS= и то, как она способствует этой функциональности. Кто-нибудь может мне это объяснить? Спасибо.

Ответы [ 4 ]

36 голосов
/ 19 июня 2011

В этом случае IFS устанавливается в пустую строку, чтобы read не убирал начальные и конечные пробелы из строки.

Изменение IFS обычно выполняется для управления тем, как ввод будетразделить на несколько полей.Но в этом случае, поскольку для read указано только одно имя переменной, read никогда не разделит входные данные на несколько полей независимо от значения IFS.Однако он удалит начальные и конечные пробелы, как указано в спецификации POSIX (при условии, что значение IFS содержит пробел или не задано).

См. Спецификацию POSIX для read и разделение полей для подробностей о том, как это работает.

3 голосов
/ 08 декабря 2010

В третьем примере на этой странице установка нулевого значения IFS предотвращает разбиение слов, что приводит к тому, что этот код не работает.Вот этот код:

while IFS= read -r field1 field2 field3 ... fieldN
do
    command1 on $field1
    command2 on $field1 and $field3
    ..
    ....
    commandN on $field1 ... $fieldN
done < "/path/to dir/file name with space"

Как написано, все слова в строке хранятся в field1, а field2 и т. Д. Пусты.Измените строку на эту, и она будет работать правильно:

while read -r field1 field2 field3 ... fieldN
0 голосов
/ 25 мая 2014

Чтобы сделать IFS подлинным разделителем строк, используйте IFS=$'\012'.

0 голосов
/ 08 декабря 2010

IFS - это переменная для разделителя строк (или фактически «Внутренний разделитель полей»).Этот код будет эффективно очищать разделитель строк для вашей команды чтения и устанавливать его по умолчанию.Иногда IFS изменяется где-то еще в коде из-за того, что пользователям нужны другие окончания строки, например, чтение одного предложения за раз (IFS=.) или подобное.

Я думаю, они включили IFS= здесьчтобы убедиться, что он работает или все, независимо от предыдущего значения в переменной IFS.Код все еще должен работать без IFS=

...