Переменная IFS в Linux

Переменная IFS в Linux

Уважаемые, есть идеи, почему я вижу пустое значение для переменной IFS?

bash-4.2$ set | grep -i ifs
IFS=$' \t\n'

bash-4.2$ echo $IFS

bash-4.2$
bash-4.2$

решение1

Вы видите пустое значение, потому чтоэто то чтоявляетсявсегда хранится в IFS: он содержит пробел (невидимый), табуляцию (также невидимую) и перевод строки (тоже невидимый).

Он не содержит знака доллара, никаких обратных косых черт, никаких букв: это просто setпопытка отобразить переменную, содержащую невидимые символы. Таким образом, он \tпредставляет табуляцию, а \nпредставляет перенос строки, а окружение $'...'указывает, что комбинации обратных косых черт следует интерпретировать как специальные символы, а не как буквальный текст.

setиспользует этот конкретный формат, потому что его также можно задатьназадв оболочку как часть какой-то другой команды. Например, run echo $'Hello\tworld!выведет вкладку, где \tнаходится. И на самом делебег IFS=$' \t\n'поскольку команда действительно установит переменную IFS на пробел + табуляция + перенос строки.

решение2

Потому что \tи \nанализируются на входе и преобразуются в фактические коды символов. Поэтому вывод echo $IFSвыглядит как пробелы (и некоторые удаляются при анализе аргумента, поскольку вы не заключили его в кавычки). Если вы хотите увидеть фактическое содержимое, преобразуйте в шестнадцатеричный формат и не забудьте заключить в кавычки, чтобы избежать анализа символов:

IFS=$' \t\n'
printf '%s' "$IFS" | hd
00000000  20 09 0a                                          | ..|
00000003
0

Связанный контент