Skrip yang kita tulis sejauh ini berjalan lurus dari baris pertama sampai baris terakhir. Begitu skrip membesar, pola yang sama mulai mengganggu: potongan kode serupa ditulis ulang di beberapa tempat, dan satu perbaikan kecil harus diterapkan ke semua salinannya. Function shell menyelesaikan masalah itu dengan mengemas rangkaian perintah menjadi satu nama yang bisa dipanggil kapan saja. Pada chapter ini kita belajar mendefinisikan function, mengisolasi variabelnya dengan local, dan mengembalikan status lewat return — tiga kebiasaan yang membuat skrip panjang tetap mudah dibaca dan dirawat.
Mendefinisikan dan Memanggil Function #
Definisi function di bash memakai nama diikuti tanda kurung dan blok perintah di antara kurung kurawal. Function berjalan di shell yang sama dengan pemanggilnya — bukan proses terpisah — sehingga perubahan variabel di dalamnya berpotensi terlihat di luar. Argumen diberikan saat pemanggilan dan dibaca dengan $1, $2, dan seterusnya, persis seperti argumen skrip yang sudah kita kenal:
sapa() {
echo "Halo, $1"
}
sapa Budi
sapa SitiOutput yang Dihasilkan:
Halo, Budi
Halo, SitiDefinisi sapa sendiri tidak mencetak apa pun; isi barisnya baru dieksekusi ketika nama function dipanggil. $1 pada setiap pemanggilan berisi argumen pertama yang menyertainya, sehingga sapa Budi menghasilkan Halo, Budi dan sapa Siti menghasilkan Halo, Siti. Satu definisi kini melayani semua nama — inilah inti penggunaan ulang kode.
Variabel local Menjaga Function Tetap Terisolasi #
Tanpa perlakuan khusus, variabel yang dibuat di dalam function bersifat global: nilainya tetap hidup setelah function selesai. Kata kunci local membatasi umur variabel hanya sampai akhir function. Skrip berikut memakai keduanya untuk menunjukkan bedanya:
cat > kasir.sh <<'AKHIR'
#!/bin/bash
hitung_total() {
local total=0
for harga in 5000 7500 12000; do
total=$((total + harga))
done
echo "total di dalam fungsi: $total"
}
hitung_total
echo "total di luar fungsi : ${total-belum ada}"
AKHIR
bash kasir.shOutput yang Dihasilkan:
total di dalam fungsi: 24500
total di luar fungsi : belum adaMari kita bedah isi kasir.sh baris per barisnya:
- Baris 2 (
hitung_total() {): membuka definisi function bernamahitung_total. - Baris 3 (
local total=0): membuat variabeltotalyang hanya hidup selama function berjalan; nilai awalnya0. - Baris 4-6 (
for harga in ...): mengulang tiga harga dan menambahkannya ketotaldengan aritmetika$(( ))dari Chapter Variables dan Quoting. - Baris 7 (
echo ...): mencetak hasil penjumlahan24500dari dalam function. - Baris 10 (
${total-belum ada}): memakai parameter expansion — tampilkan isitotal, dan bila variabelnya tidak ada tampilkan teksbelum ada. Karenatotalbersifatlocal, baris ini membuktikan variabel tersebut sudah lenyap.
Kebiasaan mendeklarasikan semua variabel kerja dengan local membuat function aman dipakai ulang tanpa menimpa variabel milik skrip utama secara tidak sengaja.
Mengembalikan Status dengan return #
Function shell melapor hasil kerjanya lewat exit status, sama seperti perintah biasa. Perintah return angka mengakhiri function dan menyerahkan angkanya ke $? si pemanggil, sementara exit angka menghentikan seluruh skrip seketika:
cat > cek.sh <<'AKHIR'
#!/bin/bash
cek_angka() {
if [ "$1" -gt 0 ]; then
return 0
else
return 1
fi
}
cek_angka 10
echo "hasil cek 10 : $?"
cek_angka -5
echo "hasil cek -5 : $?"
AKHIR
bash cek.shOutput yang Dihasilkan:
hasil cek 10 : 0
hasil cek -5 : 1Function cek_angka mengembalikan 0 bila argumennya positif dan 1 bila tidak — dua nilai itu lalu terbaca di $? pada tiap pemanggilan, terbukti di output di atas. Tanpa return, status function adalah status perintah terakhirnya. Status seperti ini dirancang untuk keputusan (if, &&, ||), bukan untuk mengantar data; untuk mengirim teks, function cukup mencetak ke stdout lalu pemanggil menangkapnya dengan command substitution, misalnya total=$(hitung_total). Aturan lengkap definisi dan perilaku function dibuka pada bagian Functions di halaman manual bash(1)
.
Dengan function, logika skrip kita kini punya tingkatan yang rapi. Soal berikutnya adalah soal data: bagaimana satu variabel menyimpan banyak nilai sekaligus — pertanyaan yang dijawab oleh indexed array dan associative array pada Chapter Arrays.