Linux

Linux Shell Komut Dosyasında işlevler nasıl tanımlanır ve kullanılır

Linuxta Bash Shell Komut Dosyasinda Hata Ayiklama2
Share

İşlev, yeniden kullanılabilir bir kod bloğudur. Genellikle bir fonksiyona tekrarlanan kodlar koyarız ve bu fonksiyonu çeşitli yerlerden çağırırız. Kitaplık, bir işlevler topluluğudur. Bir kitaplıkta yaygın olarak kullanılan işlevi tanımlayabiliriz ve diğer komut dosyaları bunları kodu çoğaltmadan kullanabilir.

Bu yazıda fonksiyonlar ve tarifler hakkında daha fazla tartışacağız. Gösteri amacıyla Ubuntu makinesinde Bourne Again SHell (Bash) kullanacağım.

arama fonksiyonu

Shell’de çağırma işlevi, başka bir komutu çağırmakla tamamen aynıdır. Örneğin, işlev adınız my_func ise, aşağıdaki gibi yürütülebilir:

$ my_func

Herhangi bir işlev argümanları kabul ederse, bunlar komut satırından aşağıdaki gibi sağlanabilir:

$ my_func arg1 arg2 arg3

fonksiyon tanımlama

Fonksiyonu tanımlamak için aşağıdaki sözdizimini kullanabiliriz:

 function function_name {
            Body of function
 }

İşlev gövdesi, herhangi bir geçerli komut, döngü kısıtlaması, başka işlev veya komut dosyası içerebilir. Şimdi ekranda mesajı görüntüleyen basit bir fonksiyon oluşturalım.

 function print_msg {
       echo "Hello, World"
 }

Şimdi bu fonksiyonu çalıştıralım:

 $ print_msg 
 Merhaba, Dünya

Beklendiği gibi, bu işlev ekranda mesajı görüntüler.

Yukarıdaki örnekte doğrudan terminal üzerinde fonksiyon yarattık. Bu işlevi dosyada da saklayabiliriz. Aşağıdaki örnek bunu göstermektedir.

 #! /bin/bash 
 işlevi print_msg { 
       echo "Merhaba, Dünya" 
 } 
 print_msg

Bu fonksiyonu function.sh dosyası içerisinde tanımladık. Şimdi bu betiği çalıştıralım:

 $ chmod +x function.sh 
 $ ./function.sh 
 Merhaba, Dünya

Gözlemlerseniz, yukarıdaki çıktı öncekiyle tamamen aynıdır.

 

İşlevler hakkında daha fazla bilgi

Bir önceki bölümde çok temel bir fonksiyonu tanımlamıştık. Ancak yazılım geliştirme sırasında çeşitli parametreleri kabul edebilen ve değerleri döndürebilen daha gelişmiş fonksiyonlara ihtiyacımız var. Bu bölümde bu tür işlevleri tartışacağız.

İşleve argümanları iletmek

Diğer komutlarla aynı işlevi görecek argümanlar sağlayabiliriz. Bu argümanlara fonksiyondan dolar($) sembolünü kullanarak ulaşabiliriz. Örneğin, $1 ilk argümanı temsil eder, $2 ikinci argümanı temsil eder vb.

Mesajı bir argüman olarak kabul etmek için yukarıdaki işlevi değiştirelim. Değiştirilmiş fonksiyonumuz şöyle görünecek:

 function print_msg { 
       echo "Merhaba $1" 
 }

Yukarıdaki fonksiyonda, $1 kullanarak ilk argümana erişiyoruz. Bu fonksiyonu çalıştıralım:

 $ print_msg "Sunucu Cozumleri"

Bu işlevi çalıştırdığınızda, aşağıdaki çıktıyı üretecektir:

 Merhaba Sunucu Çözümleri

fonksiyondan değer döndürme

Diğer programlama dilleri gibi Bash, arayana değer döndürebileceğimizi kullanarak dönüş ifadesi sağlar. Bunu bir örnekle anlayalım:

function func_return_value {
      return 10
 }

Yukarıdaki işlev, arayanına 10 değerini döndürür. Bu fonksiyonu çalıştıralım:

 $ func_return_value 
 $ echo "İşlev tarafından döndürülen değer: $?"

Yukarıdaki işlevi çalıştırdığınızda, aşağıdaki çıktıyı üretecektir:

 İşlev tarafından döndürülen değer: 10

NOT: Bash’da $? fonksiyonun dönüş değerini yakalamak için

Fonksiyon tarifleri

Şimdiye kadar bash işlevleri hakkında adil bir fikir edindik. Şimdi hayatımızı kolaylaştırmak için kullanılabilecek bazı yararlı bash işlevleri oluşturalım.

Ağaç kesicisi

Log mesajı ile birlikte tarih ve saati yazdıracak bir kayıt fonksiyonu oluşturalım.

 function log_msg { 
        echo "[`date '+ %F %T'` ]: $@ " 
 }

Bu fonksiyonu çalıştıralım:

 $ log_msg "Bu örnek günlük mesajıdır"

Bu işlevi çalıştırdığınızda, aşağıdaki çıktıyı üretecektir:

 [ 2018-08-16 19:56:34 ]: Bu örnek günlük mesajıdır

Sistem bilgilerini görüntüle

GNU/Linux sistemi hakkındaki bilgileri görüntülemek için bir fonksiyon oluşturalım.

 

 function system_info {
       echo "### OS information ###"
       lsb_release -a

       echo
       echo "### Processor information ###"
       processor=`grep -wc "processor" /proc/cpuinfo`
       model=`grep -w "model name" /proc/cpuinfo  | awk -F: '{print $2}'`
       echo "Processor = $processor"
       echo "Model     = $model"

       echo
       echo "### Memory information ###"
       total=`grep -w "MemTotal" /proc/meminfo | awk '{print $2}'`
       free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'`
       echo "Total memory: $total kB"
       echo "Free memory : $free kB"
 }

Yukarıdaki işlevi çalıştırdığınızda, aşağıdaki çıktıyı üretecektir:

### OS information ###
No LSB modules are available.
Distributor ID:           Ubuntu
Description:   Ubuntu 18.04.1 LTS
Release:         18.04
Codename:    bionic

### Processor information ###
Processor = 1
Model     =  Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz

### Memory information ###
Total memory: 4015648 kB
Free memory : 2915428 kB


Geçerli dizinden dosya veya dizin bulun

Aşağıdaki işlev, geçerli dizinden dosya veya dizini arar:

 function search {
      find . -name $1
 }

Aşağıdaki komutu kullanarak dizini yani dir4’ü arayalım:

 $ search dir4

Yukarıdaki komutu çalıştırdığınızda, aşağıdaki çıktıyı üretecektir:

 ./dir1/dir2/dir3/dir4

Dijital saat

Aşağıdaki fonksiyon, terminalde basit bir dijital saat oluşturur

 function digital_clock {
            clear
            while [ 1 ]
            do
                  date +'%T'
                  sleep 1
                  clear
            done
 }

Kitaplık oluşturma

Kitaplık, bir işlevler topluluğudur. Kitaplık oluşturmak için – bir dosyadaki işlevleri tanımlayın ve o dosyayı mevcut ortama aktarın.

Tüm işlevleri utils.sh dosyasında tanımladığımızı varsayalım, ardından mevcut ortamdaki işlevleri içe aktarmak için aşağıdaki komutu kullanın:

$ source utils.sh

Bundan sonra, herhangi bir bash komutu gibi, kütüphaneden herhangi bir işlevi çalıştırabilirsiniz.

Çözüm

Bu yazıda verimliliğinizi artıracak birkaç faydalı tarifi ele aldık. Umarım bu makaleler size kendi tariflerinizi yaratmanız için ilham verir.