Что означает 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 • Переменная