Döngüler ve Diğer Kontrol Yöntemleri
Bash programlamanın temellerini anladıktan sonra, döngüler ve yaygın kullanılan kontrol yöntemlerini inceleyebiliriz.
for
Döngüsü
for
Döngüsüfor
döngüsü, bir listedeki (kelimeler, dosya adları vb.) her öğe için belirli komutları tekrarlamak amacıyla kullanılır.
Örnek 1: Dosyalar Üzerinde Döngü (Globbing ile - Önerilen Yöntem)
Mevcut dizindeki tüm .txt
dosyalarını listelemek için:
#!/bin/bash
echo "Bulunan .txt dosyaları:"
# '*' glob karakteri mevcut dizindeki tüm .txt dosyalarıyla eşleşir
# Dosya adlarında boşluk veya özel karakter varsa, tırnak içinde kullanmak önemlidir
for dosya in *.txt; do
# Dosyanın var olup olmadığını kontrol et (eğer hiç .txt dosyası yoksa glob kendisiyle eşleşir)
if [[ -f "$dosya" ]]; then
echo "İşlenen dosya: $dosya"
fi
done
Uyarı: for i in $(ls)
gibi ls
komutunun çıktısını ayrıştırmak, dosya adlarında boşluk veya özel karakterler olduğunda sorunlara yol açar ve kesinlikle önerilmez. Dosyalar üzerinde işlem yapmak için globbing (*
, ?
, [...]
) veya find
komutu ile while read
döngüsü kullanılmalıdır.
Örnek 2: Sayı Aralığında Döngü
#!/bin/bash
echo "1'den 5'e kadar sayılar:"
for i in {1..5}; do
echo "Sayı: $i"
done
while
Döngüsü
while
Döngüsüwhile
döngüsü, belirli bir koşul doğru (true
, çıkış kodu 0) olduğu sürece komutları tekrarlar. Koşul genellikle [[ ... ]]
test ifadesiyle kontrol edilir.
Aşağıda 0'dan 9'a kadar sayan basit bir while
döngüsü örneği ve modern Bash aritmetik/test sözdizimi gösterilmiştir:
#!/bin/bash
SAYAC=0
# [[ ... ]] modern test yapısı, -lt sayısal karşılaştırma (less than)
while [[ "$SAYAC" -lt 10 ]]; do
echo "Sayaç durumu: $SAYAC"
# ((...)) modern aritmetik yapısı
((SAYAC++))
# Alternatifler: ((SAYAC = SAYAC + 1)) veya let SAYAC=SAYAC+1
done
eaydin@dixon ~/calisma/bash $ ./while.sh
Sayac durumu: 0
Sayac durumu: 1
Sayac durumu: 2
Sayac durumu: 3
Sayac durumu: 4
Sayac durumu: 5
Sayac durumu: 6
Sayac durumu: 7
Sayac durumu: 8
Sayac durumu: 9
until
Döngüsü
until
Döngüsüuntil
döngüsü, while
'ın tersidir; belirtilen koşul yanlış (false
, çıkış kodu 0 olmayan) olduğu sürece komutları tekrarlar. Koşul doğru olduğunda döngü sona erer.
#!/bin/bash
SAYAC=0
# Sayaç 5'e eşit olana kadar döngü devam eder
until [[ "$SAYAC" -eq 5 ]]; do
echo "Until Sayaç: $SAYAC"
((SAYAC++))
done
case
İfadesi
case
İfadesiBir değişkenin değerini birden fazla kalıpla karşılaştırmak için if
/elif
/else
yapısına alternatif olarak case
ifadesi kullanılır. Özellikle menü seçenekleri veya komut satırı argümanlarını işlemek için kullanışlıdır.
Aşağıdaki örnekte case
kullanımı, echo -n
(yeni satır eklemeden yazdırma) ve read -r
(kullanıcıdan güvenli girdi okuma) gösterilmektedir:
#!/bin/bash
# -n ile yeni satır eklemeden soruyu sor
echo -n "İşleme devam etmek istiyor musunuz? [E/H]: "
# -r ile ters eğik çizgilerin yorumlanmasını engelle
read -r cevap
# cevap değişkeninin değerini kontrol et
case "$cevap" in
# Büyük/küçük E veya e ile başlayanlar
[Ee]*)
echo "İşlem devam ediyor..."
;;
# Büyük/küçük H veya h ile başlayanlar
[Hh]*)
echo "İşlem iptal edildi."
;;
# Yukarıdaki kalıplara uymayan her şey (*)
*)
echo "Geçersiz seçenek."
;;
esac # case ifadesini bitir
Her kalıp
)
ile biter.Her kalıp bloğundaki komutlar
;;
ile sonlandırılır.*
kalıbı, diğer kalıpların hiçbiriyle eşleşmeyen durumları yakalar (varsayılan durum gibi).
Örnek Çalıştırma:
$ ./case.sh
İşleme devam etmek istiyor musunuz? [E/H]: E
İşlem devam ediyor...
$ ./case.sh
İşleme devam etmek istiyor musunuz? [E/H]: h
İşlem iptal edildi.
$ ./case.sh
İşleme devam etmek istiyor musunuz? [E/H]: Belki
Geçersiz seçenek.
Last updated