Что означает IFS=$'\n' в сценариях

02.06.2018

Теги: BashCLIIFSLinuxПеременная

Переменная IFS хранит «внутренние разделители полей». Она используется оболочкой для определения того, как выполнять разбиение на слова. Разбиение на слова происходит при преобразованиях командной строки, выполняемых оболочкой перед тем, как запустить командную строку на исполнение. Значение IFS умолчанию состоит из пробельных символов (пробел, табуляция и новая строка). Каждый из этих символов может быть границей слова.

Напишем небольшой сценарий:

#!/bin/bash
string='11111:22222 33333:44444 55555:66666'
for item in $string; do
    echo $item
done
11111:22222
33333:44444
55555:66666

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

#!/bin/bash
string='11111:22222 33333:44444 55555:66666'
IFS=:
for item in $string; do
    echo $item
done
11111
22222 33333
44444 55555
66666

Оболочка все также разбивает string на слова — но теперь она рассматривает только двоеточие как границу слова.

Первый символ IFS является особым: он используется для разграничения слов в выводе при использовании специальной переменной $* в кавычках:

#!/bin/bash
# задаем позиционные параметры $1 $2 $3
set first second third

# выводим значение переменной "$*"
echo "$*"
# изменяем значение переменной IFS
IFS=':-;'
# выводим значение переменной "$*"
echo "$*"
first second third
first:second:third

Переменная $* содержит позиционные параметры, начиная с первого. Когда $* указывается в двойных кавычках, она заменяется одним словом, содержащим значения каждого параметра, разделенных первым символом специальной переменной IFS.

#!/bin/bash
# задаем позиционные параметры $1 $2 $3
set first second third

for item in $*; do
    echo $item
done
echo '==============='
for item in "$*"; do
    echo $item
done
first
second
third
===============
first second third

Что касается IFS=$'\n', то это способ присвоить IFS значение символа новой строки.

#!/bin/bash
IFS=$'\n'
for entry in $(cat /etc/passwd) ; do
    echo "Values in $entry"
    IFS=:
    for value in $entry ; do
        echo $value
    done
done

Поиск: Bash • CLI • IFS • Linux • Переменная

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.