Döngüler Bölüm 5 | break - continue

'break' ve 'continue' komutları, bazı zamanlarda döngülerin vazgeçilmez komutları konumuna düşer. Bu iki komut sayesinde döngüleri kontrol etmek gerçekten çok daha kolay oluyor. Bu yazıda ilk önce break, daha sonra continue komutunu göreceğiz.

break

Break kelimesi, İngilizce'den gelir ve anlamı 'kırmak' şeklindedir. Bu komut, adından da anlayacağınız üzere bir döngüyü belli bir noktada kıran, kapatan, bitiren bir komuttur. Sonsuz döngüleri işlerken bunların aslında çok tehlikeli olabileceğinden bahsettik. Bu 'break' komutu, sonsuz döngüyü de yönetebilmemize olanak tanıyor.

Şimdi, bir for döngüsü ile sayıları ekrana yazdıracağım ama bu döngü sonsuz döngü olacak. Bunun için ilk önce bir sayaç tanımlıyorum (counter=0).

Bunu yaptıktan sonra sonsuz döngü olacak şekilde bir for döngüsü tanımlıyorum yani içerisine herhangi bir tanımlama vermeyeceğim.

Şimdi, bunu yaptıktan sonra aslında ilk önce sayacımızı yazdırmamız ve bunu birer birer artırmamız gerekiyor. Eğer artırmazsak çıktımız hep '0' olacak.

Bu durumda ekrana, sayıları yazacak ancak bu bir sonsuz döngü olacak. Çünkü herhangi bir durdurma işlemi yapmadık veya limit falan da eklemedik. Hatta bunu bi' görelim istiyorum.

Gördüğünüz gibi yaklaşık üç saniye içinde 60.000'leri geçtik; 'CTRL+C' ile durdurmasaydım daha da gidecekti. Döngünün sonsuz döngü olmaması için bir koşul yazmamız lazım. Örneğin ben, bir if eşitliği yazmak istiyorum.

Bakın; koşulumu yazdıktan sonra if bloğu içerisine break anahtar kelimesini verdim. Burada söylediğim şey; "counter, 15'e eşitse bu döngüyü kır". İsterseniz çalıştırıp ne olacağına bakalım.

Biraz önce esip gürleyen ve 60.000'lere kadar ulaşan sonsuz döngümüz bir anda kesildi. Bunun sebebi, hem biraz önce verdiğimiz koşul hem de içerisindeki break komutudur.

Bash, for döngüsüne girdiğinde counter değişkeninin değerini yazdı ve o değeri bir artırdı. Daha sonra if bloğuna girdi ve counter değişkeninin 15'e eşit olup olmadığını kontrol etti. Eşit olmadığını gördüğünde tekrar başa dönerek aynı işlemleri gerçekleştirdi. Eşit olduğunda ise döngüyü kırdı. Peki, neden çıktıda 14 sayısını görüyoruz da 15 sayısını göremiyoruz? Bunun sebebi algoritmadır. Algoritmanın ne olduğunu biliyorsanız hemen anlayacaksınızdır ancak bilmiyorsanız bir alttaki paragrafa geçiniz; algoritmanın ne olduğunu anlatmayacağım, bu koddaki mantığı anlatacağım.

counter değişkeninin değerinin 13 olduğunu düşünelim. Bash, bunu 'echo $counter' komutu ile ekrana yazdırdı ve bunu bir artırdı yani 14 oldu. Daha sonra hemen if bloğundaki koşula baktı ve 15'e eşit olmadığını anladı; başa döndü. counter'ın değeri şu an 14 olarak kayıtlı. Dolayısıyla Bash, bunu da ekrana verdi ve değeri bir artırarak değerin 15 olmasını sağladı. Bu noktada eşitliğe baktı ve döngünün sona ermesini sağladı. Yani tekrardan for döngüsünün içine girip counter değişkeninin yeni değeri olan 15'i yazdıramadı çünkü zaten döngü kırılmış durumda. Peki, bunu nasıl düzeltebiliriz? Yine algoritma.

Yukarıda anlattıklarıma göre Bash, ilk önce değeri yazdırıyor, sonra bunu artırıp koşula bakıyor. Bu durumda değer, döngüyü durduracak duruma geldiğinde bu değer tekrardan yazdırılamıyor. Çünkü döngü kırılmış oluyor ve Bash, for döngüsü içerisindeki echo $counter komutuna erişemiyor. O zaman biz, bu arttırma işlemini en aşağı koyarsak bu sorunu çözebilir miyiz?

Evet, çözebiliriz. Bunu da açıklayayım. counter değerinin yine 13 olduğunu varsayalım. İlk etapta bu değer yazdırılacaktır. Daha sonra koşula bakılacak ve koşul sağlanmadığı için bu değer bir artırılacak; yeni değer 14 olacaktır. Daha sonra Bash, tekrar başa dönecek ve 14 değerini yazdırıp koşula bakacak. Koşulun sağlanmadığını gördüğünde if bloğundan çıkıp (( counter++ )) sayesinde bu değeri bir artırarak 15 yapacak. Unutmayın; koşul geride kaldı. Son olarak Bash, 15 olan yeni değeri yazdıracak ve koşula bakacak. Bu durumda koşul sağlanıyor. Dolayısıyla (( counter++ )) komutuna erişemeden döngü kırılacaktır fakat değer zaten yazılmış durumda olacaktır.

continue

Continue kelimesi, 'devam et' anlamına gelir. Bu komut, bir döngü sırasında yapılan işlemlerin es geçilmesini, atlanmasını sağlar. Ne demek istiyorum?

Koşulumuzun (if [ $i -eq 13 -o $i -eq 14 ] ve continue) anlamı şu şekildedir: "Eğer i, 13 ya da 14'e eşitse devam et yani onları dahil etme". Çıktı kısmına baktığınızda bunun gerçekleştiğini, 13 ve 14 sayılarının orada olmadığını görüyorsunuz. İşte, continue ile istemediğiniz bilgileri, işlemleri görmezden gelebilirsiniz.

Ufak bir pratik yapalım. İlk önce Desktop içerisindeki dosyalarımızın ne sırada olduğuna bir bakalım.

Daha sonra şu şekilde bir kod yazalım:

Burada, 'deneme.txt' dosyasının görülmesi dahilinde ekrana yazdırılmayacak (continue) ancak 'quiz.txt' dosyasının görülmesi dahilinde döngü kırılacak ve geri kalan dosyalar yazdırılmayacak. Dosya sırasına dikkat edelim ve programı çalıştıralım.

Çıktıya dikkat edelim; deneme.txt normalde var olmasına rağmen oraya yazılmamış çünkü biraz önce continue komutunu kullandık. quiz.txt dosyasından sonra test.sh dosyası geliyor ancak çıktıda test.sh dosyasını göremiyoruz. Çünkü Bash, 'quiz.txt' dosyasını görür görmez döngüyü kırdı ve geri kalan dosyaları yazdırmadı.

break ve continue kullanımları bu şekildeydi.


Yayınlanma Tarihi: 2022-09-18 20:26:30

Son Düzenleme Tarihi: 2022-09-20 17:58:55