26
Konuya ait anahtar kelimeler :"For .. Do.. Done" Döngüsü Belirli sayıda bir işlemin tekrarlanması ve her işlem içerisinde belirlenmiş komutların sıra ile işletilmesini sağlayan döngü. "For" kullanımı en genel hali ile; for degisken [ liste ] do Komutlar ... done şeklinde olmaktadır. Burada "degisken" değeri herhangi bir değişken adı, kelime olabilir. "liste" ise bir sayı aralığı, dosya içeriği olabilir. Ve bu aralıktaki her değer için uygulanacak komutlar "do" ile "done" arasında yazılır. Mesela 1'den 11'e kadar olan sayıları birer birer ekrana yazdırmak istediğimizi düşünelim. Bunu yapmanın elbette birçok yöntemi bulunmaktadır. Fakat hız ve performans açısından bu tür döngüleri, döngü için özel olarak tasarlanmış görev blokları ile kullanmak en akıllıca seçim olacaktır. Şimdi 1'den 13'e kadar olan sayıları ekrana yazdıran bir script yazalım. Script adı "for_sayı.sh" olsun ve içeriği aşağıdaki gibi olacaktır.
[alax@alax ~]$ cdd [alax@alax script]$ cat for_sayı.sh #!/bin/bash # for_sayı.sh # for döngüsü ile 1'den 13'e kadar sayıları yazdıran script. for i in {1..13} # Değişken adımızı " i " olarak belirledik. do echo "$i" done [alax@alax script]$
Şimdi scriptimizi çalıştıralım.
[alax@alax script]$ chmod u+x for_sayı.sh [alax@alax script]$ ./for_sayı.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 [alax@alax script]$
Burada önemli olan nokta "liste" ögesidir. Burayı yukarıdaki örneğimizde "{1..13}" ifadesi ile süslü parantezleri kullanarak 1 ile 13 arasındaki sayılar olarak ayarladık. Bu kısmın mantığı "Sonu olan bir süreklilik"tir. Burası önceden de belirttiğimiz gibi, dizin içerisinde bulunan dosya/klasörlerin isimlerinin olduğu bir dosya olabilir, herhangi bir sayı aralığı olabilir yada herhangi bir aralığa sahip değerler kümesi olabilir. Örneğimizin çalışma şeklini şu şekilde yorumlayabiliriz.
  • Tanımlanmış olan değişken(örneğimizde bu " i ") liste-aralık içerisindeki ilk eleman(örneğimizde 1 ile 13 arasındaki ilk eleman 1'dir) dan başlanarak atama işlemi yapılır. Mesela "i" değeri ilk olarak 1 son olarak 13 tür. Her zaman sıradaki değer değişkene atanır.
  • Değer atamasının ardından "do" ile "done" arasındaki komutlar yürütülür.
  • Aralıkta sonraki değere geçilir ve atama işlemi tekrar yapılarak, komutlar tekrar yürütülür.
  • Son olarak, en son değer için(örneğimizde bu 13 sayısıdır) komutlar yürütülür ve döngüden çıkılır.
Şimdi "for_asalsayı.sh" adında bir script dosyası oluşturalım. Bu script girilen bir sayının asal olup olmadığını kontrol ederek bizlere mesaj olarak göstersin. Dosya içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat for_asalsayı.sh #!/bin/bash # for_asalsayı.sh # Bu script girilen sayının asal olup olmadığını kontrol ediyor. read -p "Lütfen sayıyı giriniz...: " sayi if [ -z "$sayi" ]; then #Kullanıcı bir sayı girmezse. echo "Lütfen bir sayı giriniz ve tekrar deneyiniz.." exit 1 fi declare -i sonuc=0 for ((i=2;i<sayi;i++)); do kalan=$(($sayi % $i)) if [ $kalan -eq 0 ]; then sonuc=`expr $sonuc + 1` fi done if [ $sonuc -ne 0 ]; then echo "$sayi sayısı asal bir sayı değildir..." else echo "$sayi sayısı bir ASAL SAYIDIR..." fi [alax@alax script]$
"FOR" döngüsünü yukarıdaki şekilde de kullanabilirsiniz. ((i=2;i<sayi;i++)) : Bu ifade "FOR" kullanımlarından bir tanesidir. Tabiki aynı işlevi yapacak başka bir kod bloğuda yazabilirsiniz. Bu ifadenin anlamı şudur.
  • "i" adında bir değişken olsun ve ilk değeri "2" olsun(i=2).
  • "i" değeri "sayi" dan küçük olduğu sürece(i<sayi). Aşağıdaki komutları uygula.
  • "i" değerini bir arttır(i++).
  • "i" değeri "sayi" dan küçük olma koşlunu sağlamadığı anda döngüyü sonlandır.
Tabiki komutların aynı satırda yazılma kuralı ile bu komutlar noktalı virgül ile ayrılarak yazılıyor. Şimdi scripti çalıştıralım.
[alax@alax script]$ chmod u+x for_asalsayı.sh [alax@alax script]$ ./for_asalsayı.sh Lütfen sayıyı giriniz...: 61 61 sayısı bir ASAL SAYIDIR... [alax@alax script]$ ./for_asalsayı.sh Lütfen sayıyı giriniz...: 1263 1263 sayısı asal sayı değildir... [alax@alax script]$
Basit olarak "FOR" döngüsü ile asal sayı bulan script bu şekilde yazılabilir. Aynı satırda birden fazla komut kullanımı: Aynı satırda birden fazla komut yazabilmek için komutlar arasında noktalı virgül kullanmanız gerekmektedir. Mesela Terminal ekranında birden fazla komutu sırası ile işletmek için aşağıdaki örnekte olduğu gibi bir kullanım mevcuttur.
[alax@alax script]$ cd; ls -l; cd -; echo "Listeleme bitti..." [alax@alax script]$
Yukarıdaki örnekte, "cd" ile "home" klasörüne giriliyor, "ls -l" ile dizin içerisindeki dosya/klasörler "-l" parametresi ile ayrıntılı olarak listeleniyor, "cd -" komutu ile "bir önceki" dizine geri gidiliyor ve en son bir mesaj yazılıyor. Bu tür işlemleri komut ekranında olduğu gibi script içerisindede kullanabilirsiniz. Şimdi "for_dosya.sh" adında bir script dosyası oluşturalım. Öncelikle çalışma dizini içerisinde sonu ".sh" ile biten script dosya isimlerini "dosyalar" adında bir dosyaya kaydedelim, ve scriptimiz bu dosyadan dosya isimlerini okuyarak her dosyayı "dosya_adi.yedek" ismi ile yedeklesin. Script içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ ls *.sh > dosyalar [alax@alax script]$ cat for_dosya.sh #!/bin/bash # for_dosya.sh # For ile dosyaların yedeğini alan acript. for dosya_adi in `cat dosyalar` do cp "$dosya_adi" "$dosya_adi".yedek if [ "$?" -ne "0" ]; then echo "Bir hata meydana geldi.." exit 1 fi done [alax@alax script]$
Scripti çalıştıdıktan sonra çalışma dizini içerisinde listeleme yaparsanız sonu ".sh" ile biten script dosyalarının sonu ".yedek" ile biten bir yedeğinin olduğunu görürsünüz. Yukarıdaki örneğimizde her kopyalama işleminden sonra herhangi bir hata olup olmadığına bakıyoruz, bunu "$?" değerine bakarak yapıyoruz. Bu değer herhangi bir komut sonucu hata ile dönerse "0" dan farklı bir sayıya eşit olur, eğer komut bir hata üretmezse bu değer "0" olur. Şimdi lütfen çalışma dizini içerisindeki sonu ".yedek" ile biten dosyaları ve "dosyalar" adlı dosyayı aynı anda hepsini silelim.
[alax@alax script]$ rm *.yedek dosyalar [alax@alax script]$
Kendiniz pratik yaparak konular üzerinde daha çok hakimiyete sahip olabilirsiniz. Her zaman pratik yapmayı lütfen unutmayınız.