Her gün aynı komutları tekrar tekrar mı yazıyorsunuz? Bash script yazarak bu işlemleri otomatikleştirebilirsiniz. Sistem yönetiminden dosya işlemlerine, yedeklemeden log analizine kadar pek çok görevi tek bir komutla halletmek mümkün.
Bash Script Nedir?
Bash (Bourne Again Shell), Linux ve Unix sistemlerinin varsayılan komut yorumlayıcısı. Bash script, bu kabukta çalıştırılacak komutları içeren metin dosyasıdır.
Script yazmanın avantajları: Tekrarlayan görevleri otomatikleştirir. İnsan hatasını azaltır. Karmaşık işlemleri basitleştirir. Dokümantasyon görevi görür.
İlk Script
Metin editörüyle yeni bir dosya oluşturun:
nano merhaba.sh
İçeriği:
#!/bin/bash echo "Merhaba Dünya!"
Shebang Satırı
İlk satırdaki #!/bin/bash "shebang" veya "hashbang" olarak adlandırılır. Sistemce hangi yorumlayıcının kullanılacağını belirtir.
#!/bin/bash: Bash kabuğu #!/bin/sh: POSIX uyumlu kabuk #!/usr/bin/env bash: Taşınabilir yöntem
Scripti Çalıştırma
Önce çalıştırma izni verin:
chmod +x merhaba.sh
Sonra çalıştırın:
./merhaba.sh
Veya doğrudan bash ile:
bash merhaba.sh
Değişkenler
Değişken Tanımlama
Bash'te değişken tanımlamak basit. Eşittir işareti etrafında boşluk olmamalı.
isim="Ahmet" yas=25 echo "Merhaba $isim, yaşınız $yas"
Süslü parantez kullanımı:
dosya="rapor" echo "${dosya}_2024.txt"
Komut Çıktısını Değişkene Atama
tarih=$(date +%Y-%m-%d) dosya_sayisi=$(ls | wc -l) echo "Bugün: $tarih, Dosya sayısı: $dosya_sayisi"
Ortam Değişkenleri
$HOME: Kullanıcı ana dizini $USER: Kullanıcı adı $PWD: Mevcut dizin $PATH: Komut arama yolları
Özel Değişkenler
$0: Script adı $1, $2...: Pozisyonel parametreler $#: Parametre sayısı $@: Tüm parametreler $?: Son komutun çıkış kodu $$: Script'in PID'i
Kullanıcı Girdisi
read komutuyla kullanıcıdan girdi alınır:
echo "Adınızı girin:" read isim echo "Merhaba $isim!"
Tek satırda:
read -p "Adınızı girin: " isim
Gizli girdi (şifre için):
read -sp "Şifrenizi girin: " sifre
Koşullu İfadeler
if-else Yapısı
if [ koşul ]; then
koşul doğruysa
elif [ diğer_koşul ]; then
diğer koşul doğruysa
else
hiçbiri değilse
fi
Karşılaştırma Operatörleri
Sayısal karşılaştırma: -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
if [ $yas -ge 18 ]; then echo "Yetişkin" fi
String karşılaştırma: =: Eşit !=: Eşit değil -z: Boş string -n: Boş olmayan string
if [ "$isim" = "Ahmet" ]; then echo "Hoşgeldin Ahmet!" fi
Dosya Testleri
-e: Dosya var mı -f: Normal dosya mı -d: Dizin mi -r: Okunabilir mi -w: Yazılabilir mi -x: Çalıştırılabilir mi -s: Boyutu sıfırdan büyük mü
if [ -f "/etc/passwd" ]; then echo "Dosya mevcut" fi
if [ -d "$HOME/belgeler" ]; then echo "Dizin var" fi
Mantıksal Operatörler
&&: Ve (AND) ||: Veya (OR) !: Değil (NOT)
if [ -f dosya.txt ] && [ -r dosya.txt ]; then echo "Dosya var ve okunabilir" fi
Modern test sözdizimi (çift köşeli parantez):
if [[ $isim == "Ahmet" && $yas -gt 18 ]]; then echo "Yetişkin Ahmet" fi
case İfadesi
Birden fazla koşul için:
read -p "Seçiminiz (1-3): " secim case $secim in 1) echo "Birinci seçenek" ;; 2) echo "İkinci seçenek" ;; 3) echo "Üçüncü seçenek" ;; *) echo "Geçersiz seçim" ;; esac
Döngüler
for Döngüsü
Liste üzerinde:
for meyve in elma armut kiraz; do echo "Meyve: $meyve" done
Sayı aralığında:
for i in {1..5}; do echo "Sayı: $i" done
C tarzı:
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ü
sayac=1 while [ $sayac -le 5 ]; do echo "Sayaç: $sayac" ((sayac++)) done
Dosya satırlarını okuma:
while read satir; do echo "$satir" done < dosya.txt
until Döngüsü
Koşul doğru olana kadar çalışır:
sayac=1 until [ $sayac -gt 5 ]; do echo "Sayaç: $sayac" ((sayac++)) done
Döngü Kontrolü
break: Döngüyü sonlandırır continue: Sonraki iterasyona geçer
for i in {1..10}; do if [ $i -eq 5 ]; then continue fi if [ $i -eq 8 ]; then break fi echo $i done
Fonksiyonlar
Fonksiyon Tanımlama
selamla() { echo "Merhaba $1!" }
selamla "Ahmet"
Alternatif sözdizimi:
function selamla { echo "Merhaba $1!" }
Parametreler ve Dönüş Değeri
topla() { local sonuc=$(($1 + $2)) echo $sonuc }
sonuc=$(topla 5 3) echo "Toplam: $sonuc"
return ile çıkış kodu döndürme:
dosya_var_mi() { if [ -f "$1" ]; then return 0 else return 1 fi }
if dosya_var_mi "/etc/passwd"; then echo "Dosya mevcut" fi
Yerel Değişkenler
local anahtar kelimesiyle fonksiyon içi değişkenler tanımlanır:
fonksiyon() { local yerel_degisken="sadece burada" echo $yerel_degisken }
Dizi (Array) İşlemleri
Dizi Tanımlama
meyveler=("elma" "armut" "kiraz")
Elemana Erişim
echo ${meyveler[0]} # elma
echo ${meyveler[@]} # tüm elemanlar
echo ${#meyveler[@]} # eleman sayısı
Dizi Üzerinde Döngü
for meyve in "${meyveler[@]}"; do echo "$meyve" done
Hata Yönetimi
Çıkış Kodları
Her komut bir çıkış kodu döner. 0 başarı, diğerleri hata.
komut if [ $? -eq 0 ]; then echo "Başarılı" else echo "Hata oluştu" fi
set Seçenekleri
set -e: Hata durumunda scripti durdur set -u: Tanımsız değişken kullanımında hata ver set -o pipefail: Pipe'ta hata yakala
Genellikle script başında:
#!/bin/bash set -euo pipefail
Hata Yakalama
trap komutuyla hata yakalama:
temizle() { echo "Temizlik yapılıyor..." rm -f /tmp/gecici_dosya }
trap temizle EXIT
Pratik Örnekler
Yedekleme Scripti
#!/bin/bash set -euo pipefail
KAYNAK="/var/www" HEDEF="/backup" TARIH=$(date +%Y%m%d_%H%M%S) ARSIV="yedek_$TARIH.tar.gz"
echo "Yedekleme başlıyor..." tar -czvf "$HEDEF/$ARSIV" "$KAYNAK" echo "Yedekleme tamamlandı: $ARSIV"
Eski yedekleri temizle (30 günden eski)
find "$HEDEF" -name "yedek_*.tar.gz" -mtime +30 -delete echo "Eski yedekler temizlendi"
Disk Kullanım Uyarısı
#!/bin/bash
ESIK=80 KULLANIM=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ $KULLANIM -gt $ESIK ]; then echo "UYARI: Disk kullanımı %$KULLANIM"
Mail gönderilebilir
fi
Log Analizi
#!/bin/bash
LOG_DOSYASI="/var/log/auth.log" BASARISIZ=$(grep "Failed password" "$LOG_DOSYASI" | wc -l)
echo "Başarısız giriş denemesi sayısı: $BASARISIZ"
En çok deneme yapan IP'ler
echo "En çok deneme yapan IP'ler:" grep "Failed password" "$LOG_DOSYASI" | \ awk '{print $(NF-3)}' | \ sort | uniq -c | sort -rn | head -5
Toplu Dosya İşleme
#!/bin/bash
for dosya in *.jpg; do if [ -f "$dosya" ]; then yeni_isim="${dosya%.jpg}_$(date +%Y%m%d).jpg" mv "$dosya" "$yeni_isim" echo "Yeniden adlandırıldı: $yeni_isim" fi done
İyi Pratikler
Yorumlar ekleyin: Karmaşık bölümleri açıklayın. Anlamlı değişken isimleri kullanın: d yerine dizin yazın. Değişkenleri tırnak içine alın: "$degisken" şeklinde. set -euo pipefail kullanın: Hataları yakalayın. Fonksiyonlarla organize edin: Tekrar kullanılabilir kod yazın. ShellCheck kullanın: Statik analiz aracı hataları bulur.
Hata Ayıklama
bash -x script.sh: Her komutu çalıştırmadan önce gösterir. set -x: Script içinde debug modu açar. set +x: Debug modunu kapatır.
Sonuç
Bash scripting güçlü bir otomasyon aracı. Basit görevlerden karmaşık sistem yönetimi işlemlerine kadar geniş kullanım alanı var.
Temel yapıları öğrendikten sonra pratik yaparak ilerlemeniz önemli. Gerçek problemleri çözmek için scriptler yazmak en iyi öğrenme yöntemi.
Scriptlerinizi versiyon kontrolüyle (Git) yönetin, test edin ve dokümante edin. İyi yazılmış bir script uzun yıllar sorunsuz çalışır.
0 Yorum
Yorum Yaz