Zakładając, że masz ciąg znaków ze spacjami jako separatorami:
newline_separated=${space_separated// /$'\n'}
Jednak prawdopodobnie zadajesz złe pytanie. (Niekoniecznie, na przykład może pojawić się w pliku makefile). Rozdzielona spacjami lista nazw plików tak naprawdę nie działa: co jeśli jedna z nazw plików zawiera spacje?
Jeśli program otrzymuje nazwy plików jako argumenty, nie łącz ich ze spacjami. Użyj, "$@"
aby uzyskać do nich dostęp jeden po drugim. Chociaż echo "$@"
drukuje argumenty ze spacjami pomiędzy nimi, wynika to z echo
: drukuje argumenty ze spacjami jako separatory. somecommand "$@"
przekazuje nazwy plików jako osobne argumenty do polecenia. Jeśli chcesz wydrukować argumenty w osobnych wierszach, możesz użyć
printf '%s\n' "$@"
Jeśli masz nazwy plików rozdzielone spacjami i chcesz umieścić je w tablicy, aby nad nimi pracować, możesz użyć niecytowanego rozszerzenia zmiennej, aby podzielić wartość na znaki IFS
(musisz wyłączyć interpretację symboli wieloznacznych za pomocą set -f
, w przeciwnym razie glob wzory zostaną rozszerzone o wartość):
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 …
Możesz zawrzeć to w funkcji, która przywraca -f
ustawienie i wartość, IFS
kiedy to nastąpi:
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 …