Komputer paling unggul justru di pekerjaan paling membosankan: mengulang. Memproses seratus file, membaca ribuan baris log, mencoba ulang koneksi yang gagal — semuanya adalah pengulangan dengan data yang berganti. Bash menyediakan tiga bentuk loop: for untuk daftar yang sudah diketahui, while untuk mengulang selama kondisi benar, dan until untuk menunggu kondisi menjadi benar. Chapter ini memakai ketiganya, ditutup break dan continue untuk mengendalikan putaran dari dalam.

for untuk Daftar Nilai #

Bentuk paling langsung: for mengambil satu per satu kata dari sebuah daftar, lalu menjalankan blok untuk tiap kata. Daftar angka bisa dihasilkan perintah seq:

bash
for buah in apel jeruk mangga; do
    echo "buah: $buah"
done
for i in $(seq 1 3); do
    echo "nomor: $i"
done

Output yang Dihasilkan:

text
buah: apel
buah: jeruk
buah: mangga
nomor: 1
nomor: 2
nomor: 3

Kata kunci do dan done membuka dan menutup blok yang diulang, dan variabel buah maupun i terisi satu nilai per putaran. Konstruksi $(seq 1 3) menjalankan perintah seq 1 3 lebih dulu — hasilnya tiga baris angka — lalu for menerima ketiganya sebagai daftar. Alternatif tanpa perintah tambahan, bash menyediakan rentang {1..3} yang menghasilkan daftar yang sama.

for dengan Glob: Memproses File #

Kekuatan for baru terasa saat daftarnya datang dari wildcard. Glob *.txt diexpand bash menjadi nama semua file yang cocok sebelum loop berjalan — dan bila tidak ada yang cocok, pola itu diteruskan apa adanya. Skrip berikut merangkum jumlah baris tiap file teks di folder aktif:

bash
printf 'satu dua tiga\n' > catatan.txt
printf 'empat lima\nenam\n' > tugas.txt
printf 'bukan teks\n' > laporan.odt
cat > ringkas.sh << 'AKHIR'
#!/bin/bash
# ringkas.sh -- jumlah baris setiap file .txt di folder aktif
for f in *.txt; do
    jumlah=$(wc -l < "$f")
    echo "$f: $jumlah baris"
done
AKHIR
bash ringkas.sh

Output yang Dihasilkan:

text
catatan.txt: 1 baris
tugas.txt: 2 baris

Mari kita bedah isi ringkas.sh baris per barisnya:

  1. Baris 3 (for f in *.txt): glob diexpand menjadi catatan.txt tugas.txt — file .odt tidak ikut — lalu loop berjalan sekali per file.
  2. Baris 4 (jumlah=$(wc -l < "$f")): command substitution $(...) menjalankan perintah di dalamnya dan menyisipkan stdout-nya sebagai nilai; wc -l < "$f" menghitung baris file tanpa mencetak namanya. Variabel "$f" tetap dikutip agar nama file yang memuat spasi tetap satu kesatuan.
  3. Baris 5 (echo ...): mencetak nama file dan hasil hitungannya.

while dan until: Mengulang Berdasar Kondisi #

for cocok untuk daftar berhingga; while mengulang selama perintah ujinya berhasil, dan pola paling terkenalnya membaca file baris demi baris. Pasangannya, until, mengulang justru selama uji gagal — pasang untuk menunggu sesuatu tercapai:

bash
printf 'Budi\nSiti\nAndi\n' > peserta.txt
while read -r nama; do
    echo "peserta: $nama"
done < peserta.txt
n=1
until [ "$n" -gt 3 ]; do
    echo "percobaan ke-$n"
    n=$((n+1))
done

Output yang Dihasilkan:

text
peserta: Budi
peserta: Siti
peserta: Andi
percobaan ke-1
percobaan ke-2
percobaan ke-3

Mari kita bedah kedua loop tersebut:

  1. while read -r nama: read mengambil satu baris per putaran dan melaporkan sukses; di akhir file read gagal, exit code menjadi bukan nol, dan loop berhenti — mekanisme exit code dari Chapter Exit Codes bekerja sebagai mesin penghenti loop.
  2. done < peserta.txt: redirection di done mengalirkan file ke seluruh loop, sehingga read di dalamnya memakan baris satu per satu.
  3. until [ "$n" -gt 3 ]: loop berjalan selama n belum melewati 3, dan n=$((n+1)) menaikkan nilai pembanding tiap putaran — tanpa baris ini, loop tidak pernah berhenti.

for Bergaya C dengan break dan continue #

Untuk hitungan berindeks, bash menyediakan bentuk for (( )) yang wajahnya mirip bahasa C — tiga bagian dipisah titik koma: inisialisasi, kondisi, dan penambahan:

bash
for (( i = 1; i <= 5; i++ )); do
    if [ "$i" -eq 2 ]; then
        continue
    fi
    if [ "$i" -eq 4 ]; then
        break
    fi
    echo "langkah $i"
done

Output yang Dihasilkan:

text
langkah 1
langkah 3

continue melompat ke putaran berikutnya — langkah 2 tidak pernah tercetak. break menghentikan loop seketika, sehingga langkah 4 dan langkah 5 tidak pernah sampai ke layar; hanya langkah 1 dan langkah 3 lolos dari kedua saringan itu. Keduanya berlaku sama untuk semua bentuk loop, while sekalipun.

Loop membuat blok perintah bisa dipakai ulang untuk banyak data — langkah alami berikutnya adalah membungkus blok itu menjadi satu unit bernama fungsi, lengkap dengan variabel lokal dan nilai baliknya, di Chapter Functions.