Bir bash script, terminalde tek tek yazdığın komutları bir dosyaya koyup tek seferde çalıştırmanın en pratik yoludur. Sunucuda log temizlemek, yedek almak, bir projeyi deploy etmek ya da onlarca dosyayı yeniden adlandırmak gibi tekrar eden işleri elle yapmak hem yorucu hem de hata kaynağıdır. Bu yazıda değişken, koşul ve döngü gibi temel yapı taşlarıyla küçük ama gerçek işe yarar otomasyonlar yazmayı öğreneceksin.
İlk script: shebang ve çalıştırma izni
Her şey bir dosyayla başlar. Bir merhaba.sh oluştur ve ilk satıra shebang satırını yaz. Bu satır, dosyanın hangi yorumlayıcıyla çalışacağını söyler:
#!/usr/bin/env bash
echo "Merhaba, otomasyon!"
Dosyayı çalıştırılabilir yapman gerekir. Bunun için izin verip script'i çağırırsın:
chmod +x merhaba.sh
./merhaba.sh
#!/usr/bin/env bash kullanmak, bash'in sistemde nerede kurulu olduğuna takılmadan doğru yorumlayıcıyı bulur. İlk satırda bunu unutma; aksi halde script kabuğun varsayılan davranışına kalır.
Değişkenler ve kullanıcı girdisi
Değişken tanımlarken eşittir işaretinin etrafında boşluk olmaz. Değeri okurken ise başına $ koyarsın ve neredeyse her zaman çift tırnak içine alırsın:
#!/usr/bin/env bash
isim="Aslain"
echo "Hoş geldin, $isim"
# Kullanıcıdan girdi almak
read -r -p "Adın ne? " cevap
echo "Selam $cevap"
Çift tırnak önemlidir: "$dosya" yazmak, içinde boşluk olan dosya adlarının bölünmesini engeller. Boşluksuz yazmak ($dosya) klasik bir hata kaynağıdır. Komut çıktısını bir değişkene almak için $(...) kullanırsın:
bugun="$(date +%Y-%m-%d)"
echo "Bugünün tarihi: $bugun"
Koşullar: if, test ve karşılaştırma
Otomasyon, "şu durumda şunu yap" mantığı olmadan eksik kalır. Bash'te koşulları if ve köşeli parantezlerle kurarsın. Sayısal karşılaştırmada -eq, -gt, -lt; metin karşılaştırmasında = ve != kullanılır:
#!/usr/bin/env bash
read -r -p "Bir sayı gir: " n
if [ "$n" -gt 10 ]; then
echo "$n ondan büyük"
elif [ "$n" -eq 10 ]; then
echo "Tam onmuş"
else
echo "$n ondan küçük"
fi
Dosya ve dizin kontrolleri günlük scriptlerin belkemiğidir: -f dosya var mı, -d dizin var mı, -z değişken boş mu sorusunu yanıtlar:
if [ -d "/var/backups" ]; then
echo "Yedek dizini hazır"
else
mkdir -p /var/backups
fi
Döngüler: çok sayıda dosyayı işlemek
Döngüler bash'in en çok zaman kazandıran tarafıdır. Bir klasördeki dosyalar üzerinde dönmek için for kullanırsın:
#!/usr/bin/env bash
for dosya in *.log; do
echo "İşleniyor: $dosya"
gzip "$dosya"
done
Belirli aralıkta tekrar için sayı dizisi de verebilirsin. Bir koşul sağlanana kadar dönmek istiyorsan while tercih edersin:
# 1'den 5'e kadar
for i in {1..5}; do
echo "Deneme $i"
done
# Bir dosyayı satır satır okumak
while IFS= read -r satir; do
echo "Satır: $satir"
done < liste.txt
IFS= read -r kalıbı satır okumanın güvenli yoludur: baştaki/sondaki boşlukları korur ve ters bölü işaretlerini bozmaz.
Fonksiyonlar ve argümanlar
Script büyüdükçe tekrar eden parçaları fonksiyon haline getirmek okunabilirliği artırır. Script'e dışarıdan gelen argümanlara $1, $2 ile, hepsine birden $@ ile erişirsin:
#!/usr/bin/env bash
log() {
echo "[$(date +%H:%M:%S)] $1"
}
yedekle() {
local kaynak="$1"
local hedef="$2"
cp -r "$kaynak" "$hedef" && log "Yedek alındı: $hedef"
}
yedekle "$1" "/var/backups"
Fonksiyon içinde local kullanmak değişkenleri o fonksiyona hapseder; böylece scriptin geri kalanını yanlışlıkla bozmazsın.
Sağlam scriptler: hata yönetimi
Profesyonel scriptler sessizce yanlış sonuç üretmez. Dosyanın başına şu satırı eklemek alışkanlık haline gelmeli:
set -euo pipefail
Bu üç ayar birlikte çalışır: -e bir komut hata verdiğinde script'i durdurur, -u tanımsız değişken kullanımını hata sayar, pipefail ise boru hattındaki (pipe) herhangi bir komutun hatasını yakalar. Yazdığın script'i göndermeden önce ShellCheck gibi bir statik analiz aracından geçirmek de tırnak ve değişken hatalarını erkenden yakalar.
Sık Sorulan Sorular
Bash ile sh arasındaki fark nedir?
sh daha eski ve sınırlı POSIX kabuğunu ifade eder; bash ise dizi, [[ ]] testleri ve daha zengin söz dizimi sunan bir üst kümedir. Script'in başına #!/usr/bin/env bash yazıyorsan bash özelliklerini gönül rahatlığıyla kullanabilirsin.
Script'imi nasıl hata ayıklarım?
En hızlı yöntem bash -x script.sh ile çalıştırmaktır; bu, her komutu çalışmadan önce ekrana basar. Alternatif olarak script içine set -x koyup set +x ile kapatabilir, sadece şüpheli bölümü izleyebilirsin.
Büyük otomasyonlar için bash yeterli mi?
Bash, dosya işlemleri ve komut zincirleme için mükemmeldir. Ancak karmaşık veri yapıları, JSON işleme veya yoğun mantık gerektiğinde Python gibi bir dile geçmek daha sürdürülebilir olur. İyi bir kural: 100 satırı geçen, çok dallanan mantık varsa dili değiştirmeyi düşün.
Tekrar eden işleri otomatikleştirmek istiyorsun ama nereden başlayacağını bilmiyorsan, sunucu betiklerinden deploy süreçlerine kadar pratik bir kurulum için benimle iletişime geç.