Supponendo che tu abbia una stringa con spazi come separatori:
newline_separated=${space_separated// /$'\n'}
Tuttavia, probabilmente stai facendo la domanda sbagliata. (Non necessariamente, ad esempio, questo potrebbe apparire in un makefile.) Un elenco separato da spazi di nomi di file non funziona davvero: e se uno dei nomi di file contenesse spazi?
Se un programma riceve nomi di file come argomenti, non unirli con spazi. Utilizzare "$@"
per accedervi uno per uno. Sebbene echo "$@"
stampa gli argomenti con spazi in mezzo, ciò è dovuto a echo
: stampa i suoi argomenti con spazi come separatori. somecommand "$@"
passa i nomi dei file come argomenti separati al comando. Se si desidera stampare gli argomenti su righe separate, è possibile utilizzare
printf '%s\n' "$@"
Se hai nomi di file separati da spazi e vuoi metterli in un array per lavorarci sopra, puoi usare un'espansione variabile non quotata per dividere il valore in caratteri su IFS
(dovrai disabilitare l'espansione jolly con set -f
, altrimenti glob i pattern verranno espansi nel valore):
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 …
Puoi incapsularlo in una funzione che ripristina l' -f
impostazione e il valore di IFS
quando è fatto:
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 …