23
Konuya ait anahtar kelimeler : Koşullu ifadeler, if-then-elif-else - Bölüm 2 Peki birden fazla koşulu "if" ile kontrol etmek için herzaman ayrı bir "if [ durum ]; then Komutlar.. ;fi" şeklinde komutlarımı yazacağız? Tabiki Hayır.. elif : Bu ifade bir kere başlamış olan "if" kontrolünün içerisinde yeni bir kontrol tanımlamaya yaramaktadır. Uzunca yazılsaydı "Else if [ durum ]" şeklinde olacaktı. Şimdi önceki derste oluşturduğumuz "if_büyükküçük.sh" dosyasında yazmış olduğumuz üç "if" kontrollerini tek bir "if" içerisinde yazalım. Dosya içeriğini 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. if [ $1 -eq $2 ] then echo "$1 ve $2 sayıları eşit sayılardır." elif [ $1 -gt $2 ] then echo "$1 sayısı $2 sayısından büyüktür." else echo "$1 sayısı $2 sayısından küçüktür." fi
Gördüğünüz gibi birçok fazla yazıdan kurtulduk. İlk kontrolde "Eğer ilk sayı ikinci sayıya eşitse", ikinci kontrolde(elif) ise "Eğer ilk sayı ikinci sayıdan büyükse" ve son olarak(else) ile "Yukarıdaki durumların hiçbirisi sağlanmadığı zaman" anlamına gelen kontroller gerçekleştirilmiştir. Gördüğünüz üzere kullanımı çok basit. Şimdi bir script dosyası hazırlayalım, öyle ki bu script dosyası çalıştığı anda kullanıcı adına bakarak o anki kullanıcın "Root" yada "Standart" bir kullanıcı olduğunu ekrana yazdırsın. Script dosyamızın adı "if_kullanıcı.sh" ve içeriği aşağıdaki gibi olsun.
[alax@alax script]$ cat if_kullanıcı.sh #!/bin/bash # if_kullanıcı.sh # Kullanıcı kontrolü scripti. if [ "$USER" == "root" ] then echo " Merhaba $USER ..." else echo "Üzgünüm $USER siz Root değilsiniz..." fi
Şimdi scripti test edelim. Öncelikle normal kullanıcı olarak test edelim.
[alax@alax script]$ chmod u+x if_kullanıcı.sh [alax@alax script]$ ./if_kullanıcı.sh Üzgünüm alax siz Root değilsiniz...
Şimdi aynı scripti "sudo" komutu ile Root yetkisinde çalıştıralım.
[alax@alax script]$ sudo ./if_kullanıcı.sh [sudo] password for alax: Merhaba root ...
Evet, şifremizi girdikten sonra script Root yetkisinde çalıştırıldı ve "$USER" değişkeni değeri "root" oldu, sonuç olarak scriptimiz çalıştı. Şimdi bir klasörün olup olmadığına bakalım. "if_klasörkontrol.sh" adında script dosyamızı aşağıdaki şekilde oluşturalım. Ayrıca birinci pozisyonda verilen değeri bir değişkene atayalım.
[alax@alax script]$ cat if_klasörkontrol.sh #!/bin/bash # if_klasörkontrol.sh # Belirtilen klasörün olup olmadığını # kontrol eden script. # $1 değişkenini bir değişkene atayalım. degisken="$1" if [ -d $degisken ] then echo "$degisken klasörü mevcuttur." else echo "$degisken klasörü mevcut değildir." fi
Şimdi "/usr/bin" klasörünün olup olmadığına bakalım.
[alax@alax script]$ chmod u+x if_klasörkontrol.sh [alax@alax script]$ ./if_klasörkontrol.sh /usr/bin /usr/bin klasörü mevcuttur. [alax@alax script]$ ./if_klasörkontrol.sh /usr/bin/klasörxyz /usr/bin/klasörxyz klasörü mevcut değildir. [alax@alax script]$
Şimdi "elif_örnek.sh" adında bir script dosyası hazırlayalım ve bu script dosyası sırası ile; 1- Girilen verilerin kaç tane olduğuna baksın ve eğer birden fazla pozisyonda veri girilmişse bir mesaj versin ve çıksın. 2- Dosyanın olup olmadığına baksın ve eğer dosya yok ise bir hata msajı ile çıkış yapsın. 3- Girilen dosya adına göre kontrol yaparak, dosya boyutunun sıfır olup olmadığına baksın ve bir mesaj versin. Dosya içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat elif_örnek.sh #!/bin/bash # elif_örnek.sh if [ $# -ne 1 ]; then echo "$0 örnek kullanım::: $0 dosya_adi " exit 1 elif [ ! -f "$1" ]; then echo "$1 diye bir dosya yok, lütfen geçerli bir dosya adı yazınız.." exit 2 elif [ -s "$1" ]; then echo "$1 Dosyası mevcuttur ve dosya boyutu sıfırdan büyüktür.." fi
Şimdi scriptimizi çalıştıralım.
[alax@alax script]$ chmod u+x elif_örnek.sh [alax@alax script]$ ./elif_örnek.sh dosya1 dosya2 dosya3 ./elif_örnek.sh örnek kullanım::: ./elif_örnek.sh dosya_adi [alax@alax script]$ ./elif_örnek.sh sedex sedex Dosyası mevcuttur ve dosya boyutu sıfırdan büyüktür.. [alax@alax script]$ ./elif_örnek.sh "bla bla bla" bla bla bla diye bir dosya yok, lütfen geçerli bir dosya adı yazınız.. [alax@alax script]$
Not 1: Eğer "then" ifadesini "if" in olduğu satırda kullanmak istiyorsanız, "if [ durum ]" ifadesinden sonra noktalı virgül kullanmalısınız. Not 2: Eğer bir durumun olumsuz olması, sağlanamaması durumunu kontrol etmek istiyorsak bunu, ilk köşeli parantezden sonra boşluk bıraktıktan sonra durum önüne ünlem işareti "!" getirerek yapabiliriz. "Elif" kontrolünde "$1" ifadesini çift tırnaklar arasında yazmamızın nedeni, girilen dosya adı yukarıdaki son örnekte de olduğu üzere çift tırnak arasında ve birden fazla kelimeden oluşuyor olabilir. Derslerimizin başındada söylediğimiz üzere "String türü verilerle çalışırken herzaman çift tırnak kullanınız." Tek satırda "IF" kullanımı: "IF" koşullu ifade işlemlerinizi tek bir satırda halledebilirsiniz. Bir durum hatasız olarak gerçekleşiyorsa: durum && komutlar.. Eğer durum gerçekleşmiyor ve bir hata ile karşılaşılıyor ise: durum || komutlar şeklinde kullanımlar ile komutlarınızı işleyebilirsiniz. Mesela çalışma klasörü içerisinde olmayan "kısa" adında bir klasör oluşturalım ve eğer klasör hatasız olarak oluşturuldu ise, "Klasör oluşturuldu.." diye bir mesaj gösterelim.
[alax@alax script]$ mkdir "kısa" && echo "Klasör oluşturuldu.." Klasör oluşturuldu.. [alax@alax script]$
Şimdi çalışma klasöründe olmayan "beyaz" adında klasörü silmeye çalışalım, eğer silme işlemi hata verirse "Klasör silme işlemi BAŞARISIZ.." diye bir mesaj verelim.
[alax@alax script]$ rmdir beyaz || echo "Klasör silme işlemi BAŞARISIZ.." rmdir: failed to remove ‘beyaz’: No such file or directory Klasör silme işlemi BAŞARISIZ.. [alax@alax script]$
Şimdi oluşturmuş olduğumuz "kısa" adındaki klasörü silelim ve eğer işlem başarılı ise "Başarılı.." yazalım.
[alax@alax script]$ rmdir kısa && echo "Başarılı.." Başarılı.. [alax@alax script]$
Evet bu şekilde tek satırda koşullu ifade kullanabilirsiniz. Bu kullanımı istediğiniz yerde kullanabilirsiniz. String : String demek, hertürlü alfanümerik ifadenin bir metin gibi ele alınmış hali demektir. Mesela "a", "abc...", "12s2d" yada "11122" ifadesi birer string ifadedir. Aksi belirtilmediği takdirde rakamlar ve sayılarda bir string ifade olarak ele alınabilir. Mesela cep telefonlarınız ile yazdığınız mesajları String ifade olarak düşünebilirsiniz. && - || : "&&" "ve", "||" ise "yada" anlamına gelmektedir. Koşullu bir ifade kontrolü sırasında aynı anda birden fazla koşulun sağlanmasına bakabilirsiniz. Mesela, iki ifadenin de sağlanması koşulu yada iki ifadeden birinin sağlanması durumu gibi. Şimdi girilen sayının 75 ile 100 arasında yada 3 ile bölünebilen bir sayı olup olmadığına bakalım. Bunun için "elif_sayı.sh" adında bir script dosyası oluşturalım ve içeriğini aşağıdaki şekilde düzenleyerek kaydedelim.
[alax@alax script]$ cat elif_sayı.sh #!/bin/bash # elif_sayı.sh if [[ ( "$(($1 % 3))" == "0" ) || ( ( $1 -gt 75 ) && ( $1 -lt 100 ) ) ]] then echo "$1 sayısı 3 ile bölünebiliyor yada 75 ile 100 arasında" else echo "$1 sayısı 3 ile bölünemiyor ve 75 ile 100 arasında değil.." fi
Yukarıdaki örnekte parantezlere dikkat ediniz. Ayrıca, 3 ile bölünebilme kontrolünde girilen sayı bir String ifade olarak işlenmiştir(çift tırnaklar arasında yazılarak) isterseniz sayısal ifadeleri bu şekilde de kullanabilirsiniz. Eğer kontrolünü yaptığınız ifadeyi String olarak ele alıyorsanız, eşitliğini de String olarak almalısınız. Eğer bir durum matematiksel ifadelerden oluşuyor ise, önceki derslerimizde anlattığımız üzere, parantezler içerisinde kullanmalısınız. Örneğin bir değişkene bir matematiksel işlemin sonucu atamak istiyorsak, bunu matematiksel işlemi iki adet normal parantez içerisinde yazarak yapabiliriz. degisken=$(5*5) # Yanlış kullanım. degisken=$((5*5)) # Doğru kullanım. degisken değeri 25 olacaktır. Eğer derslerimizi düzenli olarak takip ediyorsanız bu gibi durumlarda hata yapmamanız gerekmektedir. Buna benzer durumlar kodlama yaparken en sıkıcı ve zaman kaybına neden olan durumlar olduğu için parantez kullanımını, çift-tek tırnak kullanımını, değişken tanımla, matmatiksel ifadeler gibi durumları iyi öğrenmiş olmanız gerekmektedir. Bizler elimizden geldiğince bu konularda yaşanabilecek problemleri tahmin ederek sizlere bol bol örnekler sunuyoruz. Fakat pratik yapmamanız durumunda hiçbirşey öğrenmeyi beklemeyiniz. Herşey sizin elinizde... İç içe "IF" kullanımını sonraki derslerimizde örnekler üzerinde kullanacağız.