BASH Programlama
GNU/Linux üzerinde bugün en yaygın kullanılan kabuğun bash (Bourne Again SHell) olduğunu söyleyebiliriz. Bu bölümde bash kullanarak akıllı işlemleri nasıl yapacağımızı, temel kontrolleri, hatta basit bazı yükleme scriptleri geliştirmeyi göreceğiz.
Temel Kontroller
Bash scriptlerinin temel yapısı, başında yorumlayıcının belirtildiği, ardından gerekli komutların sıralandığı dosyalardır. Aşağıdaki scripti yukle.sh ismiyle kaydedip çalıştıralım.
#!/bin/bash
# yukle.sh dosya icerigi
echo "Yukleme basliyor..."eaydin@dixon ~/calisma/bash $ chmod +x yukle.sh
eaydin@dixon ~/calisma/bash $ ./yukle.sh
Yukleme basliyor...Tabii scriptimiz bu haliyle pek işe yaramıyor. Örneğin htop programının yüklenmesini sağlayabiliriz.
eaydin@dixon ~/calisma/bash $ cat yukle.sh
#!/bin/bash
# yukle.sh dosya icerigi
echo "Yukleme basliyor..."
apt-get install htopeaydin@dixon ~/calisma/bash $ ./yukle.sh
Yukleme basliyor...
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?Gördüğünüz gibi, apt-get programı root yetkimiz olmadığı için hata verdi. root yetkimizin olup olmadığının kontrolünü scriptimize yaptırıp buna uygun bir hata verebilirdik.
Yukarıdaki satırların üzerinden geçecek olursak:
[[ "$EUID" -ne 0 ]]: Betiği çalıştıran kullanıcının etkili kullanıcı kimliğinin (Effective User ID) 0 (yani root) olup olmadığını kontrol eder.[[ ... ]]modern Bash test yapısıdır.$EUIDdeğişkeni genellikle$(id -u)'dan daha pratiktir.>&2: Hata mesajlarının standart çıktı (stdout) yerine standart hataya (stderr) yönlendirilmesi iyi bir pratiktir.exit 1: Betiğin bir hata koduyla (genellikle 0 olmayan bir değer) sonlanmasını sağlar.apt install -y htop:apt-getyerine modernaptkomutu kullanılır.-yseçeneği, kurulum sırasında sorulacak onay sorularına otomatik olarak "evet" yanıtı verir.exit 0: Betiğin başarıyla tamamlandığını belirtir.
Yukarıdaki programın nasıl sonuçlandığını (exit mesajını) almak için aşağıdaki yöntemi kullanabiliriz.
Buradaki $? bash için özel bir değişkendir ve "bir önceki programın hata mesajı"nı temsil eder. Yani programımız root yetkisiyle çalıştırılmadığı için exit 1 ile çıkmış.
Şimdi programımızı root yetkisiyle çalıştıralım.
Programımızı tekrar çalıştırırsak, htop'un zaten yüklü olduğunu göreceğiz. Öyleyse programımız bunu da kontrol etsin.
Bir paketin kurulu olup olmadığını kontrol etmenin daha güvenilir yolu, paket yöneticisinin kendi sorgulama mekanizmasını kullanmaktır. grep ile filtrelemek, paket adının başka bir paketin açıklamasında geçmesi gibi durumlarda yanıltıcı olabilir.
Debian/Ubuntu:
dpkg -s <paket_adı>komutunun çıkış kodunu kontrol edebiliriz. Paket kuruluysa komut 0 ile çıkar, kurulu değilse 0 olmayan bir kodla çıkar.RHEL/CentOS/Fedora:
rpm -q <paket_adı>komutunun çıkış kodunu kontrol edebiliriz. Paket kuruluysa 0, değilse 0 olmayan bir kodla çıkar.
Parametrik Kullanım
Programımız sadece htop için çalışıyor, eğer herhangi bir program için çalışmasını isteseydik, parametre almamız gerekirdi.
Bash ile gelen parametrelerin sayısını $# ile, gelen her parametreyi ise $1 $2 $3 ... şeklinde alabilirsiniz.
Dosyanın Var Olup Olmadığını Anlama
Programımız fena iş çıkarmasa da, sadece Debian sistemler üzerinde çalışacak şekilde yazıldı, ve bunun kontrolünü hiç yapmıyor. Öte yandan sistemimizin Debian olup olmadığını anlamak için /etc/debian_version dosyasının var olup olmadığına bakmamız yeterli. Bunun için bash aşağıdaki gibi bir kontrol mekanizması sunuyor.
Veya aşağıdaki yöntemle bir dosyanın var olmadığını kontrol edebilirdik.
Bu kontrolleri kullanarak, sistem Debian ise dpkg ve apt-get komutlarını, Red Hat ise rpm ve yum komutlarını kullanabiliriz. Scriptimizin son hali aşağıdaki gibi.
(Not: Dağıtımı belirlemek için /etc/os-release dosyasını kontrol etmek daha modern bir yöntemdir, ancak bu örnek için dosya varlığı kontrolü yeterlidir.)
Fonksiyonlar
Yukarıdaki yükleme işlemlerini işletim sistemi özelinde fonksiyonlara taşırsak ileride geliştirmesi daha rahat olabilir.
Fonksiyonlar hakkında karıştırılmaması gereken, argümanları da tıpkı programın kendisi gibi $1 $2 $3 ... şeklinde ifade edilir. Dolayısıyla fonksiyon içerisinde kullanacağınız $1 ifadesi, fonksiyona gönderilen 1. parametre olur, programa gönderilen değil. Fonksiyon içinden, programa gönderilen parametrelere doğrudan erişemezsiniz, ancak dolaylı olarak erişebilirsiniz.
Yükleme işlemimizi fonksiyonlara bölüp programın son halini görelim.
Bu örnekler, Bash betiklerinin temellerini (değişkenler, koşullar, fonksiyonlar, komut çalıştırma, çıkış kodları) göstermektedir. Daha karmaşık görevler için döngüler, dizi değişkenler, metin işleme gibi konular Döngüler ve Diğer Kontrol Yöntemleri bölümünde ele alınacaktır.
Last updated