Kabuk Programlama Nedir?




http://blog.chip.de/chip-linux-blog/wp-content/uploads/2006/12/linux_body_painting_kl.jpg

Kabuk Programlamaya girmeden önce kabuğun ne olduğunu anlamaya çalışalım. Kabuk sizin verdiğiniz komutları  yorumlayan ve genelde kullanıcının görsel ihtiyaclarını karşılayan bir programcıktır. Mesela eski dos’cuların severek kullandığı norton-commander (linux’taki klonu Midnigth Commander) bir kabuktur. Aynı zamanda dosun kabuğu command.com dur. Linux ve unix’te ise bir çok değisik kabuk mevcuttur. Bunların işlevi genelde aynıdır. Mesela yeni bir mail geldiğinde ekrana  “you have new mail!” yazar. Linux dünyasında en popüler kabuk ise bash dir. Tab tuşu ile tamamlama özelliğini sağlayan kabuk da bu kabuktur. Eğer hangi kabuğu kullanıdığınızı öğrenmek istiyorsanız:
finger kullanıcı adı yazarsınız… Aldığınız bilgilerin içinde shell:/bin/bash gibi birşey yazması gerekir. Burda bash yerine sh,ksh,tsh gibi şeyler yazabilir. Bunlar değişik kabuk türleridir.

Kabuk programlama diyince bu kabuğun programlanması değil bu kabuğa ait komutlarla, tek komutla yapılması imkansız işlerin bir dosyaya yazılmış komutlar yığınıyla yapılmaya çalışılmasıdır… Bu dosyalara ise genelde script adı verilir. Karışık mı geldi? O zaman örnek olarak dostaki bat dosyalarını verebilirim. Bunlar bi nevi kabuk programıdır. Şimdi örnek olarak ekrana klasik olarak bir merhaba dünya yazdıralım:

#!/bin/bash
echo “Merhaba Dünya!”

Şimdi bu programı herhangi bir editörle yazıp herhangi bir isimle kaydedelim uzantı koymanıza gerek yok. Daha sonra
chmod u+x dosyaadı
komutuyla dosyayı calıştırılabilir hale getirelim. Daha sonra ./dosyaadı yazarak programı çalıştıralım.Bende ki görünüşü şöyle:

[root@aldemir root/]./alo
Merhaba Dünya![root@aldemir root/]

Gelelim açıklamaya:
1. satıraki /bin/bash anlıyacağınız üzere hangi kabuğun kullanılacağını ve aşşağıdaki komutları hangi programın işleyeceğini belirler (burda bash,mesela /usr/bin/perl yazsaydık tabi o zaman bir perl scripti olarak yazılacaktı program. Bu da kabuk programlamadan çok daha farklı bir konu) . İkinci satır ise ekrana bir şeyler bastırma komutu. Burda daha fazla ileri gitmeden linux altındaki pipe ” | ” ve <> işaretlerine değinelim… Linux altında komutlarla işlem yapmak oldukça esnek bir iştir, mesela binlerce dosyanın bulunduğu bir dizinde ls çekip aynı zamanda çıktıyı bir sayfa geçtiğinde durdurmak istersek ne yapmalıyız? Birinci yol sayfalarca manual kastırıp sonuç elde edememe olasılığı ikinci yol ise iki komutu ardışık kullanmak… Karışıkmı geldi? O zaman şu komutu deniyelim:

ls -la | more

Bir satırda iki komut kullanmış olduk. Burdaki pipe işareti ls komutunun çıktısını more komutuna gönderecek more komutu ise doğası gereği aldığı girdiyi ekrana sayfa sayfa basacaktır. Bir örnek daha:

ps aux | grep httpd

Bu komutta o an çalışan prosesler arasında web server ‘ın olup olamdığını anlatır bize. Yani ps aux çektiğimizde o an çalışan programların çıktısını grep komutuna gönderir. Grep ise kendine gelen stringden httpd stringini içeren satırları bilginin içinden çıkarır ve ekrana basar. Gelelim < ve > işaretlerine. Bunlarda dosyadan alma ve dosyaya yönlendirme için kullanılır. Şu 1000 dosyalık dizini hatırlıyalım. Bu sefer
ls -la > dizinbilgi
Yazarsak çıktının ekran yerine dizinbilgi diye bir dosyaya saklandığını görebiliriz. Eğer daha önceden dizinbilgi dosyanız mevcutsa ve siz ona ekleme yapmak istiyorsanız
ls -la >> dizinbilgi
yazmanız yeterlidir, böylece çıktı dosyaya eklenecek içindeki veriler kaybolmıyacaktır.
Kabuk programlamada değişken de tanımlıyabilirsiniz. Diğer programlama dillerinde ki gibi burda tip belirtmenize (int,float gibi) gerek yoktur. Çünkü kabuk sizin değişkene atadığınız değeri direkman bir string olarak algılar. Şu örneğe bakalım:

#!/bin/bash
degisken=31
echo $degisken

Görüldüğü üzere burda degisken diye bir değişken oluşturduk ve buna  “1″ değerini atadık, ve değişkeni de başına bir “$” işareti koyarak çağırdık. Bu standart bir sentaksdır.

Dikkat ettiyseniz burda değişkeni atama sırasında araya hiç bir boşlu karakteri koymadım. Eğer eşitten önce bir boşluk koysaydım kabuk “degisken” diye bir komut arıyacaktı ama bulamayıp hata verecekti. Sonra boşluk koysaydım bu sefer “31″ diye bir komut arıyacaktı. Değişken isimleri kullanırken boşluk ve alfabe harici karakterleri  kullanamazsınız (underscore “_” hariç).

eğer matematiksel işlem yapılacaksa: alo diye bir değişkene “1″ sayısı atanmış olsun.  alo=`expr ${alo} + 1` yazarak sayıyı bir arttırabiliriz

Şimdi sıradaki örneğe bakalım:

#!/bin/bash
degisken=”Hayatin anlami”
echo “$degisken?”
read cevap
echo “$degisken $cevap”

Bu kodda ise değişkene hayatın anlamı katarı atanıyor. Daha sonra ekrana “Hayatin anlami?” sorusu çıkıyor, kullanıcı herhangi birşeyler girip ENTER a basınca değer cevap değişkenine atılıp iki değer ardışık olarak basılıyor. Programın çıktısı şuna benzer bişey:

[root@aldemir root/]./anlam
Hayatin anlami?
animsiyamadim
Hayatin anlami animsiyamadim[root@aldemir root/]

Herhangi bir komutun çıktısını bir deiğşkene atamak mümkündür:

tarih=$( date )

Diğer dillerde olduğu gibi kabuk programlama sırasında da fonksiyonlar tanımlanabilir. Mesela:

#!/bin/bash
mail_at ()  {
df > durum
mail -s “Durum” root@localhost < durum
rm -f durum
}
mail_at

Bu program ekrana çıktı vermiyecektir ama çalıştırdıktan sonra diskinizin durumu gösteren bir mail alacaksınız. mail_at () satırı ile fonksiyon tanımlanmış oluyor. Fonksiyonun içinde ise sırasıyla şunalr olup bitmekte:
df > durum ile df komutunun çıktısı durum diye bir dosyaya aktarılıyor. mail… ile başlıyan satırda ilgili bilgisayarın root hesabına Durum konulu bir mail atılıyor, body kısmına ise durum dosyasını içindekiler yollanıyor. Son satırdaki mail_at komutu ile fonksiyon çağırılıyor.
Gelelim önemli komutlardan “test” e. “test” komutu ile iki değişkenin gerekli durumu (eşitlik,büyüklük,küçüklük vs. vs.) sağlayıp sağlamadığını kontrol edebiliriz. İfadenin doğru olması durumunda “0″ yanlış olması durumunda “1″ değerini $? değişkenine atar.Mesela:

[root@aldemir root/]test 100 -eq 100
[root@aldemir root/]echo $?
0[root@aldemir root/]

Sırasıyla test komutunda kullanabileceğiniz karşılaştırma parametreleri ise şunlardır:
-eq  eşit
-ne  eşit değil
-gt    büyüktür
-ge  büyük veya eşit
-lt      küçüktür
-le    küçük veya eşit
test komutu ile aynı zamanda dosyaların özelliklerinide inceliyebiliriz. Önce parametrelere bakalım:
-d  dosya bir dizinmi?
-f    normal bir dosyamı?
-s   dosya uzunluğu sıfırdan farklımı
-w   yazılabilirmi?
-x    çalıştırılablirmi?
-e    dosya mevcutmu?
Hemen bir örnek yapalım:

[root@aldemir root/]ls -l
drwxr-xr-x 2 root root 5120 Apr 11 17:13 gizli/
-rwxr-xr-x 1 root root 313 Apr 11 17:13 çalıştır_yoksa*
-rw-r–r– 1 root root 1244 Apr 11 17:13 okuyalim.txt
-rwxr-xr-x 1 root root 7048 Apr 11 17:13 linkler*
[root@aldemir root/]

Şimdi bu dosyaları test komutu ile inceliyelim:

#!/bin/bash
test -d gizli
echo “gizli dizini:  $?”

Çıktı şöyle olacaktır:

[root@aldemir root/]./dene
gizli dizini: 0[root@aldemir root/]

Diğer bir gösterim tarzıda şöyledir:[ -d gizli] Bu gösterim birebir test -d gizli demekle aynı şeydir.
Şimdi bunca geyiği niye diyenler vardır muhakkak. Amacım her programcını göz bebği :) if komutuna gelebilmekti. Kabuk programlamada if komutu mevcuttur. if komutu yanında elif ve else komutlarıda mevcuttur. Ayrıca acılan her if fi yazarak bitirilmelidir. Böylece c/c++ daki gibi süslü parantezler yerine fi yazdımız yer if  ifadesinin sonunu belirler. Bir if-elif-else-fi ifadesinin sentaxı ise şöyledir:

if [ komut ] ; then

şudur
budur

elif [komut] ; then

falan
filan

else

yaz
boz

fi

if komutu kullanırken illaki elif ve else i kullanacaksınız diye bir kaide yok! if kullanırken önemli olan if []; then ve fi

Hemen pekişmesi açısından bir if örneği yapalım:

if [ "#(USER)" != "root " ]; then
echo “Kusura bakma $(USER),bu programi calistirman icin buyuyup root olman lazim! :) ) ”
exit 1
fi
echo “Selam root abim :)

Bu program parçacığında ise bir sistem değişkeni kullanılmış. $(USER) değişkeni o anki kulllanıcının login name ini tutar. $(PATH) değişkeni default pathleri tanımlar. $(HOME) değişkeni ise kullanıcının ev dizinini tutar. Bu kodda userın login name i root ile karşılaştrılıyor.Eğer kullanıcı root değilse if ifadesi içine giryor program
ve kullanıcıya root olmadığını hatırlatıp programdan çıkıyor. kullanıcının root olması halinde ise kullanıcıyı selamlıyor.
Gelelim döngülere. Kabuk programlamada for,while döngüleride mevcuttur. “for” un kullanımı diğer dillere oranla çok daha değişiktir. Sentaksı şöyledir:

for <I>değişken</I> in <I>liste</I>
do
komut1
komut2
done

While döngüleri ise for döngüsüne benzer ama döngüyü işletmesi için gerekli koşulun sağlanması gerekir.Sentaksı şöyledir:

while <I>koşul</I>
do
komut1
komut2
done

Şimdide while’la yapılmış basit bir sayaç örneği verelim:

i=1
while [ ${i} -le 5 ]
do
echo ${i}
i=`expr ${i} + 1`
done

Bu küçük script anlaşıldığı üzere 1′den 5′e kadar sayan bir sayaç. While döngüsü “i” değişkeninin 5′den küçük ve 5′e eşit olması durumunda içindeki komutları işletiyor. Oldukca basit bir script…

Bu yazıda kabuk programlamaya giriş yapmaya çalıştım. Kabuk programlama c,java yada perl kadar güçlü bir dil değil üstelik kullanım amacı daha çok sistem denetimi ve yönetimi amaçlı. Yani çıkıp kabuk programlamayla satranç programı yazamazsınız. Belki şimdi inat edip birisi yazar :) ) ama kullanışlı olmaz. Daha öncede dediğim gibi linux yada unix ***x bir sistemde yadığınız shell scriptlerde o makinede var olan tüm komutları kullanabilirsiniz. Umarım linux ile uğraşan arkadaşlara bu yazı faydalı olmuştur.

Popularity: unranked [?]




1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
  1. Henüz yorum yapılmamış

 

Sitemizi N/A kişi takip ediyor.Aşağıdaki kutucuğa e-posta adresinizi girin sitemize yeni eklenen içerikten haberiniz olsun...

Sitemize üye olduktan sonra, e-posta adresinize bir onay maili gelecek. O maili onaylamazsanız, üyeliğiniz tamamlanmaz. 

RSS okuyucu ile takip edin...