aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Araçlar & DevOps

Bash Script Yazma: Otomasyona Sıfırdan Başlangıç

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ç.

Bu kategorideki tüm yazılar →

Devamı için