Materi
for x in $(cat cabang.txt) tampak membaca berkas per baris, padahal ia memecah isi berkas di setiap spasi: baris Kota Baru menjadi dua putaran. Cara yang tepat adalah perulangan while dengan builtin read, yang membaca satu baris setiap putaran dari berkas yang dialirkan dengan < di belakang done.
while read -r cabang; do
mkdir -p "laporan/$cabang"
done < cabang.txtOpsi -r membuat garis miring terbalik dibaca apa adanya. read berakhir dengan status bukan 0 saat berkas habis, dan itulah yang menghentikan while. Untuk berkas berkolom, isi IFS sebelum read: IFS=, read -r kode nama jumlah memecah baris di koma. IFS itu hanya berlaku untuk read tersebut. Bila kolomnya lebih banyak dari nama variabel, sisa kolom beserta komanya masuk ke variabel terakhir. Baris judul bisa dilewati dengan satu read sebelum perulangan.
{
read -r judul
while IFS=, read -r kode nama jumlah; do
echo "$kode: $jumlah"
done
} < stok.csvDua jebakan yang paling sering. Pertama, berkas yang baris terakhirnya tidak diakhiri newline: read tetap mengisi variabel, tetapi statusnya gagal, sehingga badan perulangan tidak dijalankan untuk baris itu. Penawarnya while read -r b || [ -n "$b" ]. Kedua, cat berkas | while read: setiap bagian pipa berjalan di subshell, jadi variabel penghitung yang diubah di dalam perulangan hilang sesudah done. Pakai < berkas.