Linux Bash Script Rehberi: Otomasyon ve Scripting Temelleri

Değişken, döngü ve fonksiyonlarla Bash betiği yazmayı, hata yönetimini ve gerçek dünyadan otomasyon senaryolarını komut satırı örnekleriyle anlatan rehber.

Linux
Linux Bash Script Rehberi: Otomasyon ve Scripting Temelleri

Terminalde aynı komutları her gün tek tek yazmak, zamanla ciddi bir zaman kaybına dönüşür. Bash script bu tekrarı ortadan kaldırır; birden fazla komutu tek bir dosyada toplar ve tek satırla çalıştırmanızı sağlar. Elle saatler süren bir görevi doğru yazılmış bir betikle saniyelere indirmek mümkündür. Bu yazıda betik yazmanın temellerini, sık kullanılan yapıları ve gerçek otomasyon örneklerini ele alıyorum.

Bash script nedir, nasıl çalışır

Bash, çoğu Linux dağıtımında varsayılan kabuktur (shell) ve yazdığınız komutları işletim sistemine iletir. Bir Bash betiği, sırayla çalıştırılacak komutları barındıran bir metin dosyasından ibarettir. Betiği çalıştırdığınızda satırlar yukarıdan aşağı, siz tek tek yazmışsınız gibi işlenir. Karmaşık bir programlama dili öğrenmenize gerek kalmaz; elinizdeki komut satırı bilgisiyle güçlü otomasyonlar kurabilirsiniz.

Basit bir betik yazmak birkaç adımdan oluşur:

#!/bin/bash
echo "Merhaba, bugün $(date +%A)"
mkdir -p ~/yedek

İlk satırdaki #!/bin/bash şebang (shebang) denen özel bir işarettir ve betiğin hangi yorumlayıcıyla çalıştırılacağını belirtir. Bu satırı atlarsanız betik genelde yine çalışır, ama hangi kabukla yorumlanacağı belirsizleşir ve farklı sistemlerde beklenmedik sonuçlar doğurabilir. Dosyayı kaydettikten sonra çalıştırılabilir hale getirmeniz gerekir:

chmod +x betik.sh
./betik.sh

chmod +x dosyaya çalıştırma izni verir. Bu adımı atlarsanız "Permission denied" hatası alırsınız. Betiği ./betik.sh şeklinde çağırmak, kabuğa dosyanın bulunduğu dizinde arama yapmasını söyler. Bu, betiğin sistemde kurulu bir komutla karışmasını önler.

Değişkenler ve girdi alma

Değişkenler, betik içinde veri saklamanın temel yoludur. Bir dosya yolunu, bir sayıyı ya da kullanıcı girdisini bir değişkende tutabilir, betik boyunca tekrar kullanabilirsiniz:

Bash betiğinde değişken ve kullanıcı girdisi kodunu gösteren terminal penceresi
hedef_dizin="/var/log"
dosya_sayisi=$(ls "$hedef_dizin" | wc -l)
echo "Dizinde $dosya_sayisi dosya var"

Değişken atarken eşittir işaretinin etrafında boşluk bırakmamak önemli bir ayrıntıdır. hedef_dizin = "/var/log" yazarsanız Bash bunu farklı bir komut sanır ve hata verir. Kullanıcıdan girdi almak için read komutu kullanılır:

read -p "Silmek istediğiniz dosya: " dosya_adi
rm "$dosya_adi"

read -p kullanıcıya bir mesaj gösterir ve yanıtı doğrudan değişkene atar. Betikleri etkileşimli hale getirmenin en basit yolu budur. Değişkeni çift tırnak içinde kullanın; tırnaksız kullanımda boşluk içeren dosya adları betiği bozar.

Koşullar, döngüler ve fonksiyonlar

Koşullu ifadeler, betiğin duruma göre farklı kararlar almasını sağlar. if yapısı en sık kullanılan koşul bloğudur:

if [ -f "/etc/nginx/nginx.conf" ]; then
    echo "Nginx yapılandırması bulundu"
else
    echo "Dosya yok, kurulum gerekebilir"
fi

Döngüler ise aynı işlemi birden çok kez tekrarlamanızı sağlar. Bir dizindeki tüm dosyalar üzerinde işlem yapmak, bunun klasik bir örneğidir:

for dosya in *.log; do
    gzip "$dosya"
done

Betikler büyüdükçe, tekrar eden kod bloklarını fonksiyonlara taşımak okunabilirliği artırır:

yedekle() {
    tar -czf "yedek_$(date +%Y%m%d).tar.gz" "$1"
    echo "Yedekleme tamamlandı: $1"
}
yedekle /home/kullanici/belgeler

Fonksiyona geçirilen ilk parametreye $1 ile erişilir. Bu sayede aynı fonksiyonu farklı dizinler için tekrar tekrar çağırabilirsiniz. Betik büyüdükçe, her biri tek bir işi yapan küçük fonksiyonlara bölmek hem hata ayıklamayı kolaylaştırır hem de kodu okunabilir tutar.

Hata yönetimi ve hata ayıklama

Güvenilir bir betik, karşılaşabileceği sorunları önceden hesaba katar. Bir dosya bulunamayabilir ya da bir komut başarısız olabilir. Bu durumlar kontrol edilmezse betik sessizce yanlış işler yapabilir. set -e komutu, herhangi bir komut hata verdiğinde betiğin durmasını sağlar:

Bash betiğinde hata yönetimi sürecini gösteren infografik
#!/bin/bash
set -e
cp kaynak.txt /yedek/kaynak.txt
echo "Kopyalama başarılı"

Bir komutun çıkış kodunu $? ile de kontrol edebilirsiniz; sıfır başarıyı, sıfırdan farklı bir değer hatayı gösterir. Betiği hata ayıklama modunda çalıştırmak için bash -x betik.sh komutu kullanılır. Bu komut her satırı çalışmadan önce ekrana yazdırır ve sorunun tam olarak nerede çıktığını görmenizi kolaylaştırır.

Zamanlanmış çalışan betiklerde hata yönetimi özellikle önemlidir, çünkü bir sorun çıktığında kimse anında müdahale edemez. Böyle betiklerin çıktısını bir log dosyasına yönlendirmek, sorunu sonradan incelemenizi sağlar:

./bakim.sh >> /var/log/bakim.log 2>&1

Komut satırı argümanları

Profesyonel betikler genelde sabit değerler yerine çalıştırılırken verilen argümanları kullanır. Bu, aynı betiği farklı durumlarda tekrar kullanmanızı sağlar:

Yedekleme betiği kodunu gösteren terminal penceresi
#!/bin/bash
kaynak_dizin="$1"
hedef_dizin="$2"
rsync -av "$kaynak_dizin" "$hedef_dizin"

Bu betiği ./yedekle.sh /home/veri /mnt/disk2 şeklinde çağırdığınızda, $1 ve $2 sırasıyla ilk ve ikinci argümanı temsil eder. $# toplam argüman sayısını verir, $@ ise tüm argümanların listesini verir. Argümanları doğrulamak da önemli bir adımdır:

if [ -z "$1" ]; then
    echo "Kullanım: ./yedekle.sh <kaynak> <hedef>"
    exit 1
fi

Bu kontrol, betik boş bir argümanla çağrıldığında anlamlı bir hata mesajı gösterip çıkmasını sağlar. Kullanıcıya ne yapması gerektiğini anlatan bu tür kontroller, betiği gerçek bir araca dönüştürür. exit 1 komutu betiği sıfırdan farklı bir kodla sonlandırır. Bu sayede betiği başka bir betikten çağırdığınızda hatayı otomatik olarak fark edersiniz.

Pratik otomasyon örnekleri

Yedekleme, Bash betikçiliğinin en yaygın kullanım alanlarından biridir. Aşağıdaki gibi bir betik, belirli bir dizini sıkıştırıp tarih damgalı bir arşive dönüştürür ve otuz günden eski yedekleri temizler:

#!/bin/bash
yedek_adi="yedek_$(date +%Y%m%d_%H%M).tar.gz"
tar -czf "/mnt/yedekler/$yedek_adi" /home/kullanici/proje
find /mnt/yedekler -name "yedek_*.tar.gz" -mtime +30 -delete

Sistem bakımı da sık otomatikleştirilen bir alandır. Paket güncelleme, disk kullanımı kontrolü ve log temizliği tek bir betikte birleştirilebilir. Bu görevleri elle her seferinde hatırlamak yerine otomatik çalışan bir sisteme devretmek hem zaman kazandırır hem de hiçbir adımın atlanmamasını garanti eder. Bu tür betikleri cron ile zamanlamak, tamamen otomatik çalışan bir bakım sistemi kurmanızı sağlar:

crontab -e
# Her gün saat 03:00'te çalıştır
0 3 * * * /home/kullanici/betikler/bakim.sh

Toplu dosya işlemleri de betiklerin güçlü olduğu bir alandır. Yüz dosyayı elle yeniden adlandırmak saatler sürebilirken, for döngüsüyle yazılmış birkaç satırlık bir betik bunu saniyeler içinde bitirir. Örneğin bir dizindeki tüm .jpeg uzantılı dosyaları .jpg olarak değiştirmek tek bir döngüyle mümkündür:

for dosya in *.jpeg; do
    mv "$dosya" "${dosya%.jpeg}.jpg"
done
  • Yedekleme: tar ve rsync ile düzenli arşivleme
  • Sistem bakımı: paket güncelleme, disk temizliği, log rotasyonu
  • Toplu işlem: dosya yeniden adlandırma, format dönüştürme
  • Zamanlanmış görev: cron ile günlük veya haftalık otomasyon

Betik yazımında ileri seviyeye geçmek

Temel becerileri edindikten sonra diziler (arrays) ve borular (pipes) gibi araçlar betikleri güçlendirir. Bir dizi, birden fazla değeri tek değişkende tutmanızı sağlar:

dosyalar=("rapor.txt" "log.txt" "veri.csv")
for f in "${dosyalar[@]}"; do
    echo "İşleniyor: $f"
done

Borular ise bir komutun çıktısını başka bir komuta aktarmanızı sağlar. Günlük dosyalarını filtreleyip sıralamak, bunun klasik bir örneğidir:

grep "ERROR" uygulama.log | sort | uniq -c | sort -rn

Bu tek satır, log dosyasındaki hata satırlarını bulur, sıralar, tekrarları sayar ve en sık görüleni üste çıkarır. Bash'in gücü büyük ölçüde bu tür küçük araçları zincirlemekten gelir. Resmi GNU Bash referans kılavuzu, bu yapıların tamamını ayrıntılı biçimde belgeler.

Düzenli ifadeler (regular expressions), metin işlemede bir başka güçlü katmandır. grep -E ile karmaşık desenler arayabilir, sed ile metni yerinde değiştirebilirsiniz:

sed -i 's/http:/https:/g' config.txt

Bu komut, config.txt dosyasındaki tüm http: geçişlerini https: ile değiştirir. -i seçeneği değişikliği doğrudan dosya üzerinde uygular. Düzenli ifadeleri öğrenmek başta biraz vakit alır, ama metin işleme görevlerinde kazandırdığı hız bu yatırıma fazlasıyla değer.

Betik yazmayı öğrenmenin en pratik yolu, günlük rutininizdeki tekrarlayan bir görevi seçip onu otomatikleştirmektir. Küçük bir yedekleme betiğiyle başlayabilir, zamanla hata kontrolü ve argüman işleme ekleyerek betiği olgunlaştırabilirsiniz. Bir süre sonra, elle yaptığınız hemen her tekrarlayan işi bir betiğe dönüştürebileceğinizi fark edersiniz.

Celil Uyanikoglu

Yazan Celil Uyanikoglu

Bilgisayar mühendisiyim; 25 yılı aşkın süredir bilgi işlem sektörünün içindeyim. Bu blogu 2020'de, işimde her gün karşılaştığım sorunların çözümlerini bir yere yazmak için açtım: Linux, güvenlik, tarayıcılar, yapay zeka araçları. Yazdığım her rehberi önce kendi bilgisayarımda ya da sunucumda deniyorum; çalıştığını görmediğim adımı yayınlamam. Hatalı ya da eskimiş bir şey görürsen iletişim sayfasından yaz — düzeltirim.

Yorum

Henüz yorum yok.

Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.

Yorum yap

E-posta adresin yayınlanmaz. Yorumlar moderasyondan sonra yayınlanır.

Sırada

İlgili notlar

jekcms 61602b0e6293b42004a1