27
Konuya ait anahtar kelimeler :Unix/Linux " While ... Do .. Done" Döngüsü Son döngümüz olan "while" döngüsü kullanımı genel olarak; while Kontrol-Komutu do Komutlar... done şeklinde olmaktadır. "while" çalışma mantığını "Olduğu sürece" olarak yorumlayabiliriz. Siz bir kontrol belirliyosunuz ve kontrol sonucu doğru olduğu sürece "while" belirlenen komutları çalıştırıyor. Kontrol komut sonucu sağlanamadığı anda döngü sonlanıyor. While ile For arasındaki en belirgin fark, döngünün devam etmesi için gerekli olan arttırımı yada değişikliği "While" içerisinde kendimiz belirliyoruz. "For" kullanımında ise gerekli arttırım yada değişiklikler, otomatik olarak aralıktaki değerler ile sağlanıyor. Şimdi "For" döngüsünde kullandığımız sayı yazdırma örneğini "while" ile yapalım. Bunun için "while_sayi.sh" adında bir script dosyası oluşturalım ve script içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat while_sayi.sh #!/bin/bash # while_sayi.sh # while ile 1'den 13'e kadar olan sayıları yazdırma örneği. i="1" while [ $i -le 13 ] do echo "$i" i=`expr $i + 1` done [alax@alax script]$
Şimdi scripti çalıştıralım.
[alax@alax script]$ chmod u+x while_sayi.sh [alax@alax script]$ ./while_sayi.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 [alax@alax script]$
Yukarıda komutlar içerisinde "i=`expr $i + 1`" komutu ile "i" değerini her döngüde 1 arttırmasaydık o zaman döngü sonsuza kadar devam ederdi. "While" döngülerinde nasıl bir kontrol yaptığınızı ve komutlar içerisinden kontrolün devamlılığını nasıl sağlayacağınızı iyi belirlemelisiniz. "While" ile, "awk" kullanımında olduğu gibi bir ayraç belirleyerek dosyadan istediğiniz verlieri okuyabilirsiniz. "IFS(Internal Field Seperator)"Türkçe "Dahili Alan Ayıracı" anlamına gelmektedir. Şimdi "/etc/passwd" dosyasını "while" ile satırları "IFS" belirleyerek kısım kısım ayırarak okuduktan sonra "Kullanıcı adını", "Kullanıcı UID numarasını" yazdıralım. Herhangi bir dosyayı "while" döngüsüne girdi olarak vermek için son kısmı "done < dosya_adi " şeklinde tamamlamalıyız. String ifadelerle çalışırken HERZAMAN çift tırnaklar kullanınız, tekrardan bu uyarıyı yapmış olalım. Şimdi örneğimize geçelim, "while_dosya.sh" adında script dosyasını oluşturalım, dosya içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat while_dosya.sh #!/bin/bash # while_dosya.sh # while dosya okuma örneği. dosya_adi="/etc/passwd" while IFS=: read -r kullanici_adi pass uid gid desc home_dizini shell do echo "Kullanıcı adı:$kullanici_adi, Kullanıcı UID:$uid" done < "$dosya_adi" [alax@alax script]$
Scripti çalıştıralım.
[alax@alax script]$ chmod u+x while_dosya.sh [alax@alax script]$ ./while_dosya.sh Kullanıcı adı:root, Kullanıcı UID:0 Kullanıcı adı:bin, Kullanıcı UID:1 Kullanıcı adı:daemon, Kullanıcı UID:2 Kullanıcı adı:mail, Kullanıcı UID:8 Kullanıcı adı:ftp, Kullanıcı UID:14 Kullanıcı adı:http, Kullanıcı UID:33 Kullanıcı adı:uuidd, Kullanıcı UID:68 . . ... [alax@alax script]$
Yukarıdakine benzer bir çıktıyı görüyor olmalısınız. Bu şekilde istediğiniz bir dosyayı "while" döngüsüne ekleyebilirsiniz. Sınırsız bir döngü için genellikle "true" yada aynı manaya gelen iki nokta ":" kullanılır. Bunun anlamı "Döngü herzaman devam etsin, aksi istenmediği sürece." Break ve Continue: Break : Türkçe "Bırakmak" anlamına gelmektedir. Döngünün istenilen durum karşısında bırakılması için kullanılır. "FOR" ve "WHILE" içinde kullanılabilir. Örneğin, 1'den başlayarak sayıları ekrana yazdırma işlemi yapılırken, değerin 5 olduğu zaman "break" komutunu kullanlım ve döngüyü bırakalım. Örnek script dosyamızın adı "while_break.sh" ve içeriği de aşağıdaki gibi olsun.
[alax@alax script]$ cat while_break.sh #!/bin/bash # while_break.sh # While break örneği. i="1" while true do if [ "$i" == "5" ]; then break fi echo "$i" i=$(($i+1)) done [alax@alax script]$
Script dosyasını çalıştıralım.
[alax@alax script]$ chmod u+x while_break.sh [alax@alax script]$ ./while_break.sh 1 2 3 4 [alax@alax script]$
Nerede isterseniz orada "break" kullanarak döngüyü sonlandırabilirsiniz. Continue : Türkçe "Devam et" anlamına gelmektedir. Belirtilen durum olduğu zaman hiç bir şey yapmadan, sanki o değer yokmuş gibi yoluna devam et anlamına gelmektedir. Örneğin, yukarıdaki örneğimizi aşağıdaki şekilde değiştirelim.
[alax@alax script]$ cat while_break.sh #!/bin/bash # while_break.sh # While break örneği. i="1" while true do if [ "$i" == "3" ]; then i=$(($i+1)) continue elif [ "$i" == "5" ]; then break fi echo "$i" i=$(($i+1)) done [alax@alax script]$
Scripti çalıştıralım.
[alax@alax script]$ ./while_break.sh 1 2 4 [alax@alax script]$
"FOR" içerisinde continue kullanıldığı zaman değer otomatik olarak arttığı için "i=$(($i+1))" komutunu kullanmanıza gerek yok. Eğer örneğimizi "FOR" ile yazacak olsaydık,
for i in {1..13} do if [ "$i" == "3" ]; then continue elif [ "$i" == "5" ]; then break else echo "$i" fi done
şeklinde kodlamamız gerekecekti. Bu "FOR" örneği ile "while_break.sh" scripti aynı işi yapacaktır. Arasındaki tek fark söyledğimiz gibi "While" içinde "Continue" kullanıldığı zaman önce değer bir sonraki değere eşitlenir, "FOR" için böyle bir durum sözkonusu değil. Until : "Until" çalışma şekli olarak "while" döngüsüne çok benzemektedir. Sadece "until" kontrol komutunun başarılı bir şekilde çalıştırıldığı süre boyunca çalışır. Türkçe "-e kadar" gibi bir anlama gelebilir. Kullanımı, until Kontrol-Komutu do Komutlar... done şeklinde olmaktadır. "Until" döngüsünü otomatik olarak, yazılmayan bir "break" komutunu içeriyor gibi düşünebilirsiniz. Yani belirtilen kontrol komutu sağlandığı, true değeri döndüğü sürece çalışır, kontrol komutu sağlanmadığı zaman, yani "false" değeri döndüğü zaman otomatik olarak döngü sonlanır. Şimdi "until.sh" adında bir script dosyası oluşturalım. Bu script şu işlemleri gerçekleştirsin.
  • "until.txt" adında bir dosyaya "until" kelimesini eklesin.
  • Bu işlemi dosya boyutu 10 Kb(Kilobyte) ve üzerine ulaşıncaya kadar kadar devam ettirsin.
  • Eğer dosya boyutu belirlenen değere eşit yada üzerine ulaştıysa döngüden otomatik olarak çıkış yapsın.
  • Son olarak kullanıcıya bir mesaj versin ve dosyanın silinip silinmeyeceğini sorsun.
Script dosyası içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat until.sh #!/bin/bash # until.sh # until dosya kontrol örneği. [ -f "until.txt" ] && rm "until.txt"; > "until.txt" dosya_boyutu=`du -k "until.txt" | awk '{print $1}'` until [[ $dosya_boyutu -ge "10" ]]; do echo "until" >> "until.txt" dosya_boyutu=`du -k "until.txt" | awk '{print $1}'` # Dosya boyutu(KiloByte) done echo "Dosya boyutu en az 10 Kb olmuştur... " read -p "Dosya silinsin mi? [e-h] :" cevap case $cevap in [eE] ) rm until.txt && echo "Dosya silindi..." ;; [hH] ) echo "Dosya silinmedi..." ;; *) echo "Yanlış bir seçim.. Dosya silinmedi..." ;; esac [alax@alax script]$
Şimdi scripti çalıştırınız ve sonuçlarını gözlemleyiniz. Dosya boyutu için "du" komutunu kullanabilirsiniz. Kısaca; -b : Parametresi ile dosya boyutunu byte cinsinde, -k : Parametresi ile dosya boyutunu Kilobyte cinsinde, -m : Parametresi ile dosya boyutunu Megabyte cinsinde, elde edebilirsiniz. Öğrendiğiniz dersler üzerinde lütfen pratik yapınız.