GNU/Linux >> Belajar Linux >  >> Linux

Bash Scripting – Fungsi Dijelaskan Dengan Contoh

Dalam skrip Bash shell, fungsi adalah cara untuk mengelompokkan serangkaian instruksi bersama untuk mendapatkan hasil tertentu. Anda dapat menganggap fungsi sebagai skrip mini. Fungsi juga disebut prosedur dan metode dalam beberapa bahasa pemrograman. Fungsi adalah cara yang bagus untuk mencapai modularitas dan dapat digunakan kembali.

Pada artikel ini, saya akan menjelaskan cara menggunakan fungsi dalam skrip bash di Linux dengan contoh. Anda akan cukup nyaman menggunakan fungsi bash pada akhir artikel ini.

Cara mendefinisikan Fungsi di Bash

Ada dua hal penting yang harus Anda pahami saat bekerja dengan fungsi.

  • Mendefinisikan fungsi,
  • Memanggil fungsi.

Mirip dengan cara Anda membuat skrip bash dan menjalankannya, Anda harus mendefinisikan fungsi dan memanggilnya agar fungsi dapat dijalankan.

Ada dua cara sintaksis untuk mendefinisikan fungsi di bash. Cara pertama adalah dengan menggunakan kata kunci bawaan bash "function" diikuti dengan nama fungsi. Blok kode akan ditulis di dalam kurung kurawal {} .

function [name] {
Block of code
}

Cara kedua adalah membuat fungsi tanpa kata kunci "function" . Mulailah dengan nama fungsi diikuti dengan tanda kurung.

[name](){
Block of Code
}

Pilih yang mana? Yah, itu selalu merupakan pilihan pribadi. Memilih salah satu dari yang lain tidak ada ruginya.

Anda juga dapat menulis fungsi satu baris yang disebut fungsi ringkas . Dalam fungsi ringkas, setiap baris kode di dalam kurung kurawal dipisahkan dengan titik koma (; ) .

Luncurkan terminal Anda dan tulis fungsi multiline. Sekarang tekan tombol panah atas dan Anda akan melihat apa pun yang Anda tulis dalam multi-baris akan diubah menjadi fungsi ringkas.

[name](){ first_line; second_line; }

PRAKTIK TERBAIK:

  1. Cobalah untuk memilih salah satu sintaks dan konsistenlah dengannya.
  2. Jika Anda bekerja dalam lingkungan kolaboratif, penting bagi setiap orang untuk mempertahankan standar yang sama saat membuat kode.

Konvensi penamaan

Saat Anda membuat fungsi, Anda harus memberi nama pada fungsi Anda. Nama fungsi harus deskriptif dan mencoba untuk menghindari nama yang sudah digunakan oleh fungsi lain, variabel, konstanta, dll. "Snake Case" adalah cara yang lebih disukai untuk memberi nama fungsi. Dalam kasus ular, kata-kata dipisahkan dengan garis bawah.

Lihatlah contoh di bawah ini. Saya membuat fungsi bernama "hello_world" dalam gaya kasus ular yang hanya akan mencetak hello world ke stdout (Terminal).

hello_world() {
echo "Running Simple Hello World Function"
}

hello_world

Cara memanggil Fungsi di Bash

Mari buat fungsi pembersihan sederhana bernama "log_cleanup" . Tujuan dari fungsi ini adalah untuk menghapus ".log" file yang lebih lama dari 30 hari.

log_cleanup(){
  echo "Running Cleanup On Older Logs - 30 days"
  find /home/karthick/Documents/Projects/logs/ -name "*.log" -type f -mtime +30 -delete
  echo "Cleanup Completed"
}

Fungsi didefinisikan tetapi apakah itu cukup bagi fungsi untuk melakukan tugasnya? Sama sekali tidak. Anda harus memanggil fungsi untuk fungsi yang akan dieksekusi.

Untuk memanggil fungsi, cukup ketik nama fungsi setelah definisi fungsi:

#!/usr/bin/env bash

#### FUNCTION DEFINITION ####

log_cleanup(){
  echo "Running Cleanup On Older Logs - 30 days"
  find /home/karthick/Documents/Projects/logs -name "*.log" -type f -mtime +30 -delete 
  echo "Cleanup Completed"
}

# Calling the function

log_cleanup  

Jika Anda mencoba memanggil fungsi sebelum definisi fungsi, Anda akan mendapatkan kesalahan berikut.

line 3: log_cleanup: command not found

Kenapa begitu? Saat Anda menjalankan skrip, kode akan ditafsirkan baris demi baris dari atas ke bawah. Ini akan membaca fungsi dan memuatnya ke lingkungan bash (memori). Namun di sini Anda memanggil fungsi tersebut bahkan sebelum penerjemah membaca dan memuat fungsi tersebut ke lingkungannya.

Saat Anda memanggil fungsi dari dalam fungsi lain, definisi fungsi Anda bisa dalam urutan apa pun kecuali fungsi pertama. Lihatlah gambar di bawah ini. Fungsi fungsi2 dipanggil dari fungsi1 dan fungsi3 dipanggil dari func2 sebelum definisi mereka. Tapi fungsi1 didefinisikan terlebih dahulu dan kemudian dipanggil. Pada saat fungsi1 dipanggil semua definisi fungsi sudah Diinterpretasikan dan dimuat ke lingkungan.

Status keluar &Nilai kembali

Setiap perintah Linux mengembalikan status keluar (0-255). Nol dikatakan berhasil dan kode keluar lainnya dikatakan gagal dengan arti yang berbeda. Demikian pula, ketika Anda menjalankan suatu fungsi, ia juga mengembalikan status keluar dari perintah yang dijalankan terakhir dalam fungsi tersebut.

Biarkan saya menjalankan fungsi "pembersihan" yang sama lagi. Tapi saya telah memberikan jalan yang tidak tersedia di mesin saya, jadi find perintah akan gagal. Saya menggunakan $? untuk mendapatkan status keluar dalam skrip seperti yang ditunjukkan pada gambar.

Running Cleanup On Older Logs - 30 days
find: '/home/karthick/Documents/Projectss/logs': No such file or directory
Cleanup Completed
Exit status of function log_cleanup is ⇒ 0

Status keluar yang dikembalikan dari fungsi adalah dari echo perintah yang dijalankan sebagai perintah terakhir di dalam fungsi. Ini bukan perilaku yang mungkin Anda harapkan.

Untuk mengatasi perilaku ini, Anda dapat menggunakan "return" . bawaan bash pernyataan.

$ type -a return
return is a shell builtin

Return menerima nilai integer [N] dan keluar dari fungsi dan memberikan nilai kembali ke pemanggilnya (fungsi). Sebelum menggunakan pernyataan pengembalian, Anda harus memahami beberapa aturan tentang cara menggunakan pernyataan pengembalian. Seperti yang dinyatakan sebelumnya, return menerima nilai integer dari 0-255. Pernyataan kembali akan menggunakan status keluar dari perintah yang dijalankan terakhir jika tidak ada argumen (nilai Integer) yang diteruskan atau nilainya melebihi 255.

Biarkan saya menggunakan pengembalian untuk memperbaiki "cleanup" perilaku fungsi. Di sini saya menggunakan pernyataan bersyarat bersama dengan perintah kembali.

#!/usr/bin/env bash

#### FUNCTION DEFINITION ####

log_cleanup(){
 echo "[ INFO ] - Running Cleanup On Older Logs - 30 days"
 if [[ -d "/home/karthick/Documents/Projectss/logs" ]]
 then
   find -name "*.log" -type f -mtime +30 -delete
   echo "[ SUCCESS] - Cleanup Completed"
 else
   echo "[ ERROR ] - Directory path wrong... Cleanup has not happened..."
   return 1
 fi
}

# Calling the function

log_cleanup 
echo "++ Exit status of log_cleanup function is ==> $?"

Lihatlah output di bawah ini. Fungsi mengembalikan kode keluar 1 dari pernyataan pengembalian.

[ INFO ] - Running Cleanup On Older Logs - 30 days
[ ERROR ] - Directory path wrong… Cleanup has not happened…
++ Exit status of log_cleanup function is ==> 1

Meneruskan argumen ke Fungsi

Mirip dengan meneruskan argumen ke skrip bash Anda, fungsi juga menerima argumen. Bagian yang membingungkan adalah, fungsi menggunakan $1 yang sama …$9 variabel khusus untuk mengakses argumen yang sama dengan meneruskan argumen ke skrip. Anda harus memahami apa yang terjadi ketika Anda menggunakan variabel khusus ini di dalam dan di luar fungsi.

cat > arg_test.sh
#!/bin/bash
echo "Value passed in \$1 is = $1"

howdy(){
   echo "value of \$1 inside function is = $1"
}

howdy # Function Call

Salin dan jalankan cuplikan di atas untuk melihat perbedaannya. String "Howdy" diteruskan sebagai argumen pertama ke skrip.

$ ./arg_test.sh howdy
Value passed in $1 is = howdy
value of $1 inside function is =

Dari output, Anda dapat melihat $1 di dalam fungsi mencetak nilai kosong karena $1 di dalam fungsinya berbeda dari $1 di luar fungsi meskipun mereka memiliki nama yang sama.

Untuk meneruskan argumen ke fungsi, setelah nama fungsi tinggalkan spasi dan berikan argumen Anda seperti yang ditunjukkan pada gambar di bawah ini. Setiap argumen yang dipisahkan oleh spasi akan diberi variabel masing-masing $1$N dan Anda dapat menggunakan variabel ini di dalam fungsi untuk memproses argumen.

log_cleanup $1 $2 ….. $N

Seperti yang Anda lihat pada tangkapan layar di atas, saya memberikan nama direktori dan jumlah hari sebagai argumen.

Cakupan variabel untuk suatu Fungsi

Saat Anda membuat variabel di dalam fungsi atau di luar fungsi, variabel tersebut dapat diakses secara global. Secara default, variabel dibuat dalam lingkup global.

Lihatlah contoh di bawah ini. Jika Anda mencoba mengakses kedua variabel outside_function dan inside_function , nilainya dapat diakses. Ini berarti meskipun fungsi berjalan dan keluar, variabel yang dibuat di dalam fungsi dapat diakses secara global.

 #!/bin/bash

outside_function="This variable is from outside the function"

func1(){
  inside_function="This variable is from inside the func1"
}

func1
echo $outside_function
echo $inside_function

Dalam beberapa bahasa pemrograman, ini mungkin bukan perilaku dan variabel yang dibuat di dalam fungsi akan tersedia selama waktu fungsi dijalankan. Tapi di bash, perilakunya berbeda.

Untuk membuat variabel lokal ke fungsi, Anda dapat menggunakan "local" . bawaan bash kata kunci. Kata kunci lokal akan membatasi cakupan variabel dari global ke lokal dan variabel hanya dapat diakses selama waktu fungsi dijalankan.

#!/bin/bash

outside_function="This variable is from outside the function"

func1(){
  local inside_function="This variable is from inside the func1"
}

func1
echo $outside_function
echo $inside_function

Bacaan yang disarankan:

  • Bash Scripting – Variabel Dijelaskan Dengan Contoh

Ketika kata kunci lokal digunakan, Anda dapat menggunakan nama variabel yang sama dalam fungsi yang berbeda.

Perhatian: Anda harus selalu berusaha menghindari penggunaan pengidentifikasi yang sudah digunakan sebagai variabel, fungsi, kata kunci bash. Contoh di atas ditampilkan hanya untuk memahami perilaku.

Modularitas dan Resubaility

Memahami dan menulis fungsi dapat dilakukan dalam waktu cepat. Tetapi menulis fungsi yang baik membutuhkan waktu dengan pemahaman yang lebih baik tentang lingkungan. Seperti yang telah ditunjukkan di bagian pendahuluan, dengan fungsi bash Anda dapat mencapai banyak modularitas dan dapat digunakan kembali.

Mari kita ambil contoh. Anda telah membuat 20 skrip dan di setiap skrip, Anda telah menyertakan log_cleanup fungsi yang telah kita lihat di bagian sebelumnya untuk melakukan tugas-tugas rumah tangga. Alih-alih memasukkan fungsi ini ke dalam 20 skrip, Anda dapat membuat definisi fungsi tunggal dan mengimpornya ke dalam 20 skrip. Dengan cara ini, Anda mencapai modularitas serta fungsi yang dapat digunakan kembali. Ini mirip dengan impor pernyataan dalam python, termasuk pernyataan dalam C, dll.

Lihat gambar di bawah ini. Saya telah membuat dua skrip bernama script1.sh dan script2.sh dan log_cleanup fungsi ditulis ke file terpisah bernama cleanup.sh .

Saya mengimpor fungsi dengan menjalankan source memerintah. source perintah akan menjalankan file yang diteruskan sebagai argumennya dan memuat variabel atau fungsi ke sesi bash saat ini. Dengan cara ini ketika Anda menjalankan log_cleanup dari file skrip lain, fungsi sudah dimuat ke lingkungan saat ini dan dapat diakses.

Dari gambar di atas, Anda dapat memahami bagaimana argumen sangat membantu. Hanya ada satu definisi fungsi dan menurut kasus penggunaan, saya dapat memodifikasi fungsi untuk menerima argumen yang berbeda dan dalam skrip yang berbeda.

Perhatian: Anda juga dapat menjalankan skrip shell Anda dengan source perintah yang akan menjalankan skrip di shell saat ini alih-alih membuat subkulit untuk menjalankan skrip.

Kesimpulan

Dalam panduan ini, kita telah membahas tentang fungsi Bash dan cara mendefinisikan dan memanggil fungsi dalam skrip dengan contoh. Agar nyaman dengan fungsi, Anda harus mempraktikkan fungsi dengan kasus penggunaan yang berbeda. Jika Anda memiliki pertanyaan atau masukan, jangan ragu untuk memberi tahu kami melalui bagian komentar di bawah.

Bacaan terkait:

  • Skrip Bash – Untuk Pengulangan Dijelaskan Dengan Contoh
  • Bash Scripting – Sementara Dan Sampai Perulangan Dijelaskan Dengan Contoh
  • Perbedaan Antara Mendefinisikan Variabel Bash Dengan Dan Tanpa Ekspor
  • Perintah Bash Echo Dijelaskan Dengan Contoh Di Linux
  • Tutorial Bash Heredoc Untuk Pemula
  • Pengalihan Bash Dijelaskan Dengan Contoh

Linux
  1. Cara Menulis Skrip Bash dengan Contoh

  2. Fungsi Dalam Variabel Shell?

  3. Pernyataan Bash If-Else Dengan Contoh

  1. Fungsi Bash

  2. Shell Scripting Bagian V:Fungsi di Bash

  3. Perintah Bash Echo Dijelaskan Dengan Contoh Di Linux

  1. Pengalihan Bash Dijelaskan Dengan Contoh

  2. Bash Scripting – Sementara Dan Sampai Loop Dijelaskan Dengan Contoh

  3. Bash Scripting – Untuk Loop Dijelaskan Dengan Contoh