Предполагая, что у вас есть строка с пробелами в качестве разделителей:
newline_separated=${space_separated// /$'\n'}
Однако вы, вероятно, задаете не тот вопрос. (Не обязательно, например, это может появиться в make-файле.) Разделенный пробелами список имен файлов на самом деле не работает: что если одно из имен файлов содержит пробелы?
Если программа получает имена файлов в качестве аргументов, не объединяйте их с пробелами. Используйте "$@"
для доступа к ним один за другим. Хотя echo "$@"
печатает аргументы с пробелами между ними, это происходит из-за echo
: он печатает свои аргументы с пробелами в качестве разделителей. somecommand "$@"
передает имена файлов как отдельные аргументы в команду. Если вы хотите напечатать аргументы в отдельных строках, вы можете использовать
printf '%s\n' "$@"
Если у вас есть имена файлов, разделенных пробелами, и вы хотите поместить их в массив для работы с ними, вы можете использовать расширение переменной без кавычек, чтобы разделить значение на символы IFS
(вам нужно отключить расширение с помощью символа подстановки set -f
, в противном случае glob шаблоны будут расширены по значению):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
Вы можете заключить это в функцию, которая восстанавливает -f
настройку и значение, IFS
когда это будет сделано:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …