Saya memiliki skrip bash shell yang melakukan loop melalui semua direktori anak (tetapi bukan file) dari direktori tertentu. Masalahnya adalah beberapa nama direktori mengandung spasi.
Berikut adalah isi direktori pengujian saya:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Dan kode yang melewati direktori:
for f in `find test/* -type d`; do
echo $f
done
Berikut hasilnya:
tes / Baltimore tes / Cherry Bukit tes / Edison tes / Baru York Kota tes / Philadelphia
Cherry Hill dan New York City diperlakukan sebagai 2 atau 3 entri terpisah.
Saya mencoba mengutip nama file, seperti ini:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
tapi tidak berhasil.
Pasti ada cara sederhana untuk melakukan ini.
Jawaban di bawah ini bagus. Tetapi untuk membuatnya lebih rumit - saya tidak selalu ingin menggunakan direktori yang terdaftar di direktori pengujian saya. Terkadang saya ingin memasukkan nama direktori sebagai parameter baris perintah.
Saya mengambil saran Charles untuk mengatur IFS dan menghasilkan yang berikut:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
dan ini berfungsi dengan baik kecuali jika ada spasi di argumen baris perintah (bahkan jika argumen tersebut dikutip). Misalnya, memanggil skrip seperti ini: test.sh "Cherry Hill" "New York City"
menghasilkan keluaran berikut:
ceri Bukit Baru York Kota
list="$@"
membuang sepenuhnya daftar nilai asli, menciutkannya menjadi string. Harap ikuti praktik dalam jawaban saya persis seperti yang diberikan - tugas seperti itu tidak dianjurkan di mana pun di dalamnya; jika Anda ingin meneruskan daftar argumen baris perintah ke program, Anda harus mengumpulkannya ke dalam larik, dan memperluas larik itu secara langsung.