Ketika skrip bash Anda semakin besar, segalanya bisa menjadi sangat berantakan!
Anda mungkin menemukan diri Anda menulis ulang potongan kode yang sama berulang kali di bagian yang berbeda dari skrip bash Anda.
Untungnya, Anda dapat menghindari penulisan ulang kode dengan menggunakan fungsi di bash yang akan membuat skrip Anda lebih teratur dan mudah dibaca.
Dalam tutorial ini, Anda akan belajar membuat fungsi, mengembalikan nilai fungsi, dan meneruskan argumen fungsi dalam skrip bash shell.
Selanjutnya, Anda akan mempelajari cara kerja lingkup variabel dan cara mendefinisikan fungsi rekursif.
Membuat fungsi di bash
Ada dua sintaks yang berbeda untuk mendeklarasikan fungsi bash. Sintaks berikut adalah cara yang paling umum digunakan untuk membuat fungsi bash:
function_name () {
commands
}
Yang kedua yang kurang umum digunakan untuk membuat fungsi bash dimulai dengan fungsi kerja yang dicadangkan diikuti dengan nama fungsi sebagai berikut:
function function_name {
commands
}
Sekarang ada beberapa hal yang harus Anda perhatikan saat bekerja dengan fungsi:
- Sebuah fungsi tidak akan pernah berjalan/dieksekusi kecuali Anda memanggil/memanggil fungsi tersebut.
- Definisi fungsi harus mendahului panggilan ke fungsi.
Kapan pun Anda ingin suatu fungsi dijalankan, Anda hanya perlu memanggilnya! Pemanggilan fungsi dilakukan hanya dengan merujuk nama fungsi.
Lihatlah fun.sh berikut ini skrip bash:
#!/bin/bash
hello () {
echo "Hello World"
}
hello
hello
hello
Saya mendefinisikan fungsi bernama halo yang hanya menggemakan baris “Hello World” ke terminal. Perhatikan bahwa saya melakukan tiga halo panggilan fungsi dan jika Anda menjalankan skrip, Anda akan melihat “Hello World” baris dicetak tiga kali di layar:
[email protected]:~$ ./fun.sh
Hello World
Hello World
Hello World
Mengembalikan nilai fungsi dalam bash
Dalam banyak bahasa pemrograman, fungsi mengembalikan nilai saat dipanggil; namun, ini tidak terjadi pada bash karena fungsi bash tidak mengembalikan nilai.
Ketika fungsi bash selesai dieksekusi, ia mengembalikan status keluar dari perintah terakhir yang dieksekusi yang ditangkap di $? variabel. Nol menunjukkan eksekusi yang berhasil atau bilangan bulat positif bukan nol (1-255) untuk menunjukkan kegagalan.
Anda dapat menggunakan pengembalian pernyataan untuk mengubah status keluar fungsi. Misalnya, lihat error.sh berikut ini naskah:
#! /bin/bash
error () {
blabla
return 0
}
error
echo "The return status of the error function is: $?"
Jika Anda menjalankan error.sh skrip bash, Anda mungkin akan terkejut dengan hasilnya:
[email protected]:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0
Tanpa kembalikan 0 pernyataan, kesalahan fungsi tidak akan pernah mengembalikan status keluar bukan nol sebagai blabla adalah menghasilkan perintah tidak ditemukan kesalahan.
Jadi seperti yang Anda lihat, meskipun fungsi bash tidak mengembalikan nilai, saya membuat solusi dengan mengubah status keluar fungsi.
Anda juga harus mengetahui bahwa pernyataan pengembalian segera menghentikan suatu fungsi.
Meneruskan argumen ke fungsi bash
Anda dapat meneruskan argumen ke suatu fungsi seperti halnya Anda dapat meneruskan argumen ke skrip bash. Anda cukup menyertakan argumen saat melakukan pemanggilan fungsi.
Untuk mendemonstrasikannya, mari kita lihat iseven.sh berikut ini skrip bash:
#!/bin/bash
iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}
iseven 3
iseven 4
iseven 20
iseven 111
iseven() fungsi menguji apakah suatu bilangan genap atau ganjil. Saya melakukan empat panggilan fungsi ke iseven() . Untuk setiap panggilan fungsi, saya memberikan satu nomor yang merupakan tambahan pertama untuk fungsi iseven() dan direferensikan oleh $1 variabel dalam definisi fungsi.
Mari kita jalankan iseven.sh skrip bash untuk memastikannya berfungsi:
[email protected]:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.
Anda juga harus menyadari bahwa argumen fungsi bash dan argumen skrip bash adalah dua hal yang berbeda. Untuk membedakan perbedaannya, lihat funarg.sh berikut ini skrip bash:
#!/bin/bash
fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}
echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."
fun Yes 7
Jalankan skrip dengan beberapa argumen dan amati hasilnya:
[email protected]:~$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()
Seperti yang Anda lihat, meskipun Anda menggunakan variabel $1 dan $2 yang sama untuk merujuk ke argumen skrip dan argumen fungsi, keduanya menghasilkan hasil yang berbeda saat dipanggil dari dalam suatu fungsi.
Variabel lokal dan global dalam fungsi bash
Variabel bash dapat memiliki cakupan global atau lokal. Anda dapat mengakses variabel global di mana saja dalam skrip bash terlepas dari cakupannya. Sebaliknya, variabel lokal hanya dapat diakses dari dalam definisi fungsinya.
Untuk mendemonstrasikan, lihat scope.sh berikut ini skrip bash:
#!/bin/bash
v1='A'
v2='B'
myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}
echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"
Saya pertama kali mendefinisikan dua variabel global v1 dan v2 . Kemudian di dalam myfun() definisi, saya menggunakan lokal kata kunci untuk mendefinisikan variabel lokal v1 dan memodifikasi variabel global v2. Perhatikan bahwa Anda dapat menggunakan nama variabel yang sama untuk variabel lokal dalam fungsi yang berbeda.
Sekarang mari kita jalankan skripnya:
[email protected]:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D
Dari output script, Anda dapat menyimpulkan sebagai berikut:
- Variabel lokal yang memiliki nama yang sama dengan variabel global akan diprioritaskan daripada variabel global di dalam badan fungsi.
- Anda dapat mengubah variabel global dari dalam suatu fungsi.
Fungsi rekursif
Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri! Fungsi rekursif berguna saat Anda mencoba memecahkan masalah pemrograman yang dapat dipecah menjadi submasalah yang lebih kecil.
Fungsi faktorial adalah contoh klasik dari fungsi rekursif. Perhatikan factorial.sh berikut ini skrip bash:
#!/bin/bash
factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}
echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6
Setiap fungsi rekursif harus dimulai dengan base case yang harus mengakhiri rantai panggilan fungsi rekursif. Dalam faktorial() fungsi, kasus dasar didefinisikan sebagai berikut:
if [ $1 -le 1 ]; then
echo 1
Sekarang turunkan kasus rekursif untuk fungsi faktorial. Untuk menghitung faktorial suatu bilangan n di mana n adalah angka positif yang lebih besar dari satu, Anda dapat mengalikan n dengan faktorial n-1 :
factorial(n) = n * factorial(n-1)
Mari kita gunakan persamaan di atas untuk menulis kasus rekursif ini:
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
Sekarang jalankan skrip dan pastikan untuk mendapatkan hasil yang benar:
[email protected]:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720
Sebagai latihan tambahan, coba tuliskan fungsi rekursif untuk menghitung bilangan Fibonacci ke-n. Pertama, cobalah untuk membuat kasus dasar dan kemudian kasus rekursif; Anda mendapatkan ini!
Anda perlu lebih banyak olahraga? Unduh PDF di bawah ini dan praktikkan fungsi dalam skrip bash. Anda juga memiliki solusi dalam PDF yang sama.
Bash Bab 9 Latihan SoalMasalah dan solusinya untuk mempraktekkan apa yang baru saja Anda pelajari di bab iniBash-Bab-9-Pertanyaan Latihan-Linux-Handbook.pdf31 KB
Luar biasa! Bab berikutnya dan terakhir dari seri ini akan menerapkan semua yang telah Anda pelajari sejauh ini untuk menulis skrip bash efektif yang mengotomatiskan tugas administratif yang membosankan.