Gönderen Konu: UNIX SHELL SCRIPTING  (Okunma sayısı 1593 defa)

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #12 : 06 Haziran 2007, 09:58:59 »
Artık ilk programımızı yazmaya başlayabiliriz (nihayet dediginizi duyar gibi oluyorum )
Hemen hemen her programlama dilinin ilk örneği olan MERHABA DÜNYA yerine MERHABA UNIX yazısını ekrana basacak olan programımızı yazalım:

vi ilk_program diyerek boş bir dosya açalım.
i (insert) tusuna basarak ilk komutumuzu girebiliriz:

echo "Merhaba UNIX"

yazıp önce ESC tuşuna sonra da :wq! tuşlarına basıp programımızı kaydedelim.
çalıştırmak için ./ilk_program yazıp enter tusuna basınca Permission Denied uyarısı alırız. Sebebi programın ilk yazıldıgı için READ-ONLY olmasıdır.
chmod 755 ilk_program yazıp entera basarsak programı hangi user ile yazdıysa o usera her turlu hak verılır. diger user ya da gruplara ise okuma ve çalıştırma hakkı verilir.
çalıştırma hakkı verıldıkten sonra ./ilk_program dersek programın çıktısı:
Merhaba UNIX
şeklinde olur

****Bu arada ./ demek bulundugumuz dizini işaret eder. ../bir üst dizini işaret eder.

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #13 : 06 Haziran 2007, 09:59:17 »
şimdi 2. programımızda login oldugumuz username'e ait dizindeki (kullanıcının root dizini) geçici dosyaları silelim.
Diyelim ki admin kullanıcısıyla baglıyız ve admin kullanıcısının root dizinindeki geçici dosyaları sileceğiz.

vi temizle komutunu vererek temizle isimli bir dosya açılır.
i (insert, küçük i) tuşuna basılarak aşağıdaki komutlar verilir:

cd ~ --->kullanıcının home dizinine gider. (root ise / dizinine, baska kullanıcı ise /export/home/xxx dizinine gider)
/usr/bin/rm *tmp --->rm programını kullanarak kullanıcının home dizinindeki uzantısı tmp olan dosyaları siler.


****/usr/bin/rm *tmp yerine rm *tmp de diyebilirdik. Tüm komutlar /usr/bin dizini altında bulunur.

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #14 : 06 Haziran 2007, 09:59:31 »
Denetim yapıları

"if" ifadesi bir ifadenin doğru olup olmadığını denetlemektedir (Çıkış durum bilgisi 0 ise, başarılı demektir). Eğer, doğru ise "then" kısmı çalıştırılmaktadır:

if ....; then
....
elif ....; then
....
else
....
fi

Genelde, if ifadesi, içerisinde test adı verilen bir komut kullanılmaktadır. Bu komut katar karşılaştırılmasında, dosyanın var olup olmadığının denetlenmesinde, dosyanın okuma hakkı olup olmadığını denetlenmesinde ... kullanılmaktadır.

"test" komutu " [ ]" köşeli parantezler olarak yazılmaktadır. Burada kullanılan boşluklar önemlidir : Parantezlerden önce ve sonra boşluk olmasına dikkat ediniz.
Örnek:

[ -f "dosya" ] : "dosya" nın dosya olup olmadığını denetler.
[ -x "/bin/ls" ] : /bin/ls çalıştırılabilir bir dosya olup olmadığını denetler.
[ -n "$değisken" ] : $degisken'in herhangi bir değer taşıyıp taşımadığını denetlemektedir.
[ "$a" = "$b" ] : "$a" nın "$b" ye eşit olup olmadığını denetlemektedir.

ÖR:


if [ "$SHELL" = "/bin/bash" ]; then
echo "Giriş kabuğunuz bash (bourne again shell) dır."
else
echo "Giriş kabuğunuz bash değil $SHELL dir"
fi

***$SHELL değişkeni kullanılan kabuğun ismini içermektedir ve biz onu "/bin/bash" ile karşılaştırıyoruz.

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #15 : 06 Haziran 2007, 09:59:49 »
Kısayol işlemcileri (operatörleri)

C ile tanışık olan kişiler aşağıdaki yapıyı hemen benimseyeceklerdir:

[ -f "/etc/shadow" ] && echo "Bu bilgisayar gölge şifrelemesi (shadow passwords) kullanıyor."

&& ifadesi if-ifadesine kısayol gibi kullanılabilir. İfadenin sağ tarafı ancak sol tarafı doğru olduğunda çalıştırılmaktadır. Bunu VE (AND) gibi okuyabilirsiniz. Buna göre : "/etc/shadow dosyası var VE echo çalıştırılmaktadır".
VEYA (||) işlemcisi de vardır.
Örnek:
#!/bin/sh
eiletidizini=/var/spool/mail/james
[ -r "$eiletidizini" ] || { echo "$eiletidizini dizinini okuyamıyorum" ; exit 1; }
echo "$eiletidizini de eiletiniz var.:"
grep "^From " $eiletidizini

Bu kabuk betiği e-ileti dizinini okuyup okuyamadığna bakmaktadır. Eğer, okuyabiliyorsa, dosyadan "From" içeren satırları ekrana yazmaktadır. Eğer $eiletidizini dosyasını okuyamıyorsa, VEYA işlemcisi devreye girmektedir. Normal İngilizce'de program parçasını şu şekilde okuyoruz: "E-ileti dizini okunabilir veya çık.". Buradaki sorun, VEYA'dan sonra sadece bir komuta yer olmasıdır, ancak bizim birden fazla komuta gereksinimiz vardır:
-hata mesajı görüntüle
-programdan çık
Bu ikisini bir arada kullanabilmek için, bunları adı olmayan bir fonksiyon olarak grupluyoruz.
Herşeyi VE veya VEYA'lar kullanmadan, sadece if-ifadelerinden yararlanarak da gerçekleştirebilirsiniz, VE ve VEYA'lar biraz daha kullanışlıdır.

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #16 : 06 Haziran 2007, 10:00:04 »
case ifadesi bir katarı (kabuktaki * ve ? de kullanılabilir) birden fazla seçenekten birine uygun düşürmede kullanılmaktadır.

case ... in
...) burada birşeyler yap;;
esac

Bir örnek ele alalım. Bir dosyanın tipini fıle komutunu kullanarak öğrenebiliriz:
file lf.gz

sonuç:

lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix

Şimdi biz bu komutu sıkıştırılmış (uncompress, gzip ve zip) dosyaları açmka için bir kabuk programı yazımında kullanacağız:

#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
*) error "File $1 dosyası sıkıştırılmış bir dosya dgil.";;
esac

Eğer, dikkat ettiyseniz, burada özel bir değişken kullandık $1. Bu değişken, programa komut satırından verilen ilk parametreyi içermektedir.

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #17 : 06 Haziran 2007, 10:00:20 »
select ifadesi bash kabuğuna özgüdür ve etkileşimli kullanımlarda oldukça yarar sağlamaktadır. Kullanıcı, kendisine verilen bir listeden birini seçebilmektedir:

select var in ... ; do
break
done
.... şimdi $var kullanılabilir ....,

İşte örnek:

#!/bin/sh
echo "En favori işletim sisteminiz hangisidir?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Diğer"; do
break
done
echo "Seçiminiz $var dur."

Kabuk programı şunları gerçekleştirmektedir:

En favori işletim sisteminiz hangisidir?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Diğer
#? 1
Seçiminiz Linux dur."

Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
UNIX SHELL SCRIPTING
« Yanıtla #18 : 06 Haziran 2007, 10:00:37 »
DÖNGÜLER:

Kabukta kullanabileceğiniz döngü ifadeleri şunlardır:

while ...; do
....
done

while-döngüsü denetlenen ifade doğru olduğu sürece çalışılacaktır. Döngünün herhangi bir noktasından çıkmak için "break" kullanılabilir. Döngünün herhangi bir yerinde "continue" kullanılırsa, döngünün geriye kalanı çalıştırılmamakta ve onun yerine döngünün başına dönülmektedir.

for-döngüsü boşluklar ile ayrılmış katar listesini parametre olarak almaktadır ve bunları sırasıyla ilgili değişkene atamaktadır:

for değişken in ....; do
....
done

Aşağıdaki örnekte A dan C'ye kadar olan karakterler ekrana yazmaktadır:

#!/bin/sh
for degisken in A B C ; do
echo "değişkenin değeri $degisken"
done

Aşağıda daha kullanışlı bir örnek yer almaktdadır. Örnek, rpmgoster adını taşımakta ve parametre olarak verilen rpm paketleri hakkında bilgi elde etmekte ve ekranda göstermektedir:

#!/bin/sh
# RPM paketlerinin içeriğini listeler
# KULLANIM: rpmgoster rpmdosya1 rpmdosya2 ...
# ÖRNEK: rpmgoster /cdrom/RedHat/RPMS/*.rpm
for rpmpaketi in $*; do
if [ -r "$rpmpaketi" ];then
echo "=============== $rpmpaketi =============="
rpm -qi -p $rpmpaketi
else
echo "HATA: $rpmpaketi dosyası okunamadı."
fi
done

Yukarıdaki örnekte komut satırından verilen ve tüm parametreleri içeren $* değişkenini görüyorsunuz. Programı, rpmgoster openssh.rpm w3m.rpm webgrep.rpm olarak çalıştırırsak, $* değişkeni 3 parametreyi birlikte içerecektir: openssh.rpm, w3m.rpm ve webgrep.rpm.

GNU bash ayrıca until-döngüsüne de sahiptir, ancak while ve for döngüleri genellikle yeterli olmaktadır