Уважаемые, есть идеи, почему я вижу пустое значение для переменной 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