Linux Shell'de while Döngüsü
- "while" Döngüsü
- "until" Döngüsü
while döngüsünde, belirtilen koşul geçerli olduğu sürece döngü bloğunda bulunan komutlar uygulanmaya devam eder.
while kosul ifadesi
do
komutlar
Dikkat edilmesi gereken hususlar:
-\ while döngü bloğu "do" ile başlar "done" ile biter. döngü koşulu geçerli olduğu müddetçe bu aralıktaki komutlar işlem görür.
-\ while döngüsünde belirli bir sınır yoktur, belirtilen koşul geçerli olduğu sürece döngü bloğundaki komutlar işlemeye devam eder. Bu yüzden döngünün sonsuz olmaması için koşulu etkileyecek faktörlerin döngü bloğu içerisinde değişmesi gerekir.
-\ bir döngüde birden fazla koşul yer alabilir.
Örnek:
#!/bin/sh
sayac=0
while [ $sayac -lt 6 ]
do
sayac=$((sayac+1))
echo $sayac
done
Yukarıdaki komut, 0 olan "sayac" değişkeninin değeri 6'dan küçük olduğu müddetçe çalışmaya devam edecektir. Her tekrarda değişken değeri bir artar ve shell ekranına yazılır.
1
2
3
4
5
6
Örnek:
#!/bin/sh
echo "Lütfen şifrenizi giriniz. "
while ! [ $sifre == “ceren” ]
do
read sifre
if ! [ $sifre = “ceren” ]; then
echo "Yanlış şifre girdiniz, tekrar deneyin."
fi
done;
echo "Şifre kabul edildi."
Yukarıdaki komut sifre yanlış girildiği müddetçe şifre sormaya devam edecektir.
Lütfen şifrenizi giriniz.
12345
Yanlış şifre girdiniz, tekrar deneyin.
admin
Yanlış şifre girdiniz, tekrar deneyin.
ceren
Şifre kabul edildi.
Sonsuz döngü
Döngü bloğunda koşulu etkilemeyecek komutlar uygulayacak sonsuz döngü oluşturabiliriz. Döngü shell ekranını kapatana veya CTRL+C ile komutu sonlandırana kadar döngü bloğundaki komutları uygulamaya devam eder.
Örnek:
#!/bin/sh
sayac=2000
while true; do
cal $sayac
sleep 1
let sayac++
done
Yukarıdaki komut müdahale edilene kadar her saniye sayac değişkenini 1 arttırarak 2000 yılından itibaren yılların takvimlerini görüntüler.
Döngüyü terk etmek
Bir koşul gerçekleştiği takdirde döngü tamamlanmadan döngüden çıkmak için break komutunu kullanabiliriz.
Örnek:
#!/bin/sh
sayac=1
while true; do
echo $sayac
sleep 1
sayac=$(( $sayac + 1 ))
if [ $sayac = 10 ]; then
break; fi;
done
Yukarıdaki komut while döngüsü sonsuz bir döngü olmasına rağmen sayac'ın değeri 10 olduğunda break komutuyla döngüden çıkacaktır.
Döngüde komut atlama
Bir koşul gerçekleştiği takdirde döngüden çıkmadan döngü bloğundaki işlemleri atlaman için "continue" komutunu kullanabiliriz.
Örnek:
#!/bin/sh
sayac=0
while [ $sayac -lt 6 ]; do
sayac=$(( $sayac + 1 ))
if [ $sayac = 4 ]; then
continue; fi;
sleep 1
echo $sayac
done
Yukarıdaki komut uygulandığında if kontrolündeki koşul sağlandığında continue'dan sonraki komutlar “done”a kadar atlanacaktır ve döngü devam edecektir. 4 dışında 1'den 6'e kadar olan sayılar shell ekranına yazılır.
Çoklu koşullar
while döngüsünde de aynı if yapısında olduğu gibi birden fazla koşul kullanabiliriz.
Örnek:
#!/bin/sh
sayac=1; sifre=0
while [ $sayac -le 5 ] && [ ! $sifre == “123456” ]; do
echo "Lüften şifrenizi giriniz ($sayac. deneme)";
read sifre
sayac=$(( $sayac + 1 ));
done
Yukarıdaki örnekte şifreyi doğru girmek için 5 şans verecektir. Şifre "123456" girilmediği takdirde 5 defa tekrar soracaktır.
Lüften şifrenizi giriniz (1. deneme)
admin
Lüften şifrenizi giriniz (2. deneme)
root
Lüften şifrenizi giriniz (3. deneme)
123456
İç içe döngü kullanımı
Birden fazla while döngüsünü iç içe kullanabiliriz. Bu durumda üst döngünün devam edebilmesi için alt döngünün tamamlanması gerekecektir.
Örnek:
#!/bin/sh
ogrenci=1; sinav=1;
while [ $ogrenci -le 5 ]; do
while [ $sinav -le 3 ]; do
echo "$ogrenci. ogrencinin $sinav. notu";
read $Notlar;
sinav=$((sinav+1));
done;
sinav=1 ogrenci=$((ogrenci+1));
done;
Yukarıdaki komut 5 öğrenciye ait 3 sınav notunun girilmesini isteyecektir.
1. ogrencinin 1. notu
70
1. ogrencinin 2. notu
100
1. ogrencinin 3. notu
50
2. ogrencinin 1. notu
25
2. ogrencinin 2. notu
90
2. ogrencinin 3. notu
80
3. ogrencinin 1. notu
90
3. ogrencinin 2. notu
30
3. ogrencinin 3. notu
70
.
.
.
Örnek:
#!/bin/sh
# Kronometre
salise=0
saniye=0
dakika=0
saat=0
while [ $saat -lt 24 ]
do
while [ $dakika -lt 60 ]
do
while [ $saniye -lt 60 ]
do
while [ $salise -lt 100 ]
do
sleep 0.01
clear
echo "$saat : $dakika : $saniye : $salise"
salise=$((salise+1))
done
salise=0
saniye=$((saniye+1))
done
saniye=0
dakika=$((dakika+1))
done
dakika=0
saat=$((saat+1))
done
saat=0
Yukarıdaki komut bir kronometre gibi çalışacaktır. Örneğin saniye döngüsünün ilerleyebilmesi için salisenin tamamlanması gerekir.
Linux Shell'de until Döngüsü
"until" döngüsü "while" döngüsüyle kullanım olarak aynıdır. Farkı ise while döngüsü koşul doğru olduğu sürece devam eder, until döngüsü ise koşul yanlış olduğu sürece devam eder, koşul doğru olduğunda döngüyü sonlandırır.
until kosul ifadesi
do
komutlar
done
Örnek:
#!/bin/sh
sayac=0
until [ $sayac = 8 ]; do
sayac=$(( $sayac + 1 ))
echo $sayac
sleep 1
done
Yukarıdaki komutta döngü "sayac" değişkeni 8'e eşit olana kadar döngü bloğundaki komutları uygulamaya devam eder.
1er saniye aralıkla birden 8'e kadar olan sayıları shell ekranına yazdırır ve 8 olduktan sonra döngüye devam etmez.
1
2
3
4
5
6
7
8
Örnek:
#!/bin/sh
sifre=0
echo "Lütfen şifrenizi giriniz. "
until [ $sifre == “ceren” ]
do
read sifre
if ! [ $sifre = “ceren” ]; then
echo "Yanlış şifre girdiniz, tekrar deneyin."
fi
done;
echo "Şifre kabul edildi."
Yukarıdaki komut (daha önce while örneğinde gösterildiği gibi) sifre yanlış girildiği müddetçe şifre sormaya devam edecektir.
Lütfen şifrenizi giriniz.
12345
Yanlış şifre girdiniz, tekrar deneyin.
admin
Yanlış şifre girdiniz, tekrar deneyin.
ceren
Şifre kabul edildi.