Змінна 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
також використовується в"$*"
тому, чому питання має значення.