Linux Shell Komut Dosyasında işlevler nasıl tanımlanır ve kullanılır
İş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.