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

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:
İfade | Doğ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 |
Ö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:
İfade | Doğ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 |
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:
Karakter | Anlam |
? | 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 |
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.

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.