Dengan asumsi Anda memiliki string dengan spasi sebagai pemisah:
newline_separated=${space_separated// /$'\n'}
Namun Anda mungkin mengajukan pertanyaan yang salah. (Tidak harus, misalnya ini mungkin muncul dalam makefile.) Daftar nama file yang dipisahkan spasi tidak benar-benar berfungsi: bagaimana jika salah satu nama file berisi spasi?
Jika suatu program menerima nama file sebagai argumen, jangan bergabung dengan spasi. Gunakan "$@"
untuk mengaksesnya satu per satu. Meskipun echo "$@"
mencetak argumen dengan spasi di antaranya, itu karena echo
: ia mencetak argumennya dengan spasi sebagai pemisah. somecommand "$@"
meneruskan nama file sebagai argumen terpisah ke perintah. Jika Anda ingin mencetak argumen pada baris yang berbeda, Anda dapat menggunakan
printf '%s\n' "$@"
Jika Anda memiliki nama file yang dipisahkan oleh ruang dan Anda ingin meletakkannya dalam array untuk mengatasinya, Anda dapat menggunakan ekspansi variabel yang tidak dikutip untuk membagi nilai pada karakter IFS
(Anda harus menonaktifkan ekspansi wildcard dengan set -f
, jika tidak, pola akan diperluas nilainya):
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 …
Anda bisa merangkum ini dalam fungsi yang mengembalikan -f
pengaturan dan nilai IFS
ketika selesai:
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 …