if konusundan hatırlarsınız; ilk kodumuz if ile başlıyordu. Daha sonra gerekiyorsa 'elif', en sona 'else' ve 'if'in tersi olan 'fi' geliyordu. Biz bunları, birden fazla koşul varken her koşula ayrı komutlar vereceğimiz zaman yapıyorduk. Şimdi, 'if'e benzeyen bir yapıyı göreceğiz; 'case'.
Bu yapının Syntax'ı biraz farklı ve karışık gelebilir ancak zaman geçtikçe buna alışacaksınızdır. Bununla beraber daha önceki bloglarda 'verilen yanlış argümanlar için kullanıcıyı uyarma' işini 'case' yapılarıyla sağlayabiliriz. İsterseniz ilk önce iskeletine bakalım, daha sonra detaylandıralım.

Adım adım gideceğiz, endişeniz olmasın. Fakat adımları anlatırken girintilere dikkat edin ve eğer anlattıklarım kafanıza tam oturmazsa yine endişe etmeyin çünkü örnekler ile bunu daha iyi anlayacağız.
İlk satırda anahtar kelimemiz olan 'case' ifadesini yazıyoruz. Bundan sonra değişken yerleştiriyoruz ve bir başka anahtar kelime olan 'in' ifadesini veriyoruz. Case kelimesi, İngilizce'de 'olay, durum' anlamına gelir; 'in' ise 'içinde' anlamına gelir. Bu satırda Bash'e söylediğimiz şey: "$degisken içerisindeki olayı göz önüne al." şeklindedir.
İkinci satıra indiğimizde ise bir TAB boşluk bırakıyoruz. Buraya, 'pattern' yani 'durum içerisinde aranacak şeyi' yazıyoruz ve bir parantez kapatıyoruz. 'Aranacak'tan kastım, bir kelime, bir sayı veya istediğiniz bir şey olabilir.
Üçüncü satıra geldiğimizde ise 'durum içerisinde aradığımız şeyin, bulunması durumunda uygulayacağımız komutları' içerir. Bu satırın en sonuna bir boşluk bırakıp iki adet noktalı virgül ( ;; ) koyuyoruz.
Buraya kadar, aslında bir case oluşturmuş olduk. Yani bu üç satır, case'in temelidir ve geri kalan satırlar buna göre şekillenir. Beşinci ve yedinci satır da aynı bu mantıkta çalışır. case'den sonra gelen bu ifadeler, 'if' içerisindeki 'elif' komutları gibidir.
Son olarak '* )' ifadesini görüyoruz. Yıldız işareti veya asterix, Linux sistemlerde 'all' yani 'her şey, hepsi, tümü' anlamına gelir. Buradaki parantez ise biraz önce pattern'leri kapatmak için kullandığımız parantezdir. Bu ifade, 'if' içerisindeki 'else' komutu gibidir. Bu ifade ile söylediğiniz şey: "Önceki koşullar çalışmıyorsa gerçekleştir" şeklindedir.
En son satırda if yapılarındaki 'fi' gibi; bu case'i tam tersini yazarak kapatıyoruz; 'esac'.
Şimdi, örneklere geçelim ve konuyu daha iyi anlamaya çalışalım. İlk önce ben, bir argüman oluşturmak istiyorum ve bunu, bildiğiniz gibi '$1' ile yapıyorum.

'name' adında bir değişkeni argüman olarak atıyorum. Kodu çalıştırırken './practices cyberworm' şeklinde çalıştırılmasını istiyorum. Fakat kodu kullanmayı bilmeyenler için de argümanı yanlış yazmaları durumunda uyarmak istiyorum. Bu yüzden bir 'case' yani 'olay, durum' açıyorum. Bu olay, tanımladığım argüman ile alakalı olduğu için olayı, $name ile bağdaştırıyorum.

Bunu yazdıktan sonra argümanımı kontrol edebilir duruma geliyorum. Bu kontrolümü ise az önce bahsettiğim 'cyberworm' üzerinde kurmak istiyorum. Hemen bakalım.

Bunun için bir TAB boşluk bırakıp aradığım şeyi (cyberworm) yazıyorum ve parantezimi kapatıyorum. Bu iki satırda şunu söylemiş oldum: "name yani argüman içerisinde cyberworm kelimesini ara".
Şimdi, eğer bulunursa ne olacağını yazalım. Örneğin echo kullanabiliriz.

Bir TAB daha boşluk bırakıp eğer argüman, cyberworm olarak verilirse "argüman doğru" şeklinde bir yazı yazdırdım ve sonuna iki adet noktalı virgül koydum.
Hemen 'else' yani son koşula geçmek istemiyorum o yüzden eğer cyberworm ile birlikte 'blog-cyberworm.com' şeklinde bir argüman verilirse de bir mesaj vermek istiyorum.

Bunun için yine aynı mantık ile aranacak şeyi yazdım ve parantezimi kapattım. Hemen altına da bir TAB daha boşluk bıraktım ve 'CyberWorm'un sitesi. Doğru!' şeklinde bir mesaj verdim, sonuna da iki tane noktalı virgül ekledim.
Şimdi, else yani bunların dışında kalan ihtimalleri değerlendireceğiz.

Dikkat edin; biraz önce arayacağımız şeyleri yazıp parantez kapattık ancak şimdi ' * ) ' şeklinde bir ifade söz konusu. 'else' komutunu hatırlayın; orada da herhangi bir koşul yazmıyorduk çünkü kendisi, önceki koşulların çalışmaması durumunda çalışacak olan bir komuttu. Yani aslında onun koşulu, 'öncekiler çalışmazsa çalış' şeklinde. Aynı durum bunun için de geçerli; herhangi bir şey aramıyoruz. Sadece geri kalan ihtimalleri konuşuyoruz.
Bu noktada eğer yukarıdakiler gerçekleşmezse yani kullanıcı 'cyberworm' veya 'blog-cyberworm.com' şeklinde bir argüman vermezse ona "Lütfen, argüman cyberworm ya da blog-cyberworm.com olmalıdır." şeklinde bir uyarı veriyoruz.
Unuttuğumuz bir şey var; case'i kapatmadık.

'esac' komutunu verip case'i kapattığımıza göre artık kodumuzu deneyebiliriz.

İlk çalıştırmamızda argüman olarak 'cyberworm' kelimesini verdik ve çıktı, beklediğimiz gibi oldu. İkinci çalıştırmamızda da herhangi bir sorun ile karşılaşmadık. Bash, case'leri teker teker kontrol etti ve eşleşen case'i uygulamaya koydu.
Şimdi, argüman vermeyi unutalım bakalım.

Gördüğünüz gibi * ) kısmı çalıştı.

Bu sefer argüman doğru ama 'blog-cyberworm.com' yerine 'blog-cyber worm.com' yazdım yani bir boşluk bıraktım. Bash, bunu da kabul etmedi.

Başka bir şey yazdığımızda da kabul etmeyecektir. İşte, case-esac mantığı tam olarak budur. if'in çalışmadığı veya verimli olmadığı yerlerde case kullanmak doğru olacaktır.
Bununla beraber if yapılarında iç içe if'ler kullanabiliyorduk ancak case için bu böyle değildir. Eğer başka bir case açmak isterseniz bunu, ilk açtığınız case'in dışında yaratmanız lazım. Bakalım.

Gördüğünüz gibi başka bir argüman daha ekledim ve bu argümana ait case'i ayrı bir şekilde yazdım. Çalıştırdığımızda da sorun çıkmadığını görüyoruz.

Bu noktada yanlış anlamanızı istemediğim bir konu var. case yapılarını yalnızca argümanlar için kullanmıyoruz. Normal bir girdi alacağımız zaman da kullanabiliriz. Hemen ona da bakalım.

Önce ismini girmesini istedim ve ismi eğer 'cyberworm' olarak girmezse onu uyardım.
Evet, case-esac konumuz bu kadardı. Lütfen bolca pratik yapın ve Syntax yapısına dikkat edin; bozmaktan korkmayın ama pes de etmeyin.
Yayınlanma Tarihi: 2022-09-15 14:12:32
Son Düzenleme Tarihi: 2022-09-17 13:17:55