Variabel biasa hanya memegang satu nilai dalam satu waktu. Untuk daftar buah, baris pesanan, atau nama-nama server, kita terpaksa membuat variabel terpisah untuk tiap item — jelek dibaca dan mustahil diulang dengan for. Bash menjawab kebutuhan itu dengan array: satu nama variabel yang menyimpan banyak nilai sekaligus. Chapter ini membahas dua wujudnya — indexed array bernomor dan associative array berkunci teks — lalu ditutup dengan cara memecah satu string menjadi array lewat IFS.
Indexed Array: Daftar Bernomor #
Indexed array menyimpan nilai dengan nomor urut yang dimulai dari nol. Nilai ditulis dalam kurung, dipisah spasi, dan dibaca kembali dengan ${nama[indeks]}:
cat > daftar.sh <<'AKHIR'
#!/bin/bash
buah=(mangga jeruk apel)
echo "elemen pertama: ${buah[0]}"
echo "semua elemen : ${buah[@]}"
echo "jumlah elemen : ${#buah[@]}"
buah+=(pisang)
echo "setelah tambah: ${buah[@]}"
for b in "${buah[@]}"; do
echo "- $b"
done
AKHIR
bash daftar.shOutput yang Dihasilkan:
elemen pertama: mangga
semua elemen : mangga jeruk apel
jumlah elemen : 3
setelah tambah: mangga jeruk apel pisang
- mangga
- jeruk
- apel
- pisangMari kita bedah isi daftar.sh baris per barisnya:
- Baris 2 (
buah=(mangga jeruk apel)): membuat array berisi tiga nilai;manggamenempati indeks0,jerukindeks1,apelindeks2. - Baris 3 (
${buah[0]}): membaca satu elemen pada indeks0. - Baris 4 (
${buah[@]}):[@]berarti “semua elemen” — dicetak dipisah spasi. - Baris 5 (
${#buah[@]}): tanda pagar#di depan nama menghitung jumlah elemen, bukan panjang teks. - Baris 6 (
buah+=(pisang)): operator+=menempelkan elemen baru di ujung daftar tanpa perlu tahu indeksnya. - Baris 8-10 (
for b in ...): mengulang tiap elemen;"$b"menyapa satu item per putaran.
Associative Array: Daftar Berkunci #
Nomor urut tidak selalu pas. Untuk memetakan nama buah ke jumlah stoknya, kunci berupa teks lebih bermakna daripada angka. declare -A membuat associative array — pasangan kunci ke nilai:
cat > stok.sh <<'AKHIR'
#!/bin/bash
declare -A stok
stok[mangga]=12
stok[jeruk]=8
stok[apel]=15
echo "stok mangga: ${stok[mangga]}"
for kunci in "${!stok[@]}"; do
echo "$kunci = ${stok[$kunci]}"
done
AKHIR
bash stok.shOutput yang Dihasilkan:
stok mangga: 12
apel = 15
mangga = 12
jeruk = 8Baris declare -A stok mendaftarkan variabel stok sebagai associative array; setelah itu stok[mangga]=12 menyimpan nilai 12 di bawah kunci mangga, dan ${stok[mangga]} membacanya kembali. Tanda seru pada "${!stok[@]}" membalik arah pembacaan: ia menghasilkan daftar kunci, bukan daftar nilai — perulangan kemudian memakai tiap kunci untuk mengambil nilainya.
Urutan kunci yang dicetak associative array tidak dijamin berurutan maupun sama dengan urutan pengisian — urutannya bebas berbeda antar mesin. Bila urutan penting, salin dulu daftar kunci ke variabel lalu urutkan, misalnya lewat printf '%s\n' "${!stok[@]}" | sort.
Memecah String Menjadi Array dengan IFS #
Data dari luar sering datang sebagai satu baris teks — misalnya hasil cut atau isi file konfigurasi. Shell memisahkan teks berdasarkan karakter di variabel IFS (Internal Field Separator), dan read -ra memanfaatkan aturan itu untuk langsung mengisi array:
cat > pecah.sh <<'AKHIR'
#!/bin/bash
baris="budi,siti,ani,rina"
IFS=',' read -ra nama <<< "$baris"
echo "jumlah nama: ${#nama[@]}"
for n in "${nama[@]}"; do
echo "anggota: $n"
done
AKHIR
bash pecah.shOutput yang Dihasilkan:
jumlah nama: 4
anggota: budi
anggota: siti
anggota: ani
anggota: rinaPenugasan IFS=',' hanya berlaku untuk satu perintah read itu, jadi tidak mengubah perilaku shell di baris lain. read -ra memotong masukan <<< "$baris" setiap menemui koma dan menaruh tiap potongan sebagai elemen array nama; -r menjaga backslash agar tidak ditafsir sebagai karakter khusus. Daftar lengkap sintaks array dibuka pada bagian Arrays di halaman manual bash(1)
.
Struktur data kita kini lengkap: daftar bernomor, pemetaan berkunci, dan cara memecah teks. Namun skrip yang mengolah data banyak pasti menjumpai kegagalan — file yang tidak ada, perintah yang gagal. Chapter Exit Status dan Error Handling mengajarkan cara menghadapi kegagalan itu secara sadar, bukan berdoa agar skrip selalu berhasil.