Припустимо, що у вас є рядок з пробілами як роздільники:
newline_separated=${space_separated// /$'\n'}
Однак ви, мабуть, ставите неправильне питання. (Не обов'язково, наприклад, це може з'явитися в makefile.) Список розділених пробілом імен файлів насправді не працює: що робити, якщо одне з назв файлів містить пробіли?
Якщо програма отримує назви файлів як аргументи, не з'єднуйте їх з пробілами. Використовуйте "$@"
для доступу один до одного. Хоча echo "$@"
друкує аргументи з пробілами між ними, це пов'язано з echo
: він друкує свої аргументи пробілами як роздільники. somecommand "$@"
передає команди імена файлів як окремі аргументи. Якщо ви хочете роздрукувати аргументи в окремих рядках, ви можете використовувати
printf '%s\n' "$@"
Якщо у вас є імена файлів, розділених пробілом, і ви хочете помістити їх у масив для роботи над ними, ви можете використовувати розширення змінної без котирування, щоб розділити значення на символи IFS
(вам потрібно буде вимкнути розширення підстановки за допомогою set -f
, інакше глобус шаблони будуть розширені у значенні):
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 …