Saya mencoba menjalankan for
loop untuk file dan saya ingin menampilkan seluruh baris. Melainkan hanya menampilkan kata terakhir saja. Saya ingin garis lengkap.
for j in `cat ./file_wget_med`
do
echo $j
done
hasil setelah dijalankan:
Found.
Ini data saya:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
command-line
bash
scripts
pengguna192118
sumber
sumber
Jawaban:
for
loop terpecah ketika melihat spasi putih seperti spasi, tab, atau baris baru. Jadi, Anda harus menggunakan IFS (Pemisah Bidang Internal) :sumber
unset IFS
sesudahnya, sehingga perintah lain tidak terpengaruh dalam shell yang sama ini.$
artinya iniIFS=$'\n'
?$
membuat jeda baris berfungsi di dalam string. Ini juga harus dilakukan denganlocal IFS=$'\n'
di dalam suatu fungsi.$'...'
dikenal " ANSI-C Quoting "for
loop terpecah pada spasi putih apa pun (spasi, tab, baris baru) secara default; cara termudah untuk bekerja pada satu baris pada satu waktu adalah menggunakanwhile read
loop sebagai gantinya, yang terbagi pada baris baru:Saya akan mengharapkan perintah Anda untuk mengeluarkan satu kata per baris (itulah yang terjadi ketika saya mengujinya dengan file saya sendiri). Jika sesuatu yang lain terjadi, saya tidak yakin apa yang menyebabkannya.
sumber
for i in `ls`; do echo $1; done
, dengan pipa output ke perintah sementara:ls|while read i; do echo $i; done
. Ini berfungsi pada nama file / folder dengan spasi, tanpa perlu mengubah variabel lingkungan. Jawaban yang sangat bagusls
tidak dianggap aman untuk digunakan dengan|
(operator pipa).find
lebih fleksibel selain lebih aman untuk tujuan ini.pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
dapat digunakan dengan|
untuk menjamin output yang belum diformat satu per barisDiverifikasi bekerja, bukan satu-satunya liner yang mungkin Anda inginkan tetapi tidak mungkin melakukannya dengan elegan.
sumber
Berikut adalah sedikit ekstensi untuk jawaban Mitchell Currie, yang saya suka karena cakupan efek samping yang kecil, yang menghindari keharusan menetapkan variabel:
sumber
-name '*'
dan itu akan sama, bukan?Saya akan menulis seperti ini:
karena membutuhkan paling sedikit perubahan dalam skrip asli (kecuali untuk solusi yang menggunakan
IFS
, tetapi memodifikasibash
perilaku tidak hanya untuk pernyataan kontrol loop ini).sumber
cat
tidak perlu di sini.while
loop menerima pengalihan baik-baik saja, itulah sebabnya mengapa ini biasanya ditulis sebagaiwhile IFS= read -r line; do...done < input.txt
Mapfile adalah cara yang mudah untuk membaca baris dari file ke dalam array yang diindeks, tidak portabel seperti membaca tetapi sedikit lebih cepat. Dengan menggunakan untuk loop Anda menghindari membuat subkulit.
Perlu diingat saat menggunakan pipa, itu akan menempatkan loop sementara dalam subkulit. Perubahan di dalam variabel while loop like tidak akan merambat ke bagian luar skrip.
Contoh:
(Solusi yang lebih baik):
sumber
Dandalf mendekati solusi fungsional, tetapi seseorang TIDAK BISA PERNAH mencoba untuk menetapkan hasil dari jumlah input yang tidak diketahui (yaitu
find ~/.gdfuse -name '*'
) ke variabel! Atau, setidaknya mencoba melakukan hal seperti itu melalui variabel array; jika Anda bersikeras menjadi sangat malas! Jadi, inilah solusi Dandalf dilakukan tanpa manuver berbahaya; dan semuanya dalam satu barissumber