22
Konuya ait anahtar kelimeler : Koşullu ifadeler, if-then-else - Bölüm 1 Bu dersimizde programlama dillerinin olmazsa olmazı olan "Koşullu İfadeler" konusuna giriş yapıyoruz. Bir script yazdığınız zaman bazen, bazı durumları karşılaştırmak ve elde edilen verilere göre işlemin devam etmesini istediğimiz durumlar olabilir. Herhangi bir işlemin sonucuna göre ki bu kullanıcının verdiği bir yanıt ta olabilir, programın sonraki çalışma düzenini, o noktadan sonra nasıl bir yol izleyeceğini belirlemek için sorgulamalar yapabiliriz. IF : Türkçe olarak "Eğer" anlamına gelmektedir. THEN: Türkçe olarak "Sonra" anlamına gelmektedir. ELSE: Türkçe olarak "Başka, Aksi halde" anlamına gelmektedir. Önceki dersimizde herhangi bir scripti bizim yazdığımız değişkenler ile çalıştırmayı gömüştük. İlk değişken "$1" olarak işleme alınıyordu. Bu şu anlama geliyor. Script içerisinde kullanıcının yazdığı değerleri kullanmak için yazılan ilk değer "$1" ikinci değer "$2" vb.. şeklinde olmaktadır. ./script_adi.sh $1 $2 $3 ... $N şeklinde kullanım mevcuttur. Şimdi basit bir örnek yazalım. Öncelikle bir adet "yazdır.sh" adında bir script dosyası oluşturalım ve içeriğini aşağıdaki şekilde düzenleyerek kaydedelim. Scriptimizin mantığı şu şekilde olsun; - script yazılan üç pozisyondaki değerleri birer birer yazdırsın. - son olarak yazılan toplam pozisyondaki değerlerin kaç tane olduğunu yazdırsın.
[alax@alax ~]$ cdd [alax@alax script]$ > yazdır.sh [alax@alax script]$ nano yazdır.sh #!/bin/bash # yazdır.sh # Bu script verilen pozisyondaki değerleri # birer birer yazdıracaktır. clear # Ekranı temizle echo # boş bir satır echo "İlk pozisyondaki değer : $1" echo "İkinci pozisyondaki değer : $2" echo "Üçüncü pozisyondaki değer : $3" echo "Toplam yazılan değer sayısı: $#" [alax@alax script]$
Şimdi dosyamızı çalıştıralım.
[alax@alax script]$ chmod u+x yazdır.sh [alax@alax script]$ ./yazdır.sh bir 2 üç İlk pozisyondaki değer : bir İkinci pozisyondaki değer : 2 Üçüncü pozisyondaki değer : üç Toplam yazılan değer sayısı: 3 [alax@alax script]$
Evet değişkenlerin nasıl ele alındıklarını anlamış olmalısınız. if-then-else : En genel kullanım; if TEST-Komutlar ; then Yapılacak işlemler, komutlar... ; fi şeklinde yada if [ durum-komutlar ] then Yapılacak işlemler, komutlar.... else Yapılacak işlemler, komutlar... fi şeklinde olmaktadır. Şimdi bu komutların mantığını açıklayalım. if TEST-Komutlar yada if [ durum-komutlar ], bu iki yazım aynı anlama gelmektedir. Bunların anlamı; eğer "TEST-Komutlar" yazan yerdeki komutların sonucu başarılı ve hatasız olarak tamamlanmışsa yani "return status" geridönüş durumu sıfır "0" ise, yada eğer "if [ durum-komutlar ] " yazan yerde köşeli parentezler içerisindeki durum-komutların sonucu başarılı ve hatasız olarak tamamlanmışsa yani "return status" geridönüş durumu sıfır "0" ise, "then" kelimesinden sonraki komutları uygula anlamına gelmektedir. Bu kullanımlardan ikinci olan kullanım sık olarak kullanılmaktadır. "if [ durum-komutlar ]" kullanımı yazım olarak ve anlaşılma olarak ilk komuttan daha iyidir. Herzaman ikinci kullanımı kullanabillrsiniz. "[ durum-komutlar ]" bu bölümde herhangi bir komut olabilir, yada herhangi bir geri dönüşü olan bir durum olabilir. Şimdi bu durumları açıklayalım.
[ -a Dosya ]"Doğru", Dosya var.
[ -b Dosya ]"Doğru", Dosya var ve block-special tipinde, depolama birimi(hard disk vb..) üzerinde block-size(512kb-4Kb) biçiminde değere sahip dosya. .
[ -c Dosya ]"Doğru", Dosya var ve character-special tipinde.
[ -d Dosya ]"Doğru", Dosya var ve bir klasör.
[ -e Dosya ]"Doğru", Dosya var.
[ -f Dosya ]"Doğru", Dosya var ve normal dosya tipinde.
[ -g Dosya ]"Doğru", Dosya var ve SGID özelliği ayarlanmış.
[ -h Dosya ]"Doğru", Dosya var ve symbolic link(kısayol) tipinde.
[ -k Dosya ]"Doğru", Dosya var ve sticky bit özelliği ayarlanmış.
[ -p Dosya ]"Doğru", Dosya var ve pipe(boru) isminde.
[ -r Dosya ]"Doğru", Dosya var ve okunabilir.
[ -s Dosya ]"Doğru", Dosya var ve dosya boyutu sıfırdan büyük.
[ -t FD ]"Doğru", Dosya açıklaması açık, Terminal tarafından okunabilir.
[ -u Dosya ]"Doğru", Dosya var ve SUID bit değeri ayarlanmış.
[ -w Dosya ]"Doğru", Dosya var ve okunabilir.
[ -x Dosya ]"Doğru", Dosya var ve çalıştırılabilir.
[ -O Dosya ]"Doğru", Dosya var ve efektif kullanıcıya ait.
[ -G Dosya ]"Doğru", Dosya var ve efektif(etkin) guruba ait.
[ -L Dosya ]"Doğru", Dosya var ve symbolic link(kısayol) tipinde.
[ -N Dosya ]"Doğru", Dosya var ve son okunmasından sonra değiştirilmiş.
[ -S Dosya ]"Doğru", Dosya var ve bir soket.
[ Dosya1 -nt Dosya2 ]"Doğru", Dosya1 var Dosya2 yok yada son zamanlarda Dosya1 Dosya2 den daha fazla bir değişikliğe uğramış.
[ Dosya1 -ot Dosya2 ]"Doğru", Dosya2 var Dosya1 yok yada Dosya2 nin oluşturulma tarihi Dosya1 in oluşturulma tarihinden daha eski.
[ Dosya1 -ef Dosya2 ]"Doğru", Dosya1 ve Dosya2 aynı aygıt ve inode numarasına gönderim yapıyor.
[ -o OPSİYON_ADI ]"Doğru", OPSİYON_ADI aktif ise.
[ -z STRING ]"Doğru", STRING(harf/kelime/cümle/sayısal olmayan rakam) uzunluğu sıfıra eşit.
[ -n STRING ] yada [ STRING ]"Doğru", STRING uzunluğu sıfırdan farklı.
[ STRING1 == STRING2 ]"Doğru", STRING1 ile STRING2 aynı.
[ STRING1 != STRING2 ]"Doğru", STRING1 ile STRING2 aynı DEĞİL.
[ STRING1 < STRING2 ]"Doğru", STRING1 sıralamada STRING2 den önce geliyor.
[ STRING1 > STRING2 ]"Doğru", STRING1 sıralamada STRING2 den sonra geliyor.
[ Değer1 -eq Değer2 ] Değer1 ve Değer2 SAYISAL ifadeleri eşit.
[ Değer1 -ne Değer2 ] Değer1 ve Değer2 SAYISAL ifadeleri eşit DEĞİL.
[ Değer1 -lt Değer2 ] Değer1 Değer2 den küçük.
[ Değer1 -le Değer2 ] Değer1 Değer2 den küçük yada eşit.
[ Değer1 -gt Değer2 ] Değer1 Değer2 den büyük.
[ Değer1 -ge Değer2 ] Değer1 Değer2 den büyük yada eşit.
[ ! EXPR ] "Doğru", eğer EXPR değeri "False" olumsuz,yanlış ise.
[ ( EXPR ) ] EXPR değeri.
[ EXPR1 -a EXPR2 ] "Doğru", EXPR1 ve EXPR2 değerleri "True", Doğru ise.
[ EXPR1 -o EXPR2 ] "Doğru", EXPR1 ve EXPR2 değerlerinden bir tanesi "True", Doğru ise.
Şimdi bir kaç örnek yapalım. "if_tekçift.sh" adında bir script dosyası oluşturalım, script içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat if_tekçift.sh #!/bin/bash # if_tekçift.sh # Bu script girilen bir pozisyondaki sayının tek mi çift mi olduğunuz # ekrana yazdıracak. _degisken=$(($1 %2)) # Girilen sayının 2 ile modu alınıyor. if [ $_degisken -eq 0 ] # Eğer girilen sayının 2 ile modu 0 a eşit ise. then echo "$1 sayısı bir çift sayıdır." else # Üstteki durum sağlanmamış ise, sayının 2 ile modu 0 değil ise. echo "$1 sayısı bir çift sayı değildir." fi
Şimdi scripti test edelim.
[alax@alax script]$ chmod u+x if_tekçift.sh [alax@alax script]$ ./if_tekçift.sh 16 16 sayısı bir çift sayıdır. [alax@alax script]$ ./if_tekçift.sh 33 33 sayısı bir çift sayı değildir. [alax@alax script]$
Şimdi girilen iki sayının hangisinin daha büyük olduğunu gösteren bir script yazalım. Bunun için "if_büyükküçük.sh" adında bir script dosyası oluşturalım, içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat if_büyükküçük.sh #!/bin/bash # if_büyükküçük.sh # Bu script girilen iki sayıyı karşılaştırarak büyük,küçük ve eşit olma # durumlarını ekrana yazdıracak. # Burada iki sayının eşit olma durumuna bakılıyor. if [ $1 -eq $2 ] then echo "$1 ve $2 sayıları eşit sayılardır." fi # Burada ilk sayının ikinci sayıdan büyük olma durumuna bakılıyor. if [ $1 -gt $2 ] then echo "$1 sayısı $2 sayısından büyüktür." fi # Burada ilk sayının ikinci sayıdan küçük olma durumuna bakılıyor. if [ $1 -lt $2 ] then echo "$1 sayısı $2 sayısından küçüktür." fi
İki sayının karşılaştırılması durumu 3 farklı şekilde olabilir. Büyüktür, küçüktür yada eşittir. Bu yüzden örneğimizde üç farklı koşul, "if" ile kontrol edilmiştir. Şimdi scriptimizi test edelim.
[alax@alax script]$ chmod u+x if_büyükküçük.sh [alax@alax script]$ ./if_büyükküçük.sh 12 35 12 sayısı 35 sayısından küçüktür. [alax@alax script]$ ./if_büyükküçük.sh 12 11 12 sayısı 11 sayısından büyüktür. [alax@alax script]$ ./if_büyükküçük.sh 12 12 12 ve 12 sayıları eşit sayılardır. [alax@alax script]$
Şimdi "/etc/passwd" dosyasının var olup olmadığına bakan bir script hazırlayalım. "if_dosyakontrol.sh" adında bir script dosyası oluşturalım. İçeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat if_dosyakontrol.sh #!/bin/bash # if_dosyakontrol.sh # Bu script verilen dosya adını işleme alarak # dosyanın olup olmadığını kontrol edecek. if [ -f $1 ] then echo "$1 dosyası mevcuttur." else # Aksi halde echo "$1 dosyası yoktur." fi
Şimdi scriptimizi test edelim.
[alax@alax script]$ chmod u+x if_dosyakontrol.sh [alax@alax script]$ ./if_dosyakontrol.sh /etc/passwd /etc/passwd dosyası mevcuttur. [alax@alax script]$ ./if_dosyakontrol.sh /etc/passwd12345 /etc/passwd12345 dosyası yoktur. [alax@alax script]$
Not 1: "if [ durum ]" ifadesinde parantezler ile "durum" arasında en az bir boşluk bulunmalıdır. Bu yazım kuralını unutmayınız. Not 2: "-eq, -ne, -lt, -gt, -le, -ge" sırasıyla, "eşittir, eşit değildir, küçüktür, büyüktür, küçük eşittir, büyük eşittir" durumları sadece SAYISaL ifadeler için kullanılmaktadır. Eğer iki kelimeyi karşılaştırmak istiyorsanız yukarıda belirtilen "==" yada POSIX standartlarınca "=" değerlendirme koşulları kullanılmaktadır. İleriki derslerimizde bunların hepsiyle ilgili anlatımlar ve örnekler verilecektir. "İf" koşullu değerlendirmeye bir sonraki derste devam edeceğiz.