Shell script, yazarken Bash fonksiyonları hayat kurtarıcı oluyor. Bu yazıda paylaşacağım 10 Bash fonksiyonu sayesinde daha temiz, güvenli ve yeniden kullanılabilir script’ler oluşturabilirsiniz. Script’lerinizi geliştirmek ve iş yükünüzü hafifletmek için aşağıdaki pratik fonksiyonları kullanmaya başlamanızı şiddetle tavsiye ederim. Temiz Shell script yazmanın yollarına gelin beraber bakalım.

Shell Script Nedir?

Shell Script, Unix/Linux sistemlerinde kullanılan ve komut satırından çalıştırılan küçük program parçalarıdır. Genellikle rutin görevleri otomatikleştirmek, sistem yönetimi yapmak ve hızlı işlemler gerçekleştirmek için tercih edilir.

Daha fazla bilgi için: Shell Scripting Nedir?

log(): Basit Bir Logger ile Zaman Damgası Kullanın

log() {
  local level="$1"; shift
  local timestamp
  timestamp=$(date "+%Y-%m-%d %H:%M:%S")
  echo "[$timestamp] [$level] $*" >&2
}

log() fonksiyonu, script içinde standart formatta log tutmayı sağlar. Her log mesajında tarih, saat ve log seviyesi (error, info, warning) bulunur. Özellikle debugging ve production ortamları için idealdir.

Kullanım Örneği

log "INFO" "Deployment started"
log "ERROR" "Failed to connect to the database"

Örnek Çıktı

Temiz Shell Script Yazmanın Yolları

retry(): Komutları Otomatik Tekrarlama

retry() {
  local retries="$1"; shift
  local count=0 exit_code=0
  until "$@"; do
    exit_code=$?
    ((count++))
    if ((count >= retries)); then
      log "ERROR" "Command failed after $retries attempts: $*"
      return "$exit_code"
    fi
    log "WARN" "Retrying ($count/$retries)..."
    sleep $((count * 2))
  done
}

retry() fonksiyonu, komutların başarısız olması halinde belirtilen sayıda tekrar çalıştırır. HTTP API gibi kararsız servislerle çalışırken çok faydalıdır.

Kullanım Örneği

retry 5 curl -sf http://localhost:8080/healthz

Örnek Çıktı

image 3

check_required_env(): Çevresel Değişkenleri Kontrol Etme

check_required_env() {
  for var in "$@"; do
    if [[ -z "${!var:-}" ]]; then
      log "ERROR" "Missing required environment variable: $var"
      exit 1
    fi
  done
}

check_required_env() fonksiyonu, script çalışmadan önce gerekli olan çevresel değişkenleri kontrol eder. Eksik bir değişken varsa script çalışmayı durdurur ve hata mesajı verir.

Kullanım Örneği

check_required_env AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY

Örnek Çıktı

image 4

load_config(): .env Dosyalarını Yükleme

load_config() {
  local config_file="$1"
  [[ -f "$config_file" ]] || { log "ERROR" "Config file not found: $config_file"; return 1; }

  while IFS='=' read -r key value || [[ -n "$key" ]]; do
    [[ "$key" =~ ^\s*# ]] || [[ -z "$key" ]] && continue
    key=$(echo "$key" | xargs)
    value=$(echo "$value" | sed 's/^"\(.*\)"$/\1/' | xargs)
    export "$key=$value"
  done < "$config_file"
}

load_config() fonksiyonu, çevresel ayarları ayrı bir dosyadan yükleyerek scriptleri daha temiz tutmayı sağlar. Bu yöntem, 12-factor uygulama prensiplerine uygundur ve yapılandırma yönetimini kolaylaştırır.

Kullanım Örneği

load_config "./myapp.env"

Örnek Çıktı

image 5

safe_rm(): Güvenli Silme İşlemi

safe_rm() {
  local file="$1"
  [[ -e "$file" ]] || { log "WARN" "File not found: $file"; return 1; }

  local trash_dir="$HOME/.trash"
  mkdir -p "$trash_dir"
  local base
  base=$(basename "$file")
  local timestamp
  timestamp=$(date +%s)
  mv "$file" "$trash_dir/${base}_${timestamp}_$$" && \
    log "INFO" "Moved $file to trash instead of deleting"
}

safem_rm() fonksiyonu, dosyaları silmek yerine bir çöp klasörüne (trash) taşır. Bu yöntem yanlışlıkla yapılan dosya silme işlemlerinde büyük bir güvenlik sağlar.

Kullanım Örneği

safe_rm "config.yml"

Örnek Çıktı

image 6

confirm(): İşlem Onayı İsteme

confirm() {
  local prompt="${1:-Are you sure?} (y/n): "
  while true; do
    read -rn 1 -p "$prompt" response
    echo
    case "${response,,}" in
      y) return 0 ;;
      n) return 1 ;;
      *) echo "Please enter y or n." ;;
    esac
  done
}

confirm() fonksiyonu, kritik işlemleri gerçekleştirmeden önce kullanıcıdan onay ister. Yanlışlıkla önemli verileri silmenizi önleyerek daha güvenli işlem yapmanızı sağlar.

Kullanım Örneği

if confirm "Are you sure you want to delete production DB?"; then
  delete_database
fi

Örnek Çıktı

image 7

monitor_usage(): CPU ve Bellek Kullanımı İzleme

monitor_usage() {
  if [[ "$(uname)" == "Darwin" ]]; then
    echo "CPU: $(top -l 1 | awk '/CPU usage/ {gsub(/%/, ""); print $3+$5}')%"
    echo "Memory: $(top -l 1 | awk '/PhysMem/ {
                     gsub(/M/,""); used=$2; free=$(NF-1);
                     printf("%.2f", used/(used+free)*100)}')%"
  else
    echo "CPU: $(top -bn1 | awk -F'[, ]+' '/^%?Cpu/ {print $2+$4}')%"
    echo "Memory: $(free -m   | awk          '/^Mem:/ {printf("%.2f", $3/$2*100)}')%"
  fi
}

monitor_usage() fonksiyonu ile sistemin CPU ve bellek kullanımını hızlıca kontrol edebilirsiniz. Sistem sağlığını izlemeniz gerektiğinde hızlı sonuçlar sunar.

Kullanım Örneği

monitor_usage

Örnek Çıktı

image 8

require_command(): Komut Bağımlılıklarını Kontrol Etme

require_command() {
  [[ $# -eq 0 ]] && { echo "require_command: no args" >&2; return 1; }
  for cmd; do
    command -v "$cmd" >/dev/null 2>&1 || {
      echo "ERROR: missing required command: $cmd" >&2
      exit 1
    }
  done
}

require_command() fonksiyonu, scriptin çalışması için gereken komutların varlığını kontrol eder. Eksik komut varsa script hemen hata verir ve böylece ileride oluşabilecek sorunlar engellenmiş olur.

Örnek Çıktı

image 9

Kullanım Örneği

require_command jq docker aws

wrap_with_timer(): Çalıştırma Süresini Ölçme

wrap_with_timer() {
  local start end elapsed
  start=$(date +%s)
  "$@"
  local exit_code=$?
  end=$(date +%s)
  elapsed=$((end - start))
  log "INFO" "Command '$*' completed in ${elapsed}s"
  return $exit_code
}

wrap_with_timer() fonksiyonu, çalıştırılan komutun ne kadar sürede tamamlandığını ölçer. Performans optimizasyonları için önemli bilgiler sağlar.

Kullanım Örneği

wrap_with_timer run_long_script

Örnek Çıktı

image 10

cleanup(): Geçici Dosyaları Temizleme

cleanup() {
  log "INFO" "Cleaning up..."
  rm -f /tmp/my-temp-file
}
trap cleanup EXIT

cleanup() fonksiyonu, script’in beklenmedik şekilde durması ya da tamamlanması durumunda geçici dosyaların temizlenmesini sağlar. Böylece sistemin temiz kalmasına yardımcı olur.

Kullanım Örneği

cleanup

Örnek Çıktı

image 11

Temiz Shell Script Yazmanın Yolları ile Hangi Hataları Önleyebilirsiniz?

  • Yanlışlıkla önemli dosyaların silinmesi veya kaybolması
  • Eksik veya hatalı çevresel değişkenlerin kullanılmasından kaynaklı hata ve çökmeler
  • Gerekli komut veya bağımlılıkların bulunmaması sebebiyle scriptlerin çalışmaması
  • Uzun süren işlemlerde performans ve zaman yönetimi eksiklikleri
  • Kullanıcı onayı olmadan kritik ve geri döndürülemeyen işlemlerin gerçekleşmesi
  • Sistem kaynaklarının etkin bir şekilde izlenmemesi ve yönetilmemesi
  • Geçici dosya ve kalıntıların sistemde gereksiz yere yer kaplaması

Bu maddeleri dikkate alarak scriptlerinizi daha temiz, daha güvenli ve yönetilebilir hale getirebilirsiniz.

Sonuç

Bu 10 Bash fonksiyonu sayesinde scriptlerinizi daha güvenilir, temiz ve bakımı kolay hale getirebilirsiniz. Shell script yazarken bu fonksiyonları sıkça kullanarak zaman ve enerji tasarrufu sağlayabilirsiniz.

İlginizi çekerse En İyi 17 Adet Linux Ağ ve Sorun Giderme Komutları yazıma da göz gezdirebilirsiniz.