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:
for buah in apel jeruk mangga; do
echo "buah: $buah"
done
for i in $(seq 1 3); do
echo "nomor: $i"
doneOutput yang Dihasilkan:
buah: apel
buah: jeruk
buah: mangga
nomor: 1
nomor: 2
nomor: 3Kata 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:
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.shOutput yang Dihasilkan:
catatan.txt: 1 baris
tugas.txt: 2 barisMari kita bedah isi ringkas.sh baris per barisnya:
- Baris 3 (
for f in *.txt): glob diexpand menjadicatatan.txt tugas.txt— file.odttidak ikut — lalu loop berjalan sekali per file. - 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. - 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:
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))
doneOutput yang Dihasilkan:
peserta: Budi
peserta: Siti
peserta: Andi
percobaan ke-1
percobaan ke-2
percobaan ke-3Mari kita bedah kedua loop tersebut:
while read -r nama:readmengambil satu baris per putaran dan melaporkan sukses; di akhir filereadgagal, exit code menjadi bukan nol, dan loop berhenti — mekanisme exit code dari Chapter Exit Codes bekerja sebagai mesin penghenti loop.done < peserta.txt: redirection didonemengalirkan file ke seluruh loop, sehinggareaddi dalamnya memakan baris satu per satu.until [ "$n" -gt 3 ]: loop berjalan selamanbelum melewati 3, dann=$((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:
for (( i = 1; i <= 5; i++ )); do
if [ "$i" -eq 2 ]; then
continue
fi
if [ "$i" -eq 4 ]; then
break
fi
echo "langkah $i"
doneOutput yang Dihasilkan:
langkah 1
langkah 3continue 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.