Что означает IFS=$'\n' в сценариях
02.06.2018
Теги: Bash • CLI • IFS • Linux • Переменная
Переменная 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 • Переменная