intranet-while-ve-until-donguleri

Linux Shell'de while 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

done

 

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.

1
2
3
4
5
6
7
8
9

 

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.

1
2
3
5
6

 

Ç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.

0 : 00 : 22 : 19
 

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.