Belajar dengan membaca secara berurutan

Fungsi — Menyatukan Proses yang Sama di Satu Tempat

Artikel ini adalah bagian dari Kursus Linux yang membantumu menguasai keterampilan praktis Linux dari nol, mulai dari perintah dasar hingga shell script.
Definisikan logika dengan name() { ... }, terima argumen lewat $1, simpan variabel khusus fungsi dengan local, dan bercabang berdasarkan keberhasilan menggunakan return dan $? untuk memakai ulang logika validasi yang sama — dijelaskan dengan diagram dan dipraktikkan di terminal browser.

Memberi nama pada satu blok logika — mendefinisikan fungsi dan argumen

Daripada menulis logika yang sama berulang kali, kamu bisa membungkusnya dalam sebuah fungsi dan memanggilnya lewat nama.

Definisikan dengan name() { ... }, dan tulis isinya di antara { dan }.

Setelah didefinisikan, cukup tulis name untuk menjalankan logika tersebut.

Ini memecah skrip yang panjang menjadi unit-unit yang bermakna, dan kamu cukup memperbaiki di satu tempat saja.

Untuk mengoper nilai ke fungsi, tambahkan argumen setelah nama saat memanggilnya, seperti name foo bar.

Di dalam fungsi, $1 adalah argumen pertama dan $2 argumen kedua (notasi yang sama dengan parameter posisi milik skrip itu sendiri).

Bungkus argumen dengan tanda kutip ganda sebagai "$1", dan nilai yang mengandung spasi pun diperlakukan sebagai satu argumen.

greet() {                        # definisikan sebuah fungsi
  echo "hello, $1"
}
greet alice                      # hello, alice
greet bob                        # hello, bob
Bagaimana pemanggilan dipetakan ke argumen
greet alice bob$1 = alice$2 = bobpakai $1 $2 di isi fungsike-1ke-2di dalam greet
Nilai pada greet alice bob masuk ke $1 dan $2, lalu isi fungsi memakainya untuk melakukan pekerjaannya.
SintaksArtiContoh
name() { … }Mendefinisikan sebuah fungsigreet() { echo "hi $1"; }
name argsMemanggil sebuah fungsigreet alice
$1Mereferensikan argumen pertama di dalam fungsiecho "name=$1"
$2Mereferensikan argumen kedua di dalam fungsiecho "port=$2"

Buat skrip utilitas yang mengelompokkan validasi input ke dalam sebuah fungsi dan memakainya ulang.

① Buka validate.sh dengan vi validate.sh, tekan i untuk masuk mode insert, lalu tulis #!/bin/sh pada baris pertama.

② Definisikan sebuah fungsi yang menerima satu nilai, memeriksa apakah nilai itu kosong, dan menampilkan hasilnya. Referensikan argumen dengan $1 di dalam fungsi.

③ Panggil fungsi tersebut beberapa kali dengan nilai yang berbeda-beda.

④ Tekan Esc dan simpan dengan :wq, lalu tambahkan izin eksekusi dan jalankan skrip untuk memeriksa hasil setiap pemanggilan.

⑤ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi. (Jalankan dengan benar maka penjelasannya akan muncul.)

Linux console
0 / 3 selesai
Loading Linux Terminal...

Variabel yang hanya hidup di dalam fungsi — local

Ketika kamu mendeklarasikan local v=... di dalam fungsi, variabel itu hanya berlaku di dalam fungsi dan hilang saat fungsi selesai.

Tanpa local, kamu akan menimpa variabel dengan nama yang sama di luar fungsi juga, yang menyebabkan efek samping yang tidak terduga.

Untuk memakai ulang sebuah fungsi sebagai komponen dengan aman, jadikan variabel kerja yang dipakai di dalamnya local.

msg="outer"
show() {
  local msg="inner"            # variabel hanya di dalam fungsi
  echo "in func: $msg"
}
show                           # in func: inner
echo "outside: $msg"           # outside: outer (di luar tidak berubah)
Sampai mana local terlihat
msg=outerecho "$msg"tampil outerlocal msg=innerecho "$msg"tampil innerseluruh skripdi dalam fungsi (local)
Variabel biasa terlihat di mana saja, sedangkan variabel local hanya berlaku di dalam fungsi. Meski namanya sama, nilai di luar tidak berubah.
SintaksArtiContoh
local v=…Membuat variabel yang hanya berlaku di dalam fungsilocal step=1
v=…Variabel yang berlaku di seluruh skripstatus=ready

Buat skrip yang menjadikan variabel kerja local dan memastikan ia tidak memengaruhi bagian luar.

① Buka scope.sh dengan vi scope.sh, tekan i untuk masuk mode insert, lalu tulis #!/bin/sh pada baris pertama.

② Atur satu variabel di luar, lalu definisikan sebuah fungsi yang mendeklarasikan variabel bernama sama dengan local dan memberinya nilai yang berbeda.

③ Setelah memanggil fungsi, tampilkan variabel luar untuk memastikan nilainya tidak berubah.

④ Tekan Esc dan simpan dengan :wq, lalu tambahkan izin eksekusi dan jalankan skrip.

⑤ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...

Mengembalikan sukses atau gagal — return dan $?

Sebuah fungsi bisa mengembalikan kode keluar dengan return N.

Menurut konvensi 0 berarti sukses dan apa pun selain 0 berarti gagal, dan tepat setelah memanggilnya kamu bisa memeriksa nilai itu dengan $?.

Bercabang langsung berdasarkan keberhasilan sebuah fungsi seperti if check "$x"; then ... membuat alur validasi dan pemrosesan lebih mudah dibaca.

is_num() {
  case "$1" in
    *[!0-9]*|"") return 1 ;;     # gagal jika mengandung non-digit atau kosong
    *) return 0 ;;
  esac
}
is_num 12; echo "12 -> $?"       # 12 -> 0
is_num abc; echo "abc -> $?"     # abc -> 1
Dari return ke percabangan pada $?
is_num "$1"return 0return 1jalur suksesjalur gagalangkabukan angka$? = 0 → sukses$? = 1 → gagal
Nilai dari return masuk ke $?, dan if bercabang dengan memperlakukan 0 sebagai sukses dan selain nol sebagai gagal.
SintaksArtiContoh
return 0Keluar dari fungsi sebagai suksesis_num 12; # success
return 1Keluar dari fungsi sebagai gagalis_num abc; # failure
$?Memeriksa nilai kembalian fungsi sebelumnyais_num 12; echo $?
if name x; then …Bercabang langsung berdasarkan nilai kembalianif is_num "$v"; then …; fi

Buat fungsi yang memutuskan apakah sebuah nilai berupa angka, dan skrip yang bercabang berdasarkan nilai kembaliannya.

① Buka isnum.sh dengan vi isnum.sh, tekan i untuk masuk mode insert, lalu tulis #!/bin/sh pada baris pertama.

② Definisikan sebuah fungsi yang memeriksa apakah nilai yang diterima hanya berupa digit, mengembalikan return 0 jika berupa angka dan return 1 jika tidak.

③ Letakkan fungsi tersebut langsung di dalam kondisi if dan tampilkan pesan sukses atau gagal untuk beberapa input.

④ Tekan Esc dan simpan dengan :wq, lalu tambahkan izin eksekusi dan jalankan skrip untuk memeriksa hasilnya.

⑤ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Notasi manakah yang mereferensikan argumen pertama di dalam sebuah fungsi shell?

Soal 2Apa lingkup dari variabel yang dideklarasikan dengan local?

Soal 3Manakah yang memeriksa nilai kembalian dari fungsi paling terakhir?