Terminalde aynı birkaç komutu her sabah art arda çalıştırıyorsanız, bu rutini bir dosyaya taşımanın zamanı gelmiştir. Bash script, .sh uzantılı düz bir metin dosyasına yazılmış komut dizisidir; ama bu basit tanımın arkasında sunucu yedeklemesinden log temizliğine kadar gerçek işleri devralan bir otomasyon katmanı durur. Bu rehberde betiği sıfırdan yazmayı, hata yönetimini ve öğrenme sırasını pratik örneklerle anlatıyorum.
Bash Script Tam Olarak Nasıl Çalışır?
Bir bash betiği, ilk satırında hangi yorumlayıcıyla çalışacağını belirten bir shebang taşır: #!/bin/bash. Bu satır olmadan da betik çoğu zaman çalışır, ama shebang dosyayı doğrudan ./script.sh ile çağırdığınızda doğru kabuğun devreye girmesini garanti eder. Dosyayı oluşturduktan sonra çalıştırma izni vermeniz gerekir; aksi halde kabuk "Permission denied" hatası verir.
#!/bin/bash
chmod +x yedekle.sh
./yedekle.sh
Kabuk dosyayı satır satır okur ve her komutu normal bir terminal komutu gibi çalıştırır. Fark şu: komutları tek tek yazmıyorsunuz, dosya bunu sizin yerinize sırayla yapıyor. bash script.sh ile de çalıştırabilirsiniz; bu durumda çalıştırma izni gerekmez, çünkü dosyayı doğrudan bash yorumlar, kendi başına çalıştırmaz.
.sh uzantısı aslında zorunlu değildir; kabuk dosyayı içeriğine bakarak yorumlar, uzantı sadece bir gelenektir. Yine de takım çalışmasında dosyanın ne olduğunu belli etmek için bu uzantıyı kullanmak faydalı bir alışkanlıktır. Betiği nerede sakladığınız da önemlidir: sık kullandığınız betikleri ~/bin gibi PATH'e ekli bir dizine koyarsanız, dosya yolunu yazmadan sadece isimle çağırabilirsiniz.
Betik içindeki her komutun çıktısını görmek isterseniz başa set -x satırını ekleyin; bu, hangi satırın hangi değerle çalıştığını terminalde gösterir ve hata ayıklamayı kolaylaştırır. Üretimde çalışan betiklerde bu seçeneği kapalı tutmak gereksiz log kirliliğini önler.
Değişkenler ve Argümanlarla Esnek Betik Yazmak
Sabit değerlerle yazılmış bir betik bir kez işe yarar, sonra kullanılamaz hale gelir. Değişkenler bu sorunu çözer: bir değeri bir isme bağlar, betik boyunca o ismi kullanırsınız. Bash'te değişken atarken eşittir işaretinin iki yanında boşluk olmaz; yeni başlayanların en sık düştüğü hatalardan biri budur ve "command not found" hatasına yol açar.

#!/bin/bash
hedef_dizin="/home/celil/yedekler"
tarih=$(date +%Y-%m-%d)
tar -czf "$hedef_dizin/yedek-$tarih.tar.gz" /var/www/site
Komut satırı argümanları, betiği her çalıştırdığınızda farklı girdi vermenizi sağlar. $1, $2 gibi özel değişkenler sırasıyla birinci ve ikinci argümanı temsil eder; $# argüman sayısını, $@ ise tüm argümanları verir. Betiği ./yedekle.sh /var/www/site /mnt/disk2 şeklinde çağırdığınızda, $1 ilk yolu, $2 ikinci yolu tutar.
Sık kullanılan özel değişkenler şunlardır:
$0: betiğin kendi adı$1,$2,$3...: sırasıyla geçirilen argümanlar$#: toplam argüman sayısı$?: bir önceki komutun çıkış kodu, 0 ise başarılı demektir
Bu değişkenleri bilmeden yazılan betikler genelde her değeri dosya içine sabit kodlar; bu da betiği tek seferlik kullanıma mahkûm eder. Argümanlarla çalışmayı öğrendiğinizde aynı betik onlarca farklı senaryoda yeniden kullanılabilir hale gelir.
Koşullar, Döngüler ve Fonksiyonlarla Mantık Kurmak
Gerçek otomasyon, betiğin duruma göre karar vermesiyle başlar. if bloğu, bir dosyanın var olup olmadığını veya bir komutun başarılı çalışıp çalışmadığını kontrol etmenizi sağlar. Test operatörleri (-f dosya için, -d dizin için, -z boş metin için) günlük kullanımda en çok ihtiyaç duyacağınız araçlardır.

if [ -f "/var/log/nginx/error.log" ]; then
echo "Log dosyası bulundu, işleniyor."
else
echo "Log dosyası yok, çıkılıyor."
exit 1
fi
Döngüler aynı işlemi birçok dosya veya girdi üzerinde tekrarlar. for döngüsü bir listeyi gezer, while ise bir koşul doğru olduğu sürece çalışır. Yüzlerce dosyayı tek tek yeniden adlandırmak yerine bir for döngüsü işi saniyeler içinde bitirir; elle yapılsa yarım gün sürecek bir görev, doğru yazılmış bir döngüyle tek komuta iner.
for dosya in /var/log/app/*.log; do
gzip "$dosya"
done
Fonksiyonlar, tekrar eden kod bloklarını isimlendirip yeniden kullanmanızı sağlar. Elli satırlık bir betikte aynı kontrol mantığı üç yerde geçiyorsa, onu bir fonksiyona taşımak hem okunabilirliği artırır hem de hata yapma ihtimalini azaltır. Bir fonksiyonu değiştirdiğinizde, onu çağıran her yer otomatik olarak güncellenmiş olur.
Fonksiyon tanımlarken parametre almak için özel bir sözdizimi gerekmez; fonksiyon içinde de $1, $2 aynı argüman mantığıyla çalışır, sadece bu sefer fonksiyonu çağıran satırdaki değerleri temsil eder. Küçük bir log() fonksiyonu yazıp her önemli adımda çağırmak, betiğin neyi ne zaman yaptığını sonradan takip etmenizi kolaylaştırır.
Hata Yönetimi Neden Atlanmaması Gereken Bir Adım
Deneyimsiz yazılan betikler, bir komut başarısız olduğunda sessizce devam eder. Bu da yanlış dizini silmek gibi tehlikeli sonuçlar doğurabilir. set -e satırı, herhangi bir komut hata döndürdüğünde betiği anında durdurur; set -u ise tanımsız bir değişken kullanıldığında betiği durdurarak yazım hatalarını erkenden yakalar.
#!/bin/bash
set -euo pipefail
kaynak="/data/onemli"
if [ ! -d "$kaynak" ]; then
echo "Hata: $kaynak bulunamadı" >&2
exit 1
fi
rsync -av "$kaynak/" /mnt/yedek/
pipefail seçeneği, boru hattındaki (|) herhangi bir komut başarısız olduğunda tüm zinciri başarısız sayar. Bu olmadan bash sadece son komutun çıkış koduna bakar ve aradaki hatayı gözden kaçırabilir. $? değişkeniyle bir komutun çıkış kodunu kontrol etmek, zincirleme işlemlerde kritiktir.
Silme, taşıma veya üzerine yazma içeren her betikte, işlemden önce hedefin doğru olduğunu doğrulayan bir kontrol satırı bulunmalıdır. Bu tek satır, yanlışlıkla üretim verisini silmekle silmemek arasındaki farkı yaratabilir. Bir betiği gerçek veriye dokunacak şekilde kurmadan önce test ortamında birkaç kez çalıştırın ve çıktıyı gözle kontrol edin.
Bazı betikler --dry-run benzeri bir bayrak kabul edecek şekilde yazılır; bu modda betik hangi dosyaları sileceğini veya taşıyacağını yalnızca ekrana yazar, gerçekte dokunmaz. Kritik işlemler için bu tür bir güvenlik ağı eklemek, birkaç satır ekstra kod karşılığında büyük bir hata payını ortadan kaldırır.
Gerçek Dünyada Hangi İşleri Otomatikleştirirsiniz
En yaygın kullanım alanı yedeklemedir. Belirli dizinleri sıkıştırıp tarihli bir dosya adıyla başka bir diske veya sunucuya kopyalayan betikler, cron ile birleştiğinde kendiliğinden çalışır. crontab -e ile her gece saat 03:00'te çalışacak bir yedekleme görevi tanımlamak birkaç dakika sürer ve bir daha elle müdahale gerektirmez.

| Görev | Tipik komutlar | Otomasyon aracı |
|---|---|---|
| Yedekleme | tar, rsync | cron |
| Log temizliği | find, gzip | cron |
| Toplu yeniden adlandırma | for, mv | manuel/betik |
| Disk alanı uyarısı | df, awk | cron + mail |
Log dosyalarını belirli bir yaştan eski olduğunda otomatik silen bir find komutu disk dolmasını önler: find /var/log -name "*.log" -mtime +30 -delete. Disk kullanımını izleyip belirli bir eşiği geçtiğinde uyarı gönderen küçük bir betik, sunucu kesintilerinin çoğunu önceden haber verir.
Toplu dosya işlemleri de sık karşılaşılan bir senaryodur. Yüzlerce fotoğrafı tarihe göre klasörlere ayırmak, bir CSV dosyasındaki satırları işleyip veritabanına aktarmak ya da bir dizindeki tüm görselleri aynı formata dönüştürmek, bash betikleriyle birkaç saniyede biter. Elle yapıldığında sıkıcı ve hataya açık olan bu işler, betikle yapıldığında güvenilir ve tekrarlanabilir hale gelir.
Dağıtım (deployment) otomasyonu da giderek yaygınlaşan bir kullanım alanıdır. Bir web uygulamasını güncellerken kodu çekmek, bağımlılıkları kurmak ve servisi yeniden başlatmak gibi adımları tek bir betikte toplamak, elle yapılan dağıtımlarda unutulan adımların önüne geçer. Küçük ekiplerde bu tür betikler, tam bir CI/CD sistemi kurmadan önce ilk otomasyon adımı olarak işe yarar.
Öğrenmeye Nereden Başlamalı
Doğrudan karmaşık bir betikle başlamayın. İlk hafta, üç dört komutu art arda çalıştıran basit bir dosya yazıp çalıştırmayı öğrenin. Sonra değişken ve argüman ekleyin, ardından if ve for ile mantık kurun. Bu sıra her adımda önceki bilgiyi pekiştirir ve karmaşıklığa yavaş yavaş alıştırır.
Kendi günlük işinizden gerçek bir görev seçmek motivasyonu ayakta tutar. İndirilenler klasörünüzü türüne göre otomatik düzenleyen on satırlık bir betik, ders kitabı örneğinden çok daha kalıcı bir öğrenme sağlar. man bash ve GNU'nun resmi bash referans kılavuzu, sözdizimi takıldığınızda başvurulacak en güvenilir kaynaklardır.
Başkalarının yazdığı betikleri okumak da öğreticidir; GitHub'daki açık kaynak projelerin scripts/ klasörleri, gerçek dünyada hata kontrolünün nasıl yapıldığını gösterir. Zamanla shellcheck gibi bir statik analiz aracını betiklerinize çalıştırmak, yaygın hataları siz fark etmeden önce yakalar. Bu tek alışkanlık, ileri seviyeye geçişte gerçek fark yaratır.
Her betiği yazdıktan sonra kısa bir yorum satırıyla ne işe yaradığını ve hangi argümanları beklediğini not almak, altı ay sonra o dosyayı tekrar açtığınızda size zaman kazandırır. Deneyimli sistem yöneticilerinin çoğu, kendi yazdığı ama açıklama eklemediği eski bir betikle karşılaştığında aynı şikayeti dile getirir: ne yaptığını hatırlamak, yeniden yazmaktan daha zor olabilir.
Bash betiklerini Linux ağ komutları ile birleştirdiğinizde, sunucu izleme ve otomatik uyarı sistemleri kurmak da mümkün hale gelir. GNU Bash'in resmi kılavuzuna gnu.org üzerinden ulaşabilir, sözdizimini referans olarak kullanabilirsiniz.
Henüz yorum yok.
Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.