Bash Script Yazma Rehberi
Aynı komutları her gün elle yazıyorsan, o komutlar zaten bir script olmak istiyor. Log temizleme, yedek alma, proje kurulumu, dosya adı düzeltme... Hepsi tekrarlı. Tekrarlı olan her şey otomatikleştirilebilir.
bash script otomasyonu için yeni bir dil öğrenmen gerekmez. Terminalde bildiğin komutlar zaten yeterli. Script, o komutları sıraya dizmek ve karar verdirmekten ibaret. Aşağıda sıfırdan çalışan bir script yazacak, sonra onu güvenli hale getireceksin.
Tek şart: terminalde temel hareket edebiliyor olmak. cd, ls, cp gibi komutlar yabancıysa önce Linux terminali başlangıç rehberine göz atman işini kolaylaştırır.
İlk Scriptini Yazmak ve Çalıştırmak
Script bir metin dosyasıdır. Sihir yok. Yalnızca birkaç kural var.
Shebang, izin ve çalıştırma
Her script şu satırla başlar:
#!/usr/bin/env bash
Bu satır sisteme "bunu bash ile yorumla" der. #!/bin/bash da olur ama env kullanmak farklı sistemlerde daha taşınabilirdir.
Sonrası basit adımlar:
- Dosyayı oluştur:
yedek.sh - Shebang satırını yaz.
- Komutlarını alt alta ekle.
- İzin ver:
chmod +x yedek.sh - Çalıştır:
./yedek.sh
Uzantı zorunlu değil ama .sh koymak dosyayı tanımayı kolaylaştırır. Scriptlerini ~/bin klasöründe topla ve bu klasörü PATH'e ekle. Böylece her yerden isimle çağırabilirsin.
Değişkenler ve parametreler
Değişken tanımlarken eşittir işaretinin iki yanında boşluk olmaz:
KAYNAK="/home/kullanici/proje"
HEDEF="/mnt/yedek"
Kullanırken tırnak içinde ve süslü parantezle yaz: "${KAYNAK}". Tırnak, boşluk içeren dosya adlarında hayat kurtarır. Tırnaksız değişken, bash script otomasyonunda en sık görülen hata kaynağıdır.
Script'e dışarıdan veri geçebilirsin:
$1,$2: birinci ve ikinci argüman$@: tüm argümanlar$#: argüman sayısı$0: script'in kendi adı
Komut çıktısını değişkene almak için $( ) kullan: TARIH=$(date +%F). Ters tırnak eski yöntem, artık tercih edilmiyor.
Karar ve döngü
Kontrol yapısı olmadan script sadece bir liste olur. İki temel kalıbı ezberle.
Koşul:
if [[ -d "$HEDEF" ]]; then
echo "klasör var"
else
mkdir -p "$HEDEF"
fi
Sık kullanılan testler:
| Test | Anlamı |
|---|---|
| -f dosya | Dosya var mı |
| -d klasör | Klasör var mı |
| -z "$x" | Değişken boş mu |
| -n "$x" | Değişken dolu mu |
| "$a" == "$b" | Metin eşitliği |
| $a -gt $b | Sayı karşılaştırma |
Döngü:
for f in *.log; do
gzip "$f"
done
Fonksiyon yazmayı da erken öğren. Aynı üç satırı iki yerde tekrarlıyorsan fonksiyona çevir:
log() {
echo "[$(date +%T)] $*"
}
Scripti Güvenli ve Kalıcı Hale Getirmek
Çalışan script yeterli değil. Yarın yanlış klasörde çalıştığında ne olacağını da düşünmen gerekir.
Hata yönetimi: üç satırlık sigorta
Shebang'in hemen altına şunu ekle:
set -euo pipefail
- -e: bir komut hata verirse script durur.
- -u: tanımsız değişken kullanılırsa durur.
- -o pipefail: pipe zincirindeki hata gizlenmez.
Bu satır olmadan script hatalı komuttan sonra devam eder ve yanlış iş yapar. Silme işlemi içeren scriptlerde bu tehlikelidir.
Ek olarak:
- Yıkıcı işlemler öncesi
echoile kuru çalıştırma modu koy.DRY_RUN=1gibi bir değişken yeterli. - Geçici dosyaları
mktempile üret,trap 'rm -rf "$TMP"' EXITile temizle. - Hata mesajlarını
>&2ile hata çıkışına yaz. - Çıkış kodu döndür: başarı 0, hata sıfırdan farklı.
Test etme ve okunabilirlik
Scripti canlı veriyle test etme. Önce kopya klasörde dene.
bash -n script.sh: sadece söz dizimini kontrol eder, çalıştırmaz.bash -x script.sh: her satırı çalışırken gösterir. Hata avında en hızlı yol.shellcheck script.sh: tırnaksız değişken, yanlış test gibi klasik hataları söyler. Kurup alışkanlık yap.
Okunabilirlik için yorum satırı yaz ama "ne yaptığını" değil "neden yaptığını" anlat. Uzun sed veya grep ifadelerinin üstüne mutlaka açıklama koy; regex kalıplarını altı ay sonra kendin de çözemezsin.
Zamanlama ve paylaşma
Script hazırsa elle çağırmayı bırak.
crontab -eile zamanlanmış görev ekle.© 2026 Yazılım Atölyesi