Переменная IFS используется каждый раз, когда оболочка выполняет задачу, называемую разделением слов . Наиболее распространенные случаи, когда это используется, - это расширение параметра (например, $var
) или подстановка команды (например, $(some-command)
или устаревшие обратные ссылки) в команде. Здесь, если расширение содержит какие-либо IFS
символы, то перед обработкой команды оно разделяется на разные «слова». Фактически это означает, что эти символы разделяют замещенный текст на разные аргументы (включая имя команды, если переменная указана первой).
Таким образом, причина значения по умолчанию IFS
пробела, табуляции и перехода на новую строку заключается в том, что это пробельные символы, которые обычно должны разделять слово.
Один из способов предотвратить расщепление слов - использовать двойные кавычки вокруг расширения ( "$var"
) - фактически, вы сделали это в своем вопросе. Если вы этого не сделаете, не будет никакого вывода, так echo
как у него не будет аргументов, только символы, разделяющие аргументы.
Также обратите внимание, что два места, где разделение слов не происходит после раскрытия параметра, - с присвоением переменной (например, var=$othervar
и var=$(somecommand)
в порядке) и внутри [[ ]]
конструкции ( [[ $var = $othervar ]]
в порядке, но [ $var = $othervar ]
следует заключать в кавычки).
Наконец, как однажды сказал мне один мудрец, распространенное заблуждение состоит в том, что предотвращение разбиения слов является единственной причиной для цитирования переменной. Это не так, цитирование также предотвращает расширение имени пути или расширение глобуса, как это более широко известно. Если переменная содержит подобные символы глобуса, *
то они могут быть расширены до имен файлов, когда переменная используется без кавычек в команде. Например, рассмотрим:
var=*
echo $var
Это отобразит имена файлов в текущем каталоге.
Как указывает Стефан ниже , IFS
при расширении важен порядок символов внутри "$*"
. Со bash
страницы руководства :
"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable. If IFS is unset, the parameters are separated by spaces. If
IFS is null, the parameters are joined without intervening separators.
Дополнительные примеры разбиения слов приведены в этом ответе - https://unix.stackexchange.com/a/118444/48083.
$IFS
также используется"$*"
, поэтому порядок имеет значение.