Bash Betiği ile Tekrarlayan İşleri Otomatikleştirme Rehberi
Her gün aynı komutları elle yazıp duruyorsanız, bu işi bir kez yazıp sonsuza dek otomatikleştirebilirsiniz. Bash betikleri tam olarak bunun için var: birden fazla komutu tek bir dosyada toplar, mantık ekler ve istediğiniz zaman çalıştırırsınız. Bu rehber, sıfırdan başlayarak çalışan bir otomasyon betiği yazmanın tüm temel adımlarını pratik örneklerle anlatır.
Shebang: Betiğin İlk Satırı
Her Bash betiği, yorumlayıcıyı belirten bir shebang satırıyla başlar. Bu satır, dosyanın hangi programla çalıştırılacağını sisteme söyler.
#!/usr/bin/env bash
#!/usr/bin/env bash kullanmak, bash'in PATH üzerinde nerede olduğunu otomatik bulduğu için #!/bin/bash'ten daha taşınabilirdir. Bunun hemen ardından, betiğinizi daha güvenli hale getiren şu satırı eklemek iyi bir alışkanlıktır:
#!/usr/bin/env bash
set -euo pipefail
-e: Bir komut hata verirse betik durur.-u: Tanımsız bir değişken kullanılırsa hata verir.-o pipefail: Pipe içindeki herhangi bir komut başarısız olursa tüm pipe başarısız sayılır.
Değişkenler ve Komut Yer Değiştirme
Değişken tanımlarken eşittir işaretinin etrafında boşluk olmamalıdır. Değeri kullanırken başına $ koyarsınız.
isim="MagmaNex"
echo "Merhaba $isim"
Bir komutun çıktısını bir değişkene atamak için komut yer değiştirme (command substitution) kullanılır. $( ... ) biçimi tercih edilir:
bugun=$(date +%Y-%m-%d)
dosya_sayisi=$(ls -1 | wc -l)
echo "$bugun tarihinde $dosya_sayisi dosya var"
Değişkenleri her zaman çift tırnak içinde kullanın ("$dosya"). Bu, içinde boşluk bulunan yollarda yaşanan klasik hataları önler.
Koşullar ve Döngüler
Otomasyonun gücü, betiğin karar verebilmesinden gelir. if ile koşul kurarsınız:
if [[ -f "/etc/hosts" ]]; then
echo "Dosya mevcut"
else
echo "Dosya bulunamadı"
fi
Sık kullanılan test operatörleri:
-f dosya— normal bir dosya mı?-d dizin— bir dizin mi?-z "$str"— değişken boş mu?"$a" == "$b"— iki dize eşit mi?
Çok sayıda öğe üzerinde aynı işlemi yapmak için for döngüsü kullanılır:
for log in /var/log/*.log; do
echo "İşleniyor: $log"
gzip "$log"
done
Bir koşul sağlandığı sürece tekrar etmek için while döngüsü uygundur:
sayac=1
while [[ $sayac -le 5 ]]; do
echo "Deneme $sayac"
sayac=$((sayac + 1))
done
Argümanlar: $1, $@ ve Arkadaşları
Betiğinizi esnek hale getirmenin yolu, çalıştırılırken argüman kabul etmesidir. Bash, bu argümanları özel değişkenlerle sunar:
$0— betiğin kendi adı$1,$2, ... — sırayla birinci, ikinci argüman$@— tüm argümanlar (her biri ayrı)$#— argüman sayısı
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -lt 1 ]]; then
echo "Kullanım: $0 <dizin>"
exit 1
fi
hedef="$1"
echo "$hedef dizinindeki dosyalar yedekleniyor..."
for dosya in "$hedef"/*; do
cp "$dosya" "$dosya.bak"
done
Burada $# ile argüman sayısını kontrol edip eksikse kullanım mesajı gösteriyoruz. exit 1 betiği hata koduyla sonlandırır; bu, başka betiklerden çağrıldığında önemlidir.
İşinize Yarayacak Birkaç Tek Satırlık Komut
Otomasyon her zaman uzun betikler gerektirmez. İşte günlük hayatı kolaylaştıran bazı one-liner örnekleri:
# 7 günden eski .tmp dosyalarını sil
find . -name "*.tmp" -mtime +7 -delete
# En çok yer kaplayan 10 dizin
du -sh */ | sort -rh | head -n 10
# Bir metni tüm dosyalarda topluca değiştir
grep -rl "eski_metin" . | xargs sed -i 's/eski_metin/yeni_metin/g'
# Anlık olarak basit bir HTTP sunucusu başlat
python3 -m http.server 8000
Betiği Çalıştırılabilir Yapmak
Bir betiği ./betik.sh şeklinde çalıştırabilmek için ona çalıştırma izni vermeniz gerekir. Bunun için chmod kullanılır:
chmod +x betik.sh
./betik.sh
İzinleri sayısal (octal) biçimde de verebilirsiniz. Her hane okuma (4), yazma (2) ve çalıştırma (1) izinlerinin toplamıdır:
chmod 755 betik.sh # sahip: rwx, grup: r-x, diğer: r-x
chmod 700 gizli.sh # yalnızca sahip her şeyi yapabilir
755 ile 700 arasındaki farkı kafanızda canlandırmakta zorlanırsanız, chmod İzin Hesaplayıcı aracıyla hangi sayının hangi izinlere karşılık geldiğini anında görebilirsiniz.
Cron ile Zamanlama
Betiğiniz hazır; peki onu her gece otomatik çalıştırmak isterseniz? İşte burada cron devreye girer. crontab -e komutuyla zamanlanmış görevlerinizi düzenlersiniz. Bir cron satırı beş zaman alanı ve bir komuttan oluşur:
# dakika saat gün ay haftanın_günü komut
0 3 * * * /home/kullanici/yedek.sh
Yukarıdaki satır, betiği her gün saat 03:00'te çalıştırır. Birkaç yaygın örnek:
*/15 * * * * /opt/scripts/kontrol.sh # her 15 dakikada bir
0 0 * * 0 /opt/scripts/haftalik.sh # her pazar gece yarısı
30 8 1 * * /opt/scripts/aylik.sh # her ayın 1'inde 08:30
Bu yıldız ve sayı dizilimleri ilk başta kafa karıştırıcı olabilir. Var olan bir ifadenin tam olarak ne anlama geldiğini çözmek için Crontab Açıklayıcı aracını, sıfırdan doğru ifadeyi üretmek içinse Cron İfadesi Oluşturucu aracını kullanabilirsiniz.
Toparlarken
Artık bir otomasyon betiğinin tüm parçalarına sahipsiniz: shebang ile başlatma, değişken ve komut yer değiştirme, koşullar ve döngülerle mantık, argümanlarla esneklik, chmod ile izin verme ve cron ile zamanlama. Bir sonraki adım, depolarınızda gereksiz dosyaların betiklerinizi kirletmesini önlemek olabilir; bunun için .gitignore Oluşturucu aracı işinizi kolaylaştırır.
Küçük başlayın: bugün elle yaptığınız tek bir tekrarlayan işi seçin ve onu bir betiğe dönüştürün. Zamanla bu betikler, sizin için sessizce çalışan küçük bir asistan ordusuna dönüşecek.
MagmaNex'teki tüm araçlar tamamen tarayıcınızda çalışır; hiçbir veriniz sunucuya gönderilmez.

