Это задокументировано в man bash
. Единственное вхождение любого символа в IFS, который не является пробелом, ограничивает поле.
От man bash
:
Оболочка обрабатывает каждый символ IFS как разделитель и разбивает результаты других расширений на слова, используя эти символы в качестве разделителей полей. Если IFS не установлен, или его значение в точности <space><tab><newline>
, по умолчанию, то последовательность <space>
,
<tab>
и <newline>
в начале и в конце результатов предыдущих расширений, игнорируется, а любая последовательность символов МФСА не в начале или в конце служит для определения границ слова. Если IFS имеет значение, отличное от значения по умолчанию, то последовательности пробельных символов пробела, табуляции и новой строки игнорируются в начале и конце слова, если символ пробела находится в значении IFS (символ пробела IFS ). Любой символ в IFS, который не является пробелом IFS, вместе с любыми соседними символами пробела IFS разделяет поле. Последовательность пробельных символов IFS также рассматривается как разделитель. Если значение IFS равно нулю, разделение слов не происходит. [Акцент добавлен.]
Примеры: разделение полей
Если IFS не имеет пробельных символов, тогда пробел включается в поля:
$ ( IFS=',' x='one , two,three'; printf "<%s>\n" $x )
<one >
< two>
<three>
Если IFS имеет и пробелы, и запятую, то последовательности пробелов, за которыми следует запятая, а затем последовательности пробелов, рассматриваются как один разделитель:
$ ( IFS=' ,' x='one , two,three'; printf "<%s>\n" $x )
<one>
<two>
<three>
Последовательности запятых интерпретируются как последовательности пустых полей:
$ ( IFS=' ,' x='one,,,two,three'; printf "<%s>\n" $x )
<one>
<>
<>
<two>
<three>
Примеры: пробелы в начале и в конце
Если IFS не содержит пробелов, тогда любые пробелы в начале и конце сохраняются в полях:
$ ( IFS=',' x=' one , two,three ,'; printf "<%s>\n" $x )
< one >
< two>
<three >
Если IFS содержит пробелы, то удаляются все начальные или конечные последовательности пробелов:
$ ( IFS=' ,' x=' one , two,three ,'; printf "<%s>\n" $x )
<one>
<two>
<three>