Linux / Unix işletim sisteminde shell seviyesinde döngüleri nasıl yaparım? 2,3 Parametreli bir döngü algoritmasını nasıl yazarım? Döngü demek , aynı işlemlerin veya birbirine çok yakın işlemlerin tekrar tekrar yapılması demektir. Peki Shell seviyesinde bu işlemleri nasıl yaparız?
Ön Not : bu kodları herhangi bir dosyaya yazıp daha sonra bu dosyayı sh komutu ile çalıştırırsanız da olacaktır. Ben bu şekilde deniyorum.
For döngüsü :
yazımda numaralı çalışma şekli aşağıdaki gibidir. Döngü 5 kere dönecektir. Ayrıca döngü içinde değişkeni de kullanabilirsiniz. Normal Bash yani.
#!/bin/bash for i in 1 2 3 4 5 .. N do echo "$i inci defa calisiyor" done
Ayrıca aşağıdaki şekilde döngüdeki değişkeni örneğin 2şer 2şer artmasını sağlayabiliyorsunuz.
#!/bin/bash echo "Bash versiyonu ${BASH_VERSION}..." for i in {0..10..2} do echo "$i inci defa calisiyor" done
C stili for döngüsü :
#!/bin/bash for (( c=1; c< =5; c++ )) do echo "$c inci defa calisiyor" done
Sonsuz Döngü :
Önemli olarak demeliyim ki ; Sonsuz döngü kullanınca sistem kaynaklarını çok basit bir komutla tüketebilirsiniz. Bu yüzden burada sleep komutu koyup işleminizi en azından saniyede 1 yapmanızda yarar var.
#!/bin/bash for (( ; ; )) do sleep 1 echo "sonsuz dongu [ cikmak icin CTRL+C yapınız. ]" done
Duruma bağlı döngüler, (break komutuyla birlikte )
Aşağıdaki kod, /etc/ dizinindeki tüm dosyaları okuyup bunları bir dongu halinde gezer. dogru dosyayı bulunca , istdigi islemi yapar (dosyanin icinde kaç tane nameserver varsa bunları listeler) ve donguden cıkar.
#!/bin/bash for file in /etc/* do if [ "${file}" == "/etc/resolv.conf" ] then countNameservers=$(grep -c nameserver /etc/resolv.conf) echo "${file} dosyasında toplam ${countNameservers} nameserver tanimlanmis" break fi done
break, gibi yine continue özelliğini de kullanabilirsiniz. Ayrıca döngüde if içinde döngü yapılan klasör içindeki dosyaadı.bak dosyayı varsa bir işlem yapmak istiyorsanız veya istemiyorsanız, (örnğein yedeği varsa yedeğini alma işlemini continue edebilirsiniz) döngüde aşağıdaki if komutunu kullanabilirsiniz.
#!/bin/bash FILES="$@" for f in $FILES do # dosyaadı .bak yedek dsoyası varsa, diğer dosyaya geç if [ -f ${f}.bak ] then echo "$f dosyasini atliyoruz..." continue # sonraki dosyayı okuması icin cp komutunu geçiyoruz.read next file and skip cp command fi # bu noktada yedek dosyanin olmadigi durum algilandigindandosyayı kopyalamak icin cp komutu kullaniyoruz /bin/cp $f $f.bak done Ekstra olarak da farkettiğiniz gibi, bir bash dosyası içinde yorum eklemek istiyorsanız başına # koymanız da yeterli. Umarım işinize yarar.
Devamı için :
Linuxta Bash ile Döngü Örnekleri