Bash Script Yazma Rehberi: Otomasyon İçin Kapsamlı Kılavuz

Her gün aynı komutları tekrar tekrar mı yazıyorsunuz? Bash script yazarak bu işlemleri otomatikleştirebilirsiniz. Sistem yönetiminden dosya...

Linux
Bash Script Yazma Rehberi: Otomasyon İçin Kapsamlı Kılavuz

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.

Celil Uyanikoglu

Yazan Celil Uyanikoglu

25 yıldır bilgi işlem piyasasında farklı dallarda uzmanlaşan bir Bilgisayar Mühendisi

Yorum

Henüz yorum yok.

Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.

Yorum yap

E-posta adresin yayınlanmaz. Yorumlar moderasyondan sonra yayınlanır.

Sırada

İlgili notlar