Shell Script #9 – Karar Yapıları (if, elif, else)

Shell script’te karar yapıları, belirli koşullar sağlandığında belirli komutları çalıştırabilmenizi sağlar. Bu sayede script’lerinize, koşullara göre farklı davranışlar sergiletebilirsiniz.

Kod örneklerini GitHub reposunda bulabilirsiniz.

Örnek kullanımı şu şekildedir:

if koşul
then
     #komutlar
elif koşul2
then
     #komutlar
else
    #komutlar
fi

if Örneği

Örnek script:

[root@gnuadmin ShellScripting101]# cat 15-if_ornekleri.sh 
#! /bin/bash

#isim değişkeninin değerine göre bir komut çalıştıralım:

isim="Khabib"

if [[ "$isim" = "Khabib" ]]
then
	echo "I'm gonna smash your boy."
fi
[root@gnuadmin ShellScripting101]# ./15-if_ornekleri.sh 
I'm gonna smash your boy.

Burada dikkat etmemiz gereken bazı noktalar var:

  • “if” ifadesi sonrasında, koşulumuzu köşeli parantezler arasına aldık. Ancak köşeli parantez ile “if” arasında bir boşluk var. Köşeli parantezlerin içindeki ifadenin de öncesinde ve sonrasında boşluk var. Bu boşluklar olmak zorundadır.
  • Değişkenleri ve kıyaslama yapılacak değerleri çift tırnak işaretlerine almalıyız. Aksi durumda, değişkenlerin değerlerinde boşluk olması ya da değişkenlerin değerinin “null” olması durumunda problem yaşarız.

Aşağıda, bu iki duruma dikkat edilmediğinde alınan hatalar görülmektedir:

[root@gnuadmin ShellScripting101]# ./15-if_ornekleri.sh 
./15-if_ornekleri.sh: line 9: [: too many arguments
[root@gnuadmin ShellScripting101]# ./15-if_ornekleri.sh 
./15-if_ornekleri.sh: line 9: if[ Khabib = Khabib ]: command not found
./15-if_ornekleri.sh: line 10: syntax error near unexpected token `then'
./15-if_ornekleri.sh: line 10: `then'

if ifadelerinizi yazarken, tek ya da çift köşeli parantezler kullanabilirsiniz. Konu ile ilgili buradan bazı bilgiler edinebilirsiniz.

if-else Örneği

Beklediğiniz koşul(lar) sağlanmadığında çalışmasını istediğiniz kod bloğunu, else kısmında belirtirsiniz.

Örnek script:

isim="Not Khabib"

if [[ "$isim" = "Khabib" ]]
then
        echo "I'm gonna smash your boy."
else
        echo "What's your name again?!?"
fi

“isim” değişkeninin değeri “Khabib” olmadığı için, ekrana “What’s your name again?!?” ifadesi yazdırılacaktır.

if-elif-else Örneği

Belirttiğiniz bir koşul sağlanmadığında, farklı bir koşulu denemek isterseniz; bu koşulları elif ile belirtebilirsiniz.

Örnek script:

#if-elif-else örneği:

isim="Hamilton"

if [[ "$isim" = "Hamilton" ]]
then
	echo "Leave it to me, Bono..."
elif [[ "$isim" = "Bottas" ]]
then
	echo "To whom it may concern..."
elif [[ "$isim" = "Ricciardo" ]]
then
	echo "Shooooeeeeyyy!!!"
else
	echo "Mazepin sucks."
fi

“isim” değişkeninin değerine göre, çıktımız değişecektir. Bunu denemek için, isim değerini kullanıcıdan alalım ve çıktıyı inceleyelim:

#isim değeri, kullanıcıdan alınacak:

printf "Bugün kim olmak istersin?: "
read isim

if [[ "$isim" = "Hamilton" ]]
then
	echo "Leave it to me, Bono..."
elif [[ "$isim" = "Bottas" ]]
then
	echo "To whom it may concern..."
elif [[ "$isim" = "Ricciardo" ]]
then
	echo "Shooooeeeeyyy!!!"
else
	echo "Mazepin sucks."
fi
Shell Script if örneği
Shell Script if örneği

Komuta Bağlı Koşullar

Scrpt’lerinizde, bir komut çalıştırıp bu komutun başarılı olma durumuna göre de aksiyon alabilirsiniz.

Aşağıdaki script, “/etc/passwd” dosyasında “root” kelimesini arar ve bu aramanın sonucuna göre farklı şekilde çalışır:

# /etc/passwd dosyasında "root" kelimesini ara

if grep root /etc/passwd > /dev/null
then
	echo "root bulundu"
else
	echo "dosyada root yok"
fi

grep çıktısını “/dev/null”a yönlendirmemizin sebebi, arama sonucunun STDOUT’a düşmesini engellemek.

Numeric ve String Değerlerin Kıyaslanması

Shell script’lerde sayısal değerlerin ve metinlerin karşılaştırılmasında farklılıklar vardır. Aşağıdaki tabloda, sayısal kıyaslamaları nasıl yapacağınız belirtilmiştir:

İfadeDoğruluk Durumu
[ $sayi1 -eq $sayi2 ]sayi1 ile sayi2 eşitse (equal)
[ $sayi1 -ne $sayi2 ]sayi1 ile sayi2 eşit değilse (not equal)
[ $sayi1 -lt $sayi2 ]sayi1, sayi2’den küçükse (lower than)
[ $sayi1 -gt $sayi2 ]sayi1, sayi2’den büyükse (greater than)
[ $sayi1 -le $sayi2 ]sayi1 küçük eşit (less or equal) sayi2
[ $sayi1 -ge $sayi2 ]sayi1 büyük eşit (greater or equal) sayi2
Shell script’lerde sayıların kıyaslanması

Örnek script:

#sayısal değerlerin karşılaştırılması

sayi1=35
sayi2=28

if [[ $sayi1 -gt $sayi2 ]]
then
	echo $sayi1 büyüktür $sayi2
elif [[ $sayi1 -lt $sayi2 ]]
then
	echo $sayi1 küçüktür $sayi2
else
	echo $sayi1 eşittir $sayi2
fi

Bu tabloda ise, string değerlerin nasıl karşılaştırıldığını görüyoruz:

İfadeDoğruluk Durumu
[ $str1 = $str2 ]str1 ile str2 eşitse
[ $str1 != $str2 ]str1 ile str2 eşit değilse
[ $str1 < $str2 ]str1, sözlükte öndeyse
[ $str1 > $str2 ]str2, sözlükte öndeyse
[ -z $str2 ]str1, bir değer tutmuyorsa
[ -n = $str2 ]str1, bir ya da daha fazla karakter içeriyorsa
Shell script’lerde stringlerin kıyaslanması

Pattern’a Göre Kıyaslama

Bazen, elinizdeki değerleri belirli bir pattern’la kıyaslamak isteyebilirsiniz. Böyle durumlarda, aşağıdaki tablo size yardımcı olacaktır:

KarakterAnlam
?Tek bir karakterle eşleşme
[ ]Verilen set içerisinden bir karakterle eşleşme
*Sıfır ya da daha fazla karakterle eşleşme
?(pat1|pat2|…|patn)Pattern’lardan sıfır ya da bir tanesiyle eşleşme
@(pat1|pat2|…|patn)Pattern’lardan sadece biriyle eşleşme
*(pat1|pat2|…|patn)Pattern’lardan sıfır, bir ya da daha fazlasıyla eşleşme
+(pat1|pat2|…|patn)Pattern’lardan bir ya da daha fazlasıyla eşleşme
!(pat1|pat2|…|patn)Belirtilen pattern’lar haricindeki bir pattern’la eşleşme
Shell script’lerde pattern kıyaslaması

Dikkat edilmesi gereken en önemli noktalardan biri, kıyaslanacak pattern’lar tırnak işaretleri içine alınmamalıdır.

İçinde bulunduğumuz ayın kaç gün olduğunu gösteren bir shell script yazalım:

#! /bin/bash

#Konu anlatımı: https://alisezisli.com.tr/shell-script-9-karar-yapilari 


#Pattern'lar üzerinden kıyaslama örneği:
#Bu script, içinde bulunulan ayın kaç günü olduğunu gösterir:

#Command substitution kullanarak, ay değerini alalım
#date +%m sayesinde, kaçıncı ayda olduğumuzu çift basamaklı bir 
#sayı olarak öğreniyoruz: 01, 07, 10, 12 gibi:

ay=$(date +%m)

#Şubat ayının özel durumunu belirtelim:
if [[ ${ay} -eq 2 ]]
then
	echo "Şubat ayında 28 gün vardır. Artık yıllarda 29 çeker."
#30 günlük aylar için bir pattern yazalım:
elif [[ ${ay} = @(04|06|09|11) ]]
then
	echo "Bu ayda 30 gün vardır."
else
	echo "Bu ayda 31 gün vardır."
fi

Çalıştırdığımızda, bulunduğumuz ayda kaç gün bulunduğunu bize gösterecektir.

Shell script'lerde pattern kıyaslaması
Shell script’lerde pattern kıyaslaması

VE, VEYA, DEĞİL (AND, OR, NOT) Operatörleri

Bu ifadelerin ne anlama geldiğine değinmek istemiyorum. Buralara kadar geldiyseniz zaten bildiğiniz şeylerdir diye düşünüyorum, temel mantık. Shell script’lerde ise AND için “&&“, OR için “||” ve NOT için “!” karakterleri kullanılır.

Aşağıdaki örneği inceleyelim:

# AND OR NOT örnekleri

# AND örneği:

yas=30

if [[ (${yas} -gt 18) && (${yas} -lt 70) ]]
then
	echo "Reşit olabilirsin ama emekli olamazsın."
fi



# OR örneği:

dosya="/bin/bash"

if [[ "${dosya}" = "/bin/bash" || "${dosya}" = "/bin/sh" ]]
then
	echo "Hâlâ umut var."
fi


# NOT örneği:

if [[ !(-f "/etc/httpd.conf") ]]
then
	echo "/etc/httpd.conf dosyası bulunamadı."
fi

İlk kısım; “yas” değişkeninin değeri 18’den büyükse ve 70’ten küçükse çalışır. İkinci kısım; “dosya” değişkenin değeri “/bin/bash” veya “/bin/sh” ise çalışır. Üçüncü kısım; “/etc/httpd.conf” dosyası bulunamazsa çalışır.

Bir sonraki yazımda, “case” konusuna değineceğim.