bu site sistemden silinmistir lutfen kodu kaldiriniz | backlink.r10.net Kabuk Programlama (Bash) - 2
+ ForumCambazi.info » Bilgisayar » Linüx (Moderatör: gavaz)
 Kabuk Programlama (Bash) - 2

Kullanıcı Adı: Beni Hatırla?
Şifre:
Sayfa: [1]   Yukarı git
Konu: Kabuk Programlama (Bash) - 2  (Okunma Sayısı 111 defa) Seçenekler Arama
« : 07 Temmuz 2008, 15:16:16 »
*

Üye Grubu : Onbaşı
Yaş : 19
Nerden :
Kayıt Tarihi : 07 Temmuz 2008, 13:54:44
Üye No : 8763
Mesaj Sayısı : 207
Rep Gücü : Rep Puanı: 0
Offline Offline

Üyelik Bilgileri
Kabuk Programlama (Bash) - 2

Merhaba
Bu derste Bash kabuğunda betik yazarken kullanabileceğimiz kontrol yapılarından bir kaçına değineceğim. Bash kabuğu gerçek programlama dillerinde bulunan if/if-else switch/case kontrollerini ve for while gibi döngüleri destekler. C Pascal gibi dillerde çalıştıysanız işiniz biraz daha kolay zira kullanım alanı ve mantık aynı. Önce if/if-else yapısı ile başlayalım:

if / if-else Yapısı:
Kullanımı diğer dillerde olduğu gibi

if koşul
koşul gerçeklenmişse çalışacak kod

Yalnız sözdizimi C programcıları için biraz yabancı olabilir. Herşeyden önce kontrol yapılarının bloklarının kapanışları ve karşılaştırma operatörleri biraz farklı. Mesela çok basit bir if örneği yazacak olursak


root@gnu [17:13:53] # cat current.sh
#/bin/bash

bir=1
iki=2

if [ $bir -lt $iki ] then
echo bir > iki
fi

exit
root@gnu [17:14:30] # ./current.sh
bir > iki


Gördüğünüz gibi gerçekliğini denediğimiz koşul köşeli paranaaaler arasında ve blok kapanışı da farklı. Bu arada kısa bir not köşeli paranaaaleri kullanmadan da karşılaştırmalar yapabiliriz. Bunun için test deyimi kullanılır. Yukarıdaki kodun test ile yazılmış hali aşağıdadır.


if test $bir -lt $iki then
echo bir > iki
fi


Tekrar sözdizimine dönecek olursakif yapısının şablonunu Bashe göre tekrar yazalım:

if koşul then
# Çalışacak Kod
elif koşul then
# Çalışacak Kod
fi

ifin bloğunu kapatan anahtar sözcüğün ifin tersi olduğuna dikkat aynı kural case (o da esac anahtar sözcüğü ile kapanır) yapısında da geçerli.

Burada kullanabileceğimiz operatörlerden bazıları şunlar:


-eq : eşit (equal)
-ne : eşit değil (not equal)
-lt : küçük (less than)
-le : küçük eşit (less than or equal to)
-gt : büyük (greater than)
-ge : büyük eşit (greater than or equal to)


Not: Bash betiklerindeki karşılaştırmalarda < > ve = gibi operatörleri de kullanabilirsiniz ancak bunlar diziler için kullanılırlar (mesela iki karakter dizisinin karşılaştırılmasında).

Bu operatörlerle ilgili bir örnek daha sanırım yeterli olacaktır. Betiğimizin parametre olarak aldığı dosyanın satır sayısını ekrana yazsın ( biri wc -l < current.sh mi dedi  ) Tabii ki daha kolay sonuca ulaşabiliriz ancak bu sadece bir örnek


root@gnu [18:32:06] # cat -n current.sh
1 #/bin/bash
2
3 if [ $# -ne 1 ] then
4 echo "Hatali parametre"
5 echo "Kullanim: $0 dosya_adi"
6 exit
7 fi
8
9 echo $1 adli dosya `wc -l < $1` satir
10
11 exit
12
root@gnu [18:32:41] # ./current.sh current.sh
current.sh adli dosya 12 satir


Geçen dersten hatırlarsanız $# kabuk değişkeni betiğe gelen parametre sayısını tutuyordu

Not: Eğer betiğinizde bir hata varsa Bash kabuğuna -x parametresini göndererek yapılan işlemleri ve çalıştırılan komutları adım adım görebilirsiniz:


root@gnu [18:43:29] # cat current.sh
#/bin/bash -x

if [ $# = 1 ] then
echo "Hatali parametre"
echo "Kullanim: $0 dosya_adi"
exit
fi

echo $1 adli dosya `wc -l < $1` satir

exit

root@gnu [18:43:32] # ./current.sh current.sh
+ [ 1 = 1 ]
++ wc -l
+ echo current.sh adli dosya 12 satir
current.sh adli dosya 12 satir
+ exit


Bu şekilde özellikle ayırma (parsing) hataları çok kolay bulunuyor.

case/esac Yapısı:

case/esac de tıpkı C ve Pascalda olduğu gibi olması muhtemel durumları ele almak için kullanılır. Genel yapısı aşağıdaki şekildedir:


case seçenek in
durum_1)
komutlar
 
durum_2)
komutlar
 
durum_3)
komutlar
 
*)
komutlar
esac


Burada tahmin edeceğiniz gibi çeşitli durumlarda aradığımız seçenekin gerçekleşip gerçekleşmediğine bakıyoruz. Yukarıda yazılan 3 durumda da aradığımız koşulun olmaması durumunda *) ile belirtilen kısımdaki kod çalıştırılır. Sanırım bir örnekle daha rahat anlaşılacaktır. Aşağıdaki örnekte kullanıcıdan bir dosya adı alıp bu dosyanın çeşitli özelliklerini yazdıralım yazdırılacak özellikler de bir menüden seçilsin. Ancak bundan önce kodda kullanacağımız bir kaç özelliği söylemekte fayda var.

Aşağıdaki operatörler sorunun cevabının evet olduğu yerlerde doğru değerini üretir.

-a dosya : Dosya var mı
-b dosya : Dosya var mı ve blok özel dosyası mı (aşağıdaki nota bakınız)
-c dosya : Dosya var mı ve karakter özel dosyası mı (aşağıdaki nota bakınız)
-d dosya : Dosya var mı ve bir dizin mi
-e dosya : Dosya var mı
-f dosya : Dosya var mı ve sıradan bir dosya mı
 


Bu gibi bir çok kontrol operatörü var diğerleri için bash kabuğunun yardım dosyalarına bakmanızı tavsiye ederim

Not: "block special file" ve "character special file" kelimelerinin çevirilerinin sırıttığının farkındayım ve çeviri önerilerinizi bekliyorum. Bunları açıklamak gerekirse blok özel dosyalar taşıdıkları veriye rastgele erişim yapabildiğimiz dosyalardır ve bunlara örnek olarak ana bellek ve sabit diskler verilebilir. Karakter özel dosyalar ise çoğunlukla girdi/çıktı işlemlerinde kullanılan ve sadece veri alıp yolladığımız -yani rastgele erişimin sözkonusu olmadığı- dosyalardır. Bunlara ise USB girişleri ve konsol örnek verilebilir. Daha ayrıntılı bir liste için:


root@slackware [20:11:37] # cat /proc/devices
Character devices:
1 mem
2 pty
3 ttyp
4 ttyS
5 cua
7 vcs
10 misc
14 sound
29 fb
.


komutunu kullanabilir ve devices dosyasını inceleyebilirsiniz. Artık örneğimize dönebiliriz (örneğin ne yaptığını hatırlıyoruz değil mi  )


#/bin/bash
# -x

echo "Dosya Adi:"
read dosya

echo : $dosya adli dosya hakkinda bilmek istedikleriniz

# Seçenekleri ekrana yaz ve kullaniciya sor
echo "1) Ben yazdim ama bu dosya var mi"
echo "2) Bu dosyadaki haklarim nelerdir"
echo "3) Ayni isimde baska neler var"
echo "4) Sil sen bu dosyayi isim yok onla"
echo "Seçiminiz: "
read secenek

case $secenek in
1)
if [ -a $dosya ] then
echo "Evet var"
else
echo "Hayir yok ama yaratirizz "
fi
 
2)
echo "Haklariniz: "
if [ -r $dosya ] then
echo -n "r (okuma) "
fiif [ -w $dosya ] then
echo -n "w (yazma) "
fiif [ -x $dosya ] then
echo "x (calistirma) "
fi
 
3)
echo \"$dosya\" adinda `locate -i $dosya|wc -l` tane daha dosya var
 
4)
rm -i $dosya
 
*)
echo "Hatali seçenek "
esac

exit



Örnek bir çıktı ise


root@slackware [22:59:14] # ./shell.sh
Dosya Adi:
core
: core adli dosya hakkinda bilmek istedikleriniz
1) Ben yazdim ama bu dosya var mi
2) Bu dosyadaki haklarim nelerdir
3) Ayni isimde baska neler var
4) Sil sen bu dosyayi isim yok onla
Seçiminiz:
3
"core" adinda 2231 tane daha dosya var



case/esac yapısıyla ilgili son bir örnek bu örneğimiz ise calc adında olsun ve komut satırından girilen basit aritmetik işlemleri (3+5 7*8 gibi 2 sayı ve bir operatörden oluşan) yapsın.


#/bin/bash

if [ $# -ne 3 ] then
echo hatali parametre
echo kullanim: $0 sayi operator sayi
exit
fi

case $2 in
+)
echo sonuc: `expr $1 + $3`
 
-)
echo sonuc: `expr $1 - $3`
 
/)
echo sonuc: `expr $1 / $3`
 
*)
echo sonuc: `expr $1 \* $3`
 
esac

exit


Yalnız bu betikte dikkat edilmesi gereken iki nokta var: Birincisi çarpma operatörünün Bash kabuğunda özel bir anlamı vardır ve komut satırı parametrelerinin elde edilmesinde kullanılır. Bu yüzden çarpma işlemi yaparken betiğe "3 \* 4" gibi bir parametre vermelisiniz (hatırlarsanız ters bölü karakteri özel karakterlerin anlamlarını yitirmesine yarıyordu). İkincisi ise bir bug (böcük) case/esac yapısında en sondaki -düşündüklerimizin dışındaki durumları ele alan- *) kısmı çarpma işlemi ile çakışıyor. Yani operatör yerine herhangi bir değer girmeniz halinde kendince bir çıktı üretecektir. Bu konuda aklıma gelen bir şey yok önerilerinizi bekliyorum.

Örnek bir çıktı


root@slackware [20:22:05] # ./calc.sh 3 + 99
sonuc: 102


Şimdilik benden bu kadar. Bir sonraki derste görüşmek üzere.

Barış DEMİRAY
Logged

-VaN HeLsİnG-
Sayfa: [1]   Yukarı git
 
Gitmek istediğiniz yer:  

| Arşiv | Wap | Wap2 | Wap Forum | XML | Rss
MySQL ile Güçlendirildi PHP ile Güçlendirildi Powered by SMF 1.1.5 | SMF © 2006, Simple Machines LLC
Hersey
Tasarım: ForumCambazi
XHTML 1.0 Geçerli! CSS Geçerli!


forumcambazi.info
Sitemize üye olarak hizmetlerimizden en iyi şekilde yararlanabilirsiniz.
10 saniyede üye olmak için tıklayın.

kapat