Linux Kabuk (Bash) Programlama

Linux sistem yönetimi ve sızma testleri sırasında Linux kabuk programlama ile bazı işlemlerin otomatikleştirilmesi gerekebilmektedir. Bu yazıda, Linux kabuk programlama konusuna giriş gerçekleştirilecektir.

1) Girdi – Çıktı İşlemleri

Linux ortamında 1 adet girdi ortamı, 2 adet de çıktı ortamı bulunmaktadır. Bu ortamlar aşağıdaki gibi listelenebilir.

  • Standart Girdi (0): Kullanıcının giriş yaptığı ortamdır. Klavye standart giriş noktası olarak kullanılır. Kullanıcıdan alınan değer bir değişkene atanarak kullanılabilir.
  • Standart Çıktı (1): Başarılı bir işlem sonucunun aktarıldığı ortamdır. Monitor standart çıkış noktası olarak kullanılır. İstenirse başarılı durumlar başka bir ortama (dosya gibi) da aktarılabilir.
  • Hata Çıktısı (2): Başarısız bir işlem sonucunun aktarıldığı ortamdır. Monitor standart çıkış noktası olarak kullanılır. İstenirse başarısız durumlar başka bir ortama (dosya gibi) da aktarılabilir. “/dev/null” kara delik olarak da adlandırılabilir ve çöp kutusu olarak kullanılabilir.
Bunun yanında başarılı ve başarısız her durumu bir dosyaya atmak da mümkündür.
Ekrana yazdırılacak ifadeler renkli bir şekilde de bastırılabilir. Yazı renkleri aşağıdaki gibi kodlar ile ifade edilir.

  • Gri: 30
  • Kırmızı: 31
  • Yeşil: 32
  • Sarı:33
  • Mavi:34
  • Magenta:35
  • Cyan:36
 

2) Değişken İşlemleri

Veri tipinden bağımsız olarak atama işlemi gerçekleştirilebilir. Örnek atama işlemleri aşağıdaki gibidir.

Not: Değişkenlere atama yaparken atanacak değeri iki adet çift tırnak (“…”) içine almak karşılaşılabilecek hataların önüne geçebilir.

Betiğe veya fonksiyona verilen bir parametre (ilk parametre için $1, ikinci paramtre için $2,… gibi) başka bir değişkende saklanabilir.

Katar ifadeler birleştirilebilir.

Sayılar ile dört işlem gerçekleştirilebilir.

Komut sonucunu bir değişkene atama işlemi “$(KOMUT)” veya “KOMUT” ile gerçekleştirilebilir. Örneğin:

Geçici olarak bir dosya oluşturularak dosyanın yolu bir değişkene atanabilir. “mktemp” komutu belirtilen dizinde o dosyanın olmadığını garanti eder

Değişkeni kullanmak için başına dolar ($) işareti konulur.

Bir değişkenin başka kabuklarda da kullanılması isteniyorsa çevre değişkeni olarak tanımlanmalıdır. Çevre değişkenleri “env” komutu ile liftelenebilir. Bu komutun örnek çıktısı:

Bir komutu çalıştıran kullanıcıya ait bazı bilgiler (komutu çalıştıran kullanıcının kabuğu veya adı gibi) bu değişkenler ile elde edilebilir.

Araçların veya betiklerin bulunduğu belli bir dizin varsa, bu dizinin çevresel değişkenlere atanması “export” komutu ile gerçekleştirilebilir. Geçici olarak PATH‘e dizin atama işlemi için aşağıdaki komut kullanılabilir.

Kalıcı değişken atamak için “.bashrc” dosyasına eklenmelidir. Tüm “.bashrc” dosyaları için “locate .bashrc” komutu kullanılabilir.

 

3) if-elif-else ile Karşılaştırma

Temel kullanım aşağıdaki gibidir. Köşeli parantez (“[” ve “]”) karakterlerinden önce boşluk olmalıdır.

Tek satırda gösterimi aşağıdaki gibidir.

“if” ifadesinden sonraki kısım ( yani “[ ŞART ]” şeklindeki bölüm) boolean olabilir.

Betiklerde en sık kullanılan ifadeler aşağıdaki gibidir:

Kelimeler (string ifadeler) için “==”, “!=” kullanılır.

Sayılar için “-eq”, “-lt”, “-gt”, “-le”, “-ge”, “-eq”, “-ne” … kullanılır.

Not: Eğer şart ifadesinin yazılacağı alanda “[]” yerine “()” kullanılıyorsa “==” da kullanılabilir.

Linux işletim sistemlerinde her şey dosyadır. Dosya işlemler için aşağıdaki ifadeler kullanılabilir.

Düzenli ifadelerde köşeli parantezler çiftleştirilir. Yani iki adet “[[” ve “]]” kullanılır.

Bir fonksiyon çıktısına göre de sorgulama yapılabilir.

Köşeli parantez kullanılmadan da “if” sorguları gerçekleştirilebilir.

Sorgulama işlemi için “test” komutu da kullanılabilir. “test” komutundan sonra “if [ $? -eq 0 ]” sorgusu ile “test” komut çıktısının doğruluğu kontrol edilebilir.

 

4) case-esac ile Karşılaştırma

if-elif-else yapısındaki gibi karşılaştırma işlemleri gerçekleştirilebilir.

Kelimeler için de karşılatırma gerçekleştirilebilir.

 

5) for Döngüsü

Döngüler sayıları birer birer arttırmak için kullanılabilir.

Aynı işlem tek satırda da gerçekleştirilebilir.

Sayıları birer birer arttırmak için kullanılabilir (Yöntem – 2)

Sayıları birer birer arttırmak için kullanılabilir (Yöntem – 3)

Tek satırda gösterimi aşağıdaki gibidir:

Sayıları üçer üçer arttırmak için kullanılabilir. Aşağıdaki döngü 1,4,7,… şeklinde devam eder.

Çoklu kontrol de gerçekleştirilebilir.

Bir dosya içerisinde dolaşılabilir.

“for” kullanıldığında liste içerisindeki ifadeler yeni satıra göre değil, boşluk karakterine göre ele alınır.

Not: Eğer satır satır ele alınmak isteniyorsa “while” kullanılmalıdır.

Bir dizi içerisinde dolaşılabilir.

Sonsuz döngü oluşturulabilir.

Bir dosyalar dizisi içerisinde işlemler gerçekleştirilebilir.

Her bir dosya için işlem yapılmak istenebilir.

Her dosyanın içerisindeki uygun değer ekrana bastırılabilir.

Her bir sayı tek tek ele alınabilir.

Bulunulan dizinde belirli bir formattaki dosyalarda dolaşılabilir.

Belirtilen dizinde belirli bir formattaki dosyalarda dolaşılabilir.

Not: Döngüden çıkmak için “break” komutu kullanılır. Mevcut iterasyondan çıkıp, sonraki iterasyona devam etmek için ise “continue” komutu kullanılır.

 

6) while Döngüsü

Döngüler belirli bir şart sağlanana dek devam edebilir.

Dosya içerisinde satır satır dolaşılabilir.

Not: Dosya içerisindeki ifadeler satır satır ele alınır. boşluk karakterine göre ele alınmak isteniyorsa “for” kullanılmalıdır.

Dosyada dolaşılabilir (Yöntem – 2):

Bir komut çıktısındaki her satır tek tek elde edilebilir.

Tek satırda gösterimi aşağıdaki gibidir:

Sonsuz döngü oluşturulabilir.

Döngüyü belirten kısım ( yani “while [ ŞART ]” şeklindeki ifadeler) aşağıdaki gibi belli bir değere ulaşana dek de beklenebilir.

Not: Döngüden çıkmak için “break” komutu kullanılır. Mevcut iterasyondan çıkıp, sonraki iterasyona devam etmek için ise “continue” komutu kullanılır.

 

7) until Döngüsü

Sayıları birer birer azaltmak için kullanılabilir.

Döngüyü belirten kısım ( yani “until [ ŞART ]” şeklindeki ifadeler) aşağıdaki gibi olabilir.

 

8) Betikler ve Fonksiyonlar

Bash ile bir program hazırlanırken öncelikle “bash” in lokasyonu belirtilmelidir.

Betiği taşınabilir yapmak için betik başına “bash” lokasyonu için “env” değişkeni ile beraber aşağıdaki gibi kullanılabilir.

Bir betiği çalışabilir hale getirmek için chmod aracı kullanılabilir

Örnek bir betik (betik.sh) ve fonksiyon (yazdir) içeriği aşağıdaki gibidir. Fonksiyonu 3 parametre gönderilmiştir. “$1” ile belirtilen değişken betiğin ilk parametresidir. Betiğin çıktısı: <Merhaba Ahmet. Nasilsin?> olacaktır.

Not: Bash programlamada fonksiyon çağırılacaksa, önce fonksiyon tanımlanmalı, sonrasında çağırma işlemi gerçekleştirilmelidir.

Bu betiği çağırırken betik adı ve parametreleri verilebilir.

Paralel çalışacak şekilde bir fonksiyon aşağıdaki gibi hazırlanabilir.

Betiklerde en sık kullanılan ifadeler / kontroller aşağıdaki gibi listelenebilir.

  • Çalıştırılan komutun sonucu için “$?” kullanılabilir. Bu değer “0” ise komut doğru çalışmıştır. Eğer program düzgün çalışırsa 0, çalışmazsa pozitif rastgele bir değer (genellikle “1”) elde edilir.
  • Fonksiyonun veya betiğin aldığı paramtere adedi $# ile elde edilebilir.
  • Betiğin $0 ID’li ilk paramtresi o betiğin adıdır.
  • Betiğin aldığı parametreler $1, $2, $3,… olarak elde edilebilir.

Her betiğin bir kullanım dosyası bulunmalıdır. Örnek bir kullanım dosyası aşağıdaki gibi hazırlanabilir.

Betik içerisinde betiğe verilen parametre sayısı kontrol edilmelidir. 6 parametre bekleyen bir betikte kontrol aşağıdaki gibi gerçekleştirilebilir.

Betiğin parametrelerinin doğruluğu kontrol edilmelidir. Parametre olarak “-i”, “-n” ve “-o” alan bir betikte parametre kontrolü aşağıdaki gibi gerçekleştirilebilir.

Not: Parametre teyidi sırasında if/elif/else veya case/esac kontrolleri ile hatalı parametre de ekrana bastırılabilir. Bunun yanında Getops kullanılarak sıra bağımsız kontroller de sağlanabilir.

Çalıştırılacak harici araçların mevcudiyeti kontrol edilmelidir. Örnek:

Çıktıların yazılacağı dosyanın başka bir dosyanın üzerine yazmaması gerekebilir. Bu sebeple çıktıların yazılacağı dosyanın mevcudiyetini kontrol etmek gerekebilir. Kontrol aşağıdaki gibi gerçekleştirilebilir.

Bir değişkenin sadece fonksiyon içerisinde geçerli olması isteniyorsa, o değişken yerel (“local”) olarak belirtilmelidir. Aşağıdaki örnekte “sayi” değişkeni fonksiyon dışında geçersizdir.

Çalıştırılacak betikte hata kontrolü gerçekleştirme ihtiyacı olabilir. Böylece betiğin ilerleyii görülebilir ve hata tespiti kolaylaşabilir.

Not: Derlenen diller (C, C++), yorumlayıcı dillerden (Bash, Python,…) daha hızlıdır.

 

 

Yazarın Bilgileri

Ertuğrul BAŞARANOĞLU
Ertuğrul BAŞARANOĞLU

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kullanabileceğiniz HTLM etiketleri ve özellikleri: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Bu sayfada incelenen konulardan doğacak sorunlar kişinin kendi sorumluluğundadır.