Да, PATH
может содержать символы новой строки (даже в древней системе Unix ).
Что касается разделения любой строки в оболочке, единственный переносимый способ сделать это — IFS
. Однако вы можете использовать IFS=:; set -f; set -- $PATH
или передать его функции вместо цикла с for
.
С помощью bash
вы также можете "читать" строку в массив :
xtra=$'some\nother\nplace\n\n'; PATH="$PATH:$xtra"
mapfile -td: path < <(printf %s "$PATH")
printf '<%s>\n' "${path[@]}"
Но использование массивов обычно не является хорошей идеей, потому что они не могут быть прозрачно сохранены в переменных окружения или переданы внешним командам в качестве одного аргумента.
Обратите внимание, что IFS
будет завершать поля, а не разделять их (примерно так же, как \n
в конце файла не будет рассматриваться как пустая строка программами, читающими файл строка -на -строка ); если это не то, что ожидается, и вы действительно хотите создать дополнительное пустое поле в конце при разбиении строки, которая заканчивается символом из IFS
, вы должны присоединиться к пустой строке после переменной, которая подлежит разбиению на слова:
(P=/bin:; IFS=:; printf '<%s>\n' $P"")
</bin>
<>
Алгоритм разделения слов также будет игнорировать пробельные символы в начале строки, если эти пробельные символы являются частью IFS
.Если вам нужно дополнительное поле для начального пробела, вы также должны добавить пустую строку перед переменной:
(P=' foo : bar '; IFS=': '; set -f; set -- $P; printf '<%s>\n' "$@")
<foo>
<bar>
(P=' foo : bar '; IFS=': '; set -f; set -- ""$P""; printf '<%s>\n' "$@")
<>
<foo>
<bar>
<>