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]}:

bash
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.sh

Output yang Dihasilkan:

text
elemen pertama: mangga
semua elemen  : mangga jeruk apel
jumlah elemen : 3
setelah tambah: mangga jeruk apel pisang
- mangga
- jeruk
- apel
- pisang

Mari kita bedah isi daftar.sh baris per barisnya:

  1. Baris 2 (buah=(mangga jeruk apel)): membuat array berisi tiga nilai; mangga menempati indeks 0, jeruk indeks 1, apel indeks 2.
  2. Baris 3 (${buah[0]}): membaca satu elemen pada indeks 0.
  3. Baris 4 (${buah[@]}): [@] berarti “semua elemen” — dicetak dipisah spasi.
  4. Baris 5 (${#buah[@]}): tanda pagar # di depan nama menghitung jumlah elemen, bukan panjang teks.
  5. Baris 6 (buah+=(pisang)): operator += menempelkan elemen baru di ujung daftar tanpa perlu tahu indeksnya.
  6. 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:

bash
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.sh

Output yang Dihasilkan:

text
stok mangga: 12
apel = 15
mangga = 12
jeruk = 8

Baris 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:

bash
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.sh

Output yang Dihasilkan:

text
jumlah nama: 4
anggota: budi
anggota: siti
anggota: ani
anggota: rina

Penugasan 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.