Belajar dengan membaca secara berurutan

Membaca Input — Memproses Baris demi Baris dengan while read

Artikel ini adalah bagian dari Kursus Linux yang membantumu menguasai keterampilan praktis Linux dari nol, mulai dari perintah dasar hingga shell script.
Dengan while read name age, pisahkan data.txt baris demi baris menjadi kolom lalu rapikan, proses beberapa file argumen secara berurutan dengan for f in "$@", dan berikan input ke read lewat pipe atau here-doc — dijelaskan dengan diagram dan dipraktikkan di terminal.

Membaca file baris demi baris — while read

Kamu sering ingin memproses daftar atau file konfigurasi baris demi baris.

Kalau kamu menulis while read line; do … done < file, maka file dibaca dari atas satu baris setiap kali, baris itu dimasukkan ke variabel line, dan isi do … done diulang.

Berapa pun jumlah baris dalam file, perulangan berjalan otomatis sampai baris terakhir.

read membagi satu baris yang diterima berdasarkan spasi, lalu memasukkannya ke beberapa variabel sekaligus.

Kalau kamu menulis while read name age; do …, kata pertama tiap baris masuk ke name dan kata berikutnya ke age.

Data yang berderet seperti "nama nilai" pada sebuah daftar bisa kamu ambil per kolom lalu kamu rapikan.

printf 'web running\ndb stopped\n' > services.txt   # buat bahannya
while read svc state; do                              # satu baris ke svc dan state
  echo "Layanan $svc adalah $state"
done < services.txt                                   # services.txt sebagai input
# Output: Layanan web adalah running / Layanan db adalah stopped
Memproses file baris demi baris dengan while read
data.txtwhile read name agename = aliceage = 30baris demi bariskata ke-1kata ke-2ulangi sampai baris habis
while read name age membaca file baris demi baris, lalu dengan pemisah spasi memasukkan kata pertama ke name dan berikutnya ke age.
SintaksArtiContoh
while read v; do … done < fMemproses file f baris demi baris dengan variabel vwhile read l; do echo "$l"; done < data.txt
while read a b; do …Membagi satu baris dengan spasi ke beberapa variabelwhile read name age; do echo "$name"; done < data.txt

Buat skrip yang membaca file daftar dengan while read baris demi baris, lalu menampilkannya dalam bentuk "nama berumur usia tahun".

① Buat file bahan berisi "nama usia" yang berderet dengan printf 'alice 30\nbob 25\ncarol 41\n' > data.txt.

② Buka roster.sh dengan vi roster.sh, tekan i untuk masuk mode insert, lalu tulis skrip yang membaca baris demi baris dengan while read name age dan menampilkan "$name berumur $age tahun" dengan echo (tulis #!/bin/sh pada baris pertama). Setelah selesai, simpan dengan Esc:wq.

③ Tambahkan izin eksekusi dengan chmod +x roster.sh, jalankan ./roster.sh, dan pastikan 3 baris keluar dalam keadaan sudah dirapikan.

④ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

(Jalankan dengan benar maka penjelasannya akan muncul)

Linux console
0 / 4 selesai
Loading Linux Terminal...

Menerima beberapa file lewat argumen — "$@" dan $(cat f)

Kalau kamu menetapkan nama file yang diproses langsung di dalam skrip, skrip itu tidak bisa dipakai untuk file lain.

Kalau kamu mengopernya saat menjalankan seperti ./show.sh a.txt b.txt, maka $1 menjadi argumen pertama dan $2 argumen kedua.

Semua argumen bisa kamu terima sekaligus dengan "$@".

Kalau kamu menulis for f in "$@"; do … done, kamu bisa memasukkan file yang dioper satu per satu ke f lalu memprosesnya berurutan.

Kalau kamu ingin memakai seluruh isi file sebagai satu string, ambil ke dalam variabel dengan text=$(cat "$f").

Jumlah argumen bisa kamu ketahui dengan $#, dan kamu bisa membuatnya menampilkan cara pakai jika argumennya 0.

printf 'line A1\nline A2\n' > a.txt              # bahan 1
printf 'line B1\n' > b.txt                       # bahan 2
vi show.sh   # buka di editor, tulis isi berikut, simpan dengan :wq
#   #!/bin/sh
#   for f in "$@"; do
#     echo "--- $f ---"
#     cat "$f"
#   done
chmod +x show.sh
./show.sh a.txt b.txt                            # tampilkan 2 file berurutan dengan judul
Memproses beberapa file argumen secara berurutan
./view.sh a.txt b.txt$1 = a.txt$2 = b.txtproses berurutan dengan for f in "$@"ke-1ke-2terima sekaligus dengan "$@"
File saat dijalankan masuk ke $1 $2, lalu dengan "$@" bisa diterima sekaligus dan diproses satu per satu dengan for.
SintaksArtiContoh
for f in "$@"; do …Memproses tiap file argumen berurutanfor f in "$@"; do cat "$f"; done
$(cat f)Mengambil seluruh isi file ke satu stringtext=$(cat data.txt)
$#Jumlah argumen (tampilkan cara pakai jika 0)[ "$#" -eq 0 ] && echo usage

Buat skrip yang memproses nama file yang diterima lewat argumen satu per satu, lalu menampilkan judul dan isinya secara berurutan.

① Buat dua file bahan dengan printf 'apple\nbanana\n' > fruit.txt dan printf 'red\nblue\n' > color.txt.

② Buka view.sh dengan vi view.sh, tekan i untuk masuk mode insert, lalu tulis skrip yang menerima argumen satu per satu dengan for f in "$@", menampilkan judul dengan echo, kemudian mengambil seluruh isi file ke variabel dan menampilkan isinya (tulis #!/bin/sh pada baris pertama). Setelah selesai, simpan dengan Esc:wq.

③ Tambahkan izin eksekusi dengan chmod +x view.sh, jalankan ./view.sh fruit.txt color.txt, dan pastikan 2 file tampil berurutan.

④ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

Linux console
0 / 5 selesai
Loading Linux Terminal...

Input interaktif dan input pipe — read dan here-doc

read tidak hanya membaca file, tetapi juga bisa membaca input yang diketik orang maupun input yang dioper lewat pipe.

Ada bentuk seperti menyambungkan dengan pipe seperti echo hi | read v, atau memberikan input di tempat sekaligus dengan here-doc <<'EOF' … EOF.

Ini menjadi dasar saat kamu menggabungkan skrip dengan perintah lain.

# baca output pipe baris demi baris
printf 'one\ntwo\n' | while read v; do echo "Baris: $v"; done
# berikan input di tempat dengan here-doc
while read v; do echo "Nilai: $v"; done <<'EOF'
x
y
EOF
# input manusia sekali saja (ketik name lalu Enter)
# saat dijalankan akan menunggu input
read name; echo "Halo $name"
Memberikan input ke read tanpa file
printf 'cat\ndog'| while read vproses baris demi baris<<'EOF' … EOFwhile read vproses baris demi barisberikan lewat pipeberikan dengan here-doc
Meski tanpa file, kamu bisa memberikan input ke while read baris demi baris lewat pipe atau here-doc.
SintaksArtiContoh
cmd | while read v; do …Memproses output pipe baris demi bariscat data.txt | while read l; do echo "$l"; done
<<'EOF' … EOFMemberikan input di tempat dengan here-docwhile read l; do echo "$l"; done <<'EOF'

Buat skrip yang memberikan input ke while read lewat pipe dan here-doc tanpa melalui file.

① Buka pipe.sh dengan vi pipe.sh, tekan i untuk masuk mode insert, lalu tulis skrip yang mengoper output printf 'cat\ndog\n' lewat pipe ke while read v; do echo "Hewan: $v"; done (tulis #!/bin/sh pada baris pertama). Setelah selesai, simpan dengan Esc:wq.

② Tambahkan izin eksekusi dengan chmod +x pipe.sh, jalankan ./pipe.sh, dan pastikan 2 baris keluar.

③ Pastikan outputnya menjadi Hewan: cat dan Hewan: dog, dan bahwa input bisa diproses baris demi baris tanpa membuat file.

④ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Bagaimana while read line; do … done < file memproses file?

Soal 2Manakah cara penulisan yang mewakili semua argumen yang dioper ke skrip sekaligus?

Soal 3Bagaimana cara memproses output sebuah perintah baris demi baris dengan read tanpa membuat file?