Cara yang berbeza untuk membaca fail dalam skrip bash menggunakan semasa gelung

Cara yang berbeza untuk membaca fail dalam skrip bash menggunakan semasa gelung

Artikel ini adalah mengenai cara membaca fail dalam skrip bash menggunakan a Semasa gelung. Membaca fail adalah operasi biasa dalam pengaturcaraan. Anda harus biasa dengan kaedah yang berbeza dan kaedah mana yang lebih efisien untuk digunakan. Di Bash, satu tugas dapat dicapai dalam banyak cara tetapi selalu ada cara yang optimum untuk menyelesaikan tugas dan kita harus mengikutinya.

Sebelum melihat cara membaca kandungan fail menggunakan Semasa gelung, Primer cepat mengenai bagaimana gelung berfungsi. Sementara gelung menilai keadaan dan berulang di atas satu set kod yang diberikan apabila keadaan itu benar.

sementara [keadaan] melakukan blok kod yang dilakukan 

Mari Pecah Semasa gelung sintaks.

  • Semasa gelung harus bermula dengan kata kunci sementara diikuti dengan keadaan.
  • A keadaan harus dilampirkan di dalam [] atau [[]]. Keadaan ini harus selalu kembali untuk gelung yang akan dilaksanakan.
  • Blok sebenar kod akan diletakkan di antara lakukan dan selesai.
Nombor = 0 sementara [[$ nombor -le 10]] do echo "selamat datang $ nombor kali" ((nombor ++)) selesai 
Semasa gelung

Ini adalah contoh yang sangat mudah, di mana gelung melaksanakan sehingga Nombor tidak lebih besar daripada 10 dan mencetak pernyataan echo.

Bersama dengan manakala Kami akan menggunakan Baca Perintah untuk membaca kandungan baris fail mengikut baris. Berikut adalah sintaks bagaimana manakala dan Baca Perintah digabungkan. Sekarang ada cara yang berbeza untuk lulus fail sebagai input dan kita akan melihat mereka semua.

# Sintaks semasa baca pembolehubah lakukan kod selesai 

Piping di Linux

Biasanya kami akan menggunakan perintah kucing untuk melihat kandungan fail dari terminal. Juga, kami akan menanam output perintah kucing kepada arahan lain seperti grep, sort, dll.

Begitu juga, kita akan menggunakan perintah kucing di sini untuk membaca kandungan fail dan paip ke a manakala gelung. Untuk demonstrasi, saya menggunakan /etc/passwd fail tetapi tidak dinasihatkan untuk mengacaukan fail ini jadi ambil salinan sandaran fail ini dan mainkan dengannya jika anda menginginkannya.

kucing /etc /passwd | Semasa membaca lread lakukan echo $ lread selesai 
Piping di Linux

Mari kita pecahkan apa yang akan berlaku apabila kod di atas dihantar.

  • kucing /etc /passwd akan membaca kandungan fail dan lulus sebagai input melalui paip.
  • Baca Perintah membaca setiap baris yang diluluskan sebagai input dari perintah kucing dan menyimpannya di Lread pembolehubah.
  • Baca Perintah akan membaca kandungan fail sehingga Eol ditafsirkan.

Anda juga boleh menggunakan arahan lain seperti kepala, ekor, dan paip ke semasa gelung.

kepala -n 5 /etc /passwd | Semasa membaca lread lakukan echo $ lread selesai 
Perintah kepala

Pengalihan input di Linux

Kita boleh mengalihkan kandungan fail ke Semasa gelung Menggunakan pengendali pengalihan input (<).

Semasa membaca lread lakukan echo $ lread selesai < /etc/passwd | head -n 5 
Pengalihan input

Anda juga boleh menyimpan nama fail ke pembolehubah dan melewatinya melalui pengendali pengalihan.

Filename = "/etc/passwd" semasa membaca lread do echo $ lread selesai < $FILENAME 
Simpan nama fail dalam pembolehubah

Anda juga boleh lulus nama fail sebagai hujah pada skrip anda.

Semasa membaca lread lakukan echo $ lread selesai < $1 | head -n 5 
Simpan nama fail sebagai hujah

Pemisah medan dalaman

Anda boleh bekerja dengan pelbagai jenis format fail (CSV, Txt, Json) dan anda mungkin mahu membahagikan kandungan fail berdasarkan pembatas tersuai. Dalam kes ini, anda boleh menggunakan "Pemisah medan dalaman (IFS)"Untuk membahagikan kandungan fail dan simpan dalam pembolehubah.

Izinkan saya menunjukkan bagaimana ia berfungsi. Lihatlah /etc/passwd fail yang mempunyai kolon (:) sebagai pembatas. Anda kini boleh memecah setiap perkataan dari garis dan menyimpannya dalam pemboleh ubah yang berasingan.

Dalam contoh di bawah, saya berpecah /etc/passwd fail dengan kolon sebagai pemisah saya dan menyimpan setiap perpecahan ke dalam pembolehubah yang berbeza.

sementara ifs = ":" Baca A B C D E F G DO ECHO $ ​​A echo $ b echo $ c echo $ d echo $ e echo $ f echo $ g yang selesai selesai < /etc/passwd 
Pemisah medan dalaman

Saya memaparkan hanya satu baris yang berpecah dalam tangkapan skrin di atas memandangkan saiz tangkapan skrin.

Garis kosong di Linux

Garis kosong tidak diabaikan semasa anda gelung melalui kandungan fail. Untuk menunjukkan ini saya telah membuat fail sampel dengan kandungan di bawah. Terdapat 4 baris dan beberapa garisan kosong, ruang putih terkemuka, mengangkut ruang putih, watak tab dalam baris 2, dan beberapa watak melarikan diri (\ n dan \ t).

Fail dengan garis kosong
Semasa membaca lread lakukan echo $ lread selesai < testfile 
Garis kosong tidak diabaikan

Lihat hasilnya, garis kosong tidak diabaikan. Juga, perkara yang menarik untuk diperhatikan ialah bagaimana ruang putih dipangkas oleh Baca perintah. Cara mudah untuk mengabaikan baris kosong apabila membaca kandungan fail adalah dengan menggunakan pengendali ujian dengan -z bendera yang memeriksa jika panjang tali adalah sifar. Sekarang mari kita ulangi contoh yang sama tetapi kali ini dengan pengendali ujian.

Semasa membaca lread lakukan jika [[ ! -z $ lread]] kemudian echo $ lread fi selesai < testfile 
Garis kosong diabaikan

Sekarang dari output, anda dapat melihat garis kosong diabaikan.

Watak melarikan diri

Melarikan diri watak seperti \ n, \ t, \ c tidak akan dicetak semasa membaca fail. Untuk menunjukkan ini saya menggunakan fail sampel yang sama yang mempunyai sedikit watak melarikan diri.

Fail dengan watak melarikan diri
Semasa membaca lread lakukan echo $ lread selesai < testfile 
Watak Melarikan diri di Linux

Anda dapat melihat dari watak melarikan diri output telah kehilangan makna dan hanya n dan t dicetak bukan \ n dan \ t. Anda boleh menggunakan -r untuk mengelakkan tafsiran backslash.

Walaupun membaca -r lread lakukan echo $ lread selesai < testfile 
Mencegah tafsiran backslash

Itu sahaja untuk artikel ini. Kami ingin mendengar dari anda jika ada maklum balas atau petua. Maklum balas anda adalah yang membantu kami membuat kandungan yang lebih baik. Terus membaca dan terus menyokong.