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.
eaydin@dixon~/calisma/bash $ ./yukle.shYuklemebasliyor...E:Couldnotopenlockfile/var/lib/dpkg/lock-open (13: Permissiondenied)E:Unabletolocktheadministrationdirectory (/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.
id -u komutu ile mevcut kullanıcının id'si alınıyor. Eğer bu değer 0'a eşit değilse (-ne : not equal) if şartı sağlanmış oluyor. Linux üzerinde sadece root kullanıcısının id'si 0'dır.
Eğer root kullanıcısı değilse, exit 1 ile programdan çıkıyoruz. Eğer root kullanıcısıysak, exit 0 ile çıkıyoruz. Buradaki 1 ve 0 değerleri exit mesajlarıdır. Linux'ta programlar başarıyla işlerini yerine getirmişse 0 ile çıkarlar, bir hatayla çıkarlarsa 1 veya farklı değerler alırlar.
Yukarıdaki programın nasıl sonuçlandığını (exit mesajını) almak için aşağıdaki yöntemi kullanabiliriz.
eaydin@dixon~/calisma/bash $ echo $?1
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ış.
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.
if [ -f /etc/debian_version ]; thenecho"Bu sistem bir Debian türevi"fi
Veya aşağıdaki yöntemle bir dosyanın var olmadığını kontrol edebilirdik.
if [ !-f /etc/redhat-release ]; thenecho"Bu sistem bir Red Hat türevi değil"fi
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.
eaydin@dixon~/calisma/bash $ catyukle.sh#!/bin/bash# yukle.sh dosya icerigi# Root yetkiniz var mi?if [ $(id-u) -ne0 ]; thenecho"root yetkisi ile calistirilmali"exit1fi# Parametre sayisi kontrol ediliyorif [ $# -lt1 ]; thenecho"Parametre vermediniz"echo"Kullanım: yukle.sh program-adi"exit1fi# Eger sistem Debian iseif [ -f /etc/debian_version ]; then# program zaten yuklu mu?dpkg-l|grep $1 >/dev/nullif [ $? -eq1 ]; thenecho"Yukleme basliyor..."apt-getinstall $1elseecho"$1 zaten yuklu"fi# Eger sistem Red Hat iseelif [ -f /etc/redhat-release ]; then# program zaten yuklu mu?rpm-qa|grep $1 >/dev/nullif [ $? -eq1 ]; thenecho"Yukleme basliyor..."yuminstall $1elseecho"$1 zaten yuklu"fi# Tanimadigimiz sistemelseecho"Tanimadigimiz bir sistem?"exit1fiexit0
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.
#!/bin/bash# yukle.sh dosya icerigi# Debian Yukleme Fonksiyonudebian_yukle() {# program zaten yuklu mu?dpkg-l|grep $1 >/dev/nullif [ $? -eq1 ]; thenecho"Yukleme basliyor..."apt-getinstall $1elseecho"$1 zaten yuklu"fireturn0}redhat_yukle() {# program zaten yuklu mu?rpm-qa|grep $1 >/dev/nullif [ $? -eq1 ]; thenecho"Yukleme basliyor..."yuminstall $1elseecho"$1 zaten yuklu"fireturn0}# Root yetkiniz var mi?if [ $(id-u) -ne0 ]; thenecho"root yetkisi ile calistirilmali"exit1fi# Parametre sayisi kontrol ediliyorif [ $# -lt1 ]; thenecho"Parametre vermediniz"echo"Kullanım: yukle.sh program-adi"exit1fi# Eger sistem Debian iseif [ -f /etc/debian_version ]; thendebian_yukle $1# Eger sistem Red Hat iseelif [ -f /etc/redhat-release ]; thenredhat_yukle $1# Tanimadigimiz sistemelseecho"Tanimadigimiz bir sistem?"exit1fiexit0