Bash scripting, Linux'ta tekrarlayan görevleri otomatikleştirmenin en etkili yoludur. Yedekleme, log temizleme, sistem izleme gibi işleri manuel yapmak yerine script yazarak otomatik hale getirebilirsiniz. İlk Script
Basit bir script oluşturalım:
nano merhaba.sh
İçeriği:
#!/bin/bash echo "Merhaba Dünya!"
İlk satırdaki #!/bin/bash "shebang" olarak adlandırılır. Scriptin Bash ile çalıştırılacağını belirtir.
Çalıştırma izni verin ve çalıştırın:
chmod +x merhaba.sh ./merhaba.sh
Değişkenler
Değişkenler veri saklamak için kullanılır.
Tanımlama ve Kullanma
#!/bin/bash isim="Ahmet" yas=25
echo "Merhaba $isim" echo "Yaşınız: $yas"
Dikkat: Eşittir işaretinin etrafında boşluk olmaz.
Özel Değişkenler
$0: Script adı $1, $2...: Argümanlar $#: Argüman sayısı $@: Tüm argümanlar $?: Son komutun çıkış kodu $$: Script'in PID'si
Örnek:
#!/bin/bash echo "Script adı: $0" echo "İlk argüman: $1" echo "Argüman sayısı: $#"
Kullanıcı Girdisi
read komutu ile kullanıcıdan veri alın:
#!/bin/bash echo "Adınızı girin:" read isim echo "Merhaba $isim!"
Tek satırda:
read -p "Adınızı girin: " isim
Gizli girdi (parola için):
read -sp "Parola: " parola
Aritmetik İşlemler
Bash'te hesaplama yapmanın birkaç yolu var:
$(( )) ile:
#!/bin/bash a=10 b=3
toplam=$((a + b)) fark=$((a - b)) carpim=$((a * b)) bolum=$((a / b)) mod=$((a % b))
echo "Toplam: $toplam" echo "Fark: $fark"
let ile:
let "sonuc = 5 * 4" echo $sonuc
Koşullu İfadeler (if-else)
Temel Yapı
#!/bin/bash sayi=10
if [ $sayi -gt 5 ]; then echo "Sayı 5'ten büyük" elif [ $sayi -eq 5 ]; then echo "Sayı 5'e eşit" else echo "Sayı 5'ten küçük" fi
Karşılaştırma Operatörleri
Sayısal: -eq: Eşit -ne: Eşit değil -gt: Büyük -lt: Küçük -ge: Büyük veya eşit -le: Küçük veya eşit
String: =: Eşit !=: Farklı -z: Boş -n: Dolu
Dosya Testleri
Dosya testleri çok kullanışlıdır:
#!/bin/bash dosya="/etc/passwd"
if [ -f "$dosya" ]; then echo "Dosya mevcut" fi
if [ -d "/home" ]; then echo "Dizin mevcut" fi
if [ -r "$dosya" ]; then echo "Dosya okunabilir" fi
Test operatörleri: -f: Dosya mı -d: Dizin mi -e: Var mı -r: Okunabilir mi -w: Yazılabilir mi -x: Çalıştırılabilir mi -s: Boş değil mi
case Yapısı
Çoklu seçenek için:
#!/bin/bash read -p "Seçiminizi girin (1-3): " secim
case $secim in 1) echo "Bir seçtiniz" ;; 2) echo "İki seçtiniz" ;; 3) echo "Üç seçtiniz" ;; *) echo "Geçersiz seçim" ;; esac
Döngüler
for Döngüsü
Liste üzerinde:
#!/bin/bash for isim in Ahmet Mehmet Ayşe; do echo "Merhaba $isim" done
Sayı aralığı:
for i in {1..5}; do echo "Sayı: $i" done
C stili:
for ((i=0; i<5; i++)); do echo "İndeks: $i" done
Dosyalar üzerinde:
for dosya in *.txt; do echo "İşleniyor: $dosya" done
while Döngüsü
#!/bin/bash sayac=1
while [ $sayac -le 5 ]; do echo "Sayaç: $sayac" ((sayac++)) done
Sonsuz döngü:
while true; do echo "Çalışıyor..." sleep 5 done
until Döngüsü
Koşul doğru olana kadar çalışır:
#!/bin/bash sayac=1
until [ $sayac -gt 5 ]; do echo "Sayaç: $sayac" ((sayac++)) done
break ve continue
for i in {1..10}; do if [ $i -eq 5 ]; then continue # 5'i atla fi if [ $i -eq 8 ]; then break # 8'de dur fi echo $i done
Fonksiyonlar
Kod tekrarını önlemek ve düzeni sağlamak için:
#!/bin/bash
# Fonksiyon tanımı selamla() { echo "Merhaba $1!" }
# Fonksiyon çağrısı selamla "Ahmet" selamla "Mehmet"
Dönüş Değeri
toplam() { local sonuc=$(($1 + $2)) echo $sonuc }
# Sonucu yakala cevap=$(toplam 5 3) echo "Toplam: $cevap"
Diziler
#!/bin/bash # Dizi tanımı meyveler=("Elma" "Armut" "Muz")
# Elemana erişim echo ${meyveler[0]}
# Tüm elemanlar echo ${meyveler[@]}
# Eleman sayısı echo ${#meyveler[@]}
# Döngü ile for meyve in "${meyveler[@]}"; do echo $meyve done
Hata Yönetimi
Çıkış Kodları
Başarılı komutlar 0, başarısız komutlar 0 dışı değer döner.
#!/bin/bash grep "hata" /var/log/syslog
if [ $? -eq 0 ]; then echo "Hata bulundu" else echo "Hata yok" fi
set Seçenekleri
#!/bin/bash set -e # Hata olursa dur set -u # Tanımsız değişkende hata ver set -o pipefail # Pipe'da hata yakala
# Veya tek satırda set -euo pipefail
Pratik Örnekler
Yedekleme Scripti
#!/bin/bash set -euo pipefail
KAYNAK="/home/kullanici/belgeler" HEDEF="/backup" TARIH=$(date +%Y%m%d_%H%M%S) DOSYA="backup_$TARIH.tar.gz"
echo "Yedekleme başlıyor..." tar -czf "$HEDEF/$DOSYA" "$KAYNAK" echo "Yedekleme tamamlandı: $DOSYA"
# Eski yedekleri temizle (30 günden eski) find "$HEDEF" -name "backup_*.tar.gz" -mtime +30 -delete
Log Temizleme
#!/bin/bash LOG_DIR="/var/log" LIMIT=100 # MB
for log in "$LOG_DIR"/*.log; do boyut=$(du -m "$log" | cut -f1) if [ $boyut -gt $LIMIT ]; then echo "Temizleniyor: $log ($boyut MB)" > "$log" fi done
Sistem Sağlık Kontrolü
#!/bin/bash
echo "=== Sistem Durumu ===" echo ""
# Disk kullanımı echo "Disk Kullanımı:" df -h | grep -E '^/dev/'
echo ""
# Bellek echo "Bellek Kullanımı:" free -h
echo ""
# Yük echo "Sistem Yükü:" uptime
echo ""
# Çalışan servisler echo "Kritik Servisler:" for servis in nginx mysql ssh; do if systemctl is-active --quiet $servis 2>/dev/null; then echo " $servis: Çalışıyor" else echo " $servis: Çalışmıyor" fi done
Cron ile Zamanlama
Scriptleri otomatik çalıştırmak için cron kullanın:
crontab -e
Her gün gece 2'de:
0 2 * /home/kullanici/backup.sh >> /var/log/backup.log 2>&1
Her saat başı:
0 /home/kullanici/health-check.sh
İpuçları
Hata ayıklama: bash -x script.sh ile adım adım izleyin.
Değişkenleri tırnak içine alın: "$degisken" boşluk sorunlarını önler.
Yorumlar ekleyin: # ile açıklama yazın.
ShellCheck kullanın: Script hatalarını tespit eden araç.
Henüz yorum yok.
Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.