Saya kesulitan mendapatkan dasar-dasar penulisan Bash. Inilah yang saya miliki sejauh ini:
#!/bin/bash
FILES="/home/john/my directory/*.txt"
for f in "${FILES}"
do
echo "${f}"
done
Yang ingin saya lakukan adalah daftar semua .txt
file dalam satu for
lingkaran sehingga saya dapat melakukan hal-hal dengan mereka. Tetapi ruang di my directory
dan tanda bintang *.txt
hanya tidak bermain dengan baik. Saya mencoba menggunakannya dengan dan tanpa tanda kutip ganda, dengan dan tanpa kurung kurawal pada nama variabel dan masih tidak dapat mencetak semua .txt
file.
Ini adalah hal yang sangat mendasar, tetapi saya masih berjuang karena saya lelah dan tidak bisa berpikir jernih.
Apa yang saya lakukan salah?
Saya telah berhasil menerapkan skrip di atas jika FILES saya tidak memiliki ruang atau tanda bintang ... Saya harus bereksperimen dengan atau tanpa menggunakan tanda kutip ganda dan kawat gigi untuk membuatnya berfungsi. Tetapi saat saya memiliki spasi dan tanda bintang, itu mengacaukan segalanya.
for f in "$DIR"/*.txt
= baikfor f in "$DIR/*.txt"
= istirahatSaat menggunakan array seperti yang ditunjukkan oleh John1024 jauh lebih masuk akal, di sini, Anda juga dapat menggunakan operator split + glob (membiarkan variabel skalar tidak dikutip).
Karena Anda hanya ingin bagian glob dari operator itu, Anda perlu menonaktifkan bagian yang terpecah :
sumber
Yang dapat Anda lakukan adalah meninggalkan hanya karakter wildcard di luar tanda kutip.
Sesuatu seperti:
untuk di dalam "file dengan spasi" * ". Txt"
melakukan
pemrosesan
dilakukan
Jika wildcard itu sendiri meluas ke spasi, maka Anda perlu t menggunakan pendekatan file per baris, seperti menggunakan ls-l untuk menghasilkan daftar file dan gunakan bash read untuk mendapatkan setiap file.
sumber
Ketika Anda ingin memproses set file, Anda mempertimbangkan, di namanya mungkin ada ruang atau kode scape lain akan ada di sana, Jadi sebelum memulai proses Anda seperti
for loop
ataufind command
aturIFS bash env variable
ke:sumber