Linux Bash’te Script Yazımı: Yeni Başlayanlar ve Sistem Yöneticileri için Eksiksiz Bir Kılavuz
Bash betik yazımı, bir Linux kullanıcısının, geliştiricinin veya sistem yöneticisinin geliştirebileceği en güçlü becerilerden biridir. İster tek bir sunucu yönetiyor olun, ister tüm bir altyapı genelinde karmaşık otomatik iş akışlarını düzenliyor olun, Bash betik yazımında uzmanlaşmak manuel çabayı önemli ölçüde azaltır, insan hatalarını en aza indirir ve Linux ortamınızın tam potansiyelini ortaya çıkarır.
Bu kapsamlı kılavuzda, Bash betikleri yazma hakkında bilmeniz gereken her şeyi ele alacağız — ilk dosyanızı oluşturmaktan değişkenler, koşullar, döngüler, fonksiyonlar, argümanlar ve hata ayıklama teknikleriyle çalışmaya kadar. Boyunca pratik, kopyalayıp yapıştırmaya hazır örnekler yer almaktadır.
Bash Betiği Nedir?
Bir Bash betiği, Bash kabuğu (Bourne Again SHell) tarafından yorumlanan ve yürütülen sıralı komutlar içeren düz metin dosyasıdır. Bash, Linux dağıtımlarının büyük çoğunluğunda varsayılan etkileşimli kabuktur; bu da onu evrensel olarak erişilebilir ve hemen pratik kılar.
Terminalde aynı komut dizisini tekrar tekrar yazmak yerine, bunları bir kez bir betik dosyasına yazarsınız ve isteğe bağlı olarak çalıştırırsınız — ya da otomatik olarak çalışacak şekilde zamanlarsınız.
Bash Betiklerinin Yaygın Kullanım Alanları
- Dosya yönetimi — dosyaları toplu olarak kopyalama, taşıma, yeniden adlandırma, arşivleme ve silme
- Sistem yönetimi — süreçleri izleme, kullanıcıları yönetme, disk kullanımını kontrol etme
- Yazılım otomasyonu — paket kurma, servisleri yapılandırma, uygulama dağıtma
- Yedekleme ve kurtarma — zamanlanmış, artımlı veya tam sistem yedekleri oluşturma
- Log ayrıştırma ve raporlama — analiz için log verilerini filtreleme ve özetleme
- Sunucu sağlama — yeni bir VPS Hosting veya özel sunucu ortamının ilk kurulumunu otomatikleştirme
Ön Koşullar
Bu kılavuzu takip etmek için şunlara ihtiyacınız var:
- Bir Linux sistemi (yerel makine, VM veya uzak sunucu)
- Bir kullanıcı hesabıyla terminal erişimi (bazı işlemler için root veya sudo ayrıcalıkları)
- Linux komut satırına temel düzeyde aşinalık
Uzak bir sunucuda çalışıyorsanız, AlexHost’un VPS Hosting planları size tam root SSH erişimi sağlar; bu da onları gerçek dünya ortamında Bash betiklerini pratik yapmak ve dağıtmak için ideal kılar.
Adım 1: Bash Betik Dosyası Oluşturma
Terminalinizi açın ve .sh uzantısıyla yeni bir dosya oluşturmak için herhangi bir metin düzenleyici kullanın. .sh uzantısı, dosyanın bir kabuk betiği olduğunu belirten yaygın bir kuraldır; ancak yorumlayıcı tarafından teknik olarak zorunlu değildir.
nano myscript.shnano yerine vim, gedit, micro veya tercih ettiğiniz herhangi bir düzenleyiciyi kullanabilirsiniz.
Adım 2: Shebang Satırını Ekleme (#!)
Her Bash betiğinin ilk satırı shebang olmalıdır — işletim sistemine dosyayı çalıştırırken hangi yorumlayıcının kullanılacağını söyleyen özel bir yönerge.
#!/bin/bash
Bu satır, çekirdeğe betiği yürütmek için /bin/bash‘a iletmesini söyler; mevcut kullanıcının varsayılan olarak hangi kabuğu ayarladığından bağımsız olarak. Her zaman dahil edin — shebang’ı atlamak, betiklerin farklı ortamlarda öngörülemeyen şekilde davranmasına neden olabilir.
> İpucu: Bazı modern sistemlerde, Bash ikili dosyasını PATH aracılığıyla dinamik olarak bulan daha taşınabilir bir alternatif olan #!/usr/bin/env bash‘ı da görebilirsiniz.
Adım 3: Komutlarınızı Yazma
Shebang’dan sonra, betiğin çalıştırmasını istediğiniz komutları ekleyin. İşte mevcut kullanıcıyı selamlayan ve yararlı sistem bilgilerini görüntüleyen basit bir örnek:
#!/bin/bash
# A simple script to greet the user and display system info
echo "Hello, $USER! Welcome back."
echo "Today's date and time: $(date)"
echo "Your current working directory: $(pwd)"
echo "System hostname: $(hostname)"
Temel Öğelerin Açıklaması
Öğe
Açıklama
echo
Terminale (standart çıktıya) metin veya değişken değerleri yazdırır
$USER
Mevcut kullanıcı adını tutan yerleşik bir ortam değişkeni
$(date)
Komut değiştirme — date‘ı çalıştırır ve çıktısını satır içine ekler
$(pwd)
Mevcut çalışma dizini yolunu ekler
$(hostname)
Sistemin ana bilgisayar adını ekler
#
Bir yorum başlatır — yorumlayıcı tarafından yok sayılır, belgeleme için kullanılır
Adım 4: Betiği Çalıştırılabilir Yapma
Betiği doğrudan çalıştırabilmek için, chmod komutunu kullanarak ona çalıştırma izni vermeniz gerekir:
chmod +x myscript.sh
Bu, dosya sahibi için çalıştırma bitini ayarlar. İzinlerin doğru uygulandığını doğrulamak için şunu çalıştırın:
ls -l myscript.sh
-rwxr-xr-x gibi bir şey görmelisiniz; burada x karakterleri çalıştırma iznini onaylar.
Adım 5: Betiği Çalıştırma
Betiği aynı dizinden aşağıdaki sözdizimini kullanarak çalıştırın:
./myscript.sh
./ öneki, kabuğa sistem PATH‘ini aramak yerine dosyayı mevcut dizinde aramasını söyler. Çıktının doğrudan terminalinizde yazdırıldığını görmelisiniz.
Alternatif olarak, yorumlayıcıyla açıkça çağırabilirsiniz:
bash myscript.sh
Bash Betiklerinde Değişkenler
Değişkenler, betiğiniz boyunca verileri depolamanıza ve yeniden kullanmanıza olanak tanır. Dizeler, tam sayılar, dosya yolları veya komutların çıktısını tutabilirler.
Değişkenleri Tanımlama ve Kullanma
#!/bin/bash
# Define variables
server_name="web-server-01"
max_connections=500
backup_dir="/var/backups"
# Use variables
echo "Server: $server_name"
echo "Max connections allowed: $max_connections"
echo "Backup directory: $backup_dir"
Değişkenler İçin Önemli Kurallar
Bir değer atarken = işaretinin etrafında boşluk olmamalıdır (name="value" doğrudur; name = "value" değildir)
Değerini okurken değişken adının önüne $ ekleyin: $variable_name
Karmaşık dizelerde netlik için süslü parantez kullanın: ${variable_name}
Değişken adları büyük/küçük harfe duyarlıdır: $Name ve $name farklı değişkenlerdir
Komut Çıktısını Bir Değişkende Yakalama
#!/bin/bash
current_date=$(date +"%Y-%m-%d")
disk_usage=$(df -h / | awk 'NR==2 {print $5}')
echo "Date: $current_date"
echo "Root partition usage: $disk_usage"
Bash’te Koşullu İfadeler
Koşullu mantık, betiğinizin kararlar almasına ve değerlendirilen koşullara göre farklı kod yollarını çalıştırmasına olanak tanır.
Temel if / elif / else Yapısı
#!/bin/bash
echo "Enter a number between 1 and 100:"
read user_input
if [ "$user_input" -ge 1 ] && [ "$user_input" -le 50 ]; then
echo "Your number is in the lower half (1–50)."
elif [ "$user_input" -ge 51 ] && [ "$user_input" -le 100 ]; then
echo "Your number is in the upper half (51–100)."
else
echo "Your number is outside the valid range."
fi
Yaygın Karşılaştırma Operatörleri
Operatör
Anlam
-eq
Eşit
-ne
Eşit değil
-gt
Büyüktür
-lt
Küçüktür
-ge
Büyük veya eşit
-le
Küçük veya eşit
-z
Dize boş
-n
Dize boş değil
-f
Dosya mevcut ve normal bir dosya
-d
Dizin mevcut
Bir Dosyanın Var Olup Olmadığını Kontrol Etme
#!/bin/bash
config_file="/etc/nginx/nginx.conf"
if [ -f "$config_file" ]; then
echo "Configuration file found: $config_file"
else
echo "ERROR: Configuration file not found at $config_file"
exit 1
fi
Bash Betiklerinde Döngüler
Döngüler, bir komut bloğunu birden çok kez tekrarlamanıza olanak tanır; belirli bir aralık üzerinde, bir öğe listesi üzerinde veya bir koşul değişene kadar.
for Döngüsü — Bir Aralık Üzerinde Yineleme
#!/bin/bash
echo "Counting from 1 to 5:"
for i in {1..5}; do
echo " Iteration: $i"
done
for Döngüsü — Bir Öğe Listesi Üzerinde Yineleme
#!/bin/bash
servers=("web-01" "web-02" "db-01" "cache-01")
for server in "${servers[@]}"; do
echo "Pinging server: $server"
ping -c 1 "$server" &>/dev/null && echo " ✔ $server is reachable" || echo " ✘ $server is unreachable"
done
while Döngüsü — Bir Koşul Yanlış Olana Kadar Çalıştırma
#!/bin/bash
counter=1
while [ $counter -le 5 ]; do
echo "Counter value: $counter"
counter=$((counter + 1))
done
echo "Loop complete."
until Döngüsü — Bir Koşul Doğru Olana Kadar Çalıştırma
#!/bin/bash
attempts=0
until [ $attempts -ge 3 ]; do
echo "Attempt $((attempts + 1))..."
attempts=$((attempts + 1))
done
echo "Maximum attempts reached."
Bash Betiklerinde Fonksiyonlar
Fonksiyonlar, yeniden kullanılabilir mantık bloklarını kapsüllemenize olanak tanır; betiklerinizi daha temiz, daha modüler ve bakımı daha kolay hale getirir — özellikle karmaşıklıkları arttıkça.
Bir Fonksiyon Tanımlama ve Çağırma
#!/bin/bash
# Define the function
greet_user() {
local username="$1"
echo "Hello, $username! Your session started at $(date +"%H:%M:%S")."
}
# Call the function with arguments
greet_user "Alice"
greet_user "Bob"
Pratik Bir Fonksiyon: Servis Durumunu Kontrol Etme
#!/bin/bash
check_service() {
local service_name="$1"
if systemctl is-active --quiet "$service_name"; then
echo "✔ $service_name is running."
else
echo "✘ $service_name is NOT running. Attempting to start..."
systemctl start "$service_name" && echo " Started successfully." || echo " Failed to start $service_name."
fi
}
check_service "nginx"
check_service "mysql"
check_service "ssh"
> Not: local anahtar sözcüğü, bir değişkenin kapsamını fonksiyon içiyle sınırlar; böylece daha büyük betiklerde istenmeyen yan etkiler önlenir.
Komut Satırı Argümanlarıyla Çalışma
Bash betikleri, çağrıldıklarında doğrudan komut satırından girdi kabul edebilir; bu da sağlanan parametrelere göre farklı davranan esnek, yeniden kullanılabilir betikler oluşturmayı mümkün kılar.
Özel Argüman Değişkenleri
Değişken
Açıklama
$0
Betiğin kendisinin adı
$1, $2, $3
Birinci, ikinci ve üçüncü konumsal argümanlar
$#
Geçirilen toplam argüman sayısı
$@
Liste olarak tüm argümanlar
$*
Tek dize olarak tüm argümanlar
$?
Son çalıştırılan komutun çıkış durumu
Örnek: Argüman Kabul Eden Bir Betik
#!/bin/bash
# Validate that exactly two arguments were provided
if [ $# -ne 2 ]; then
echo "Usage: $0 <source_directory> <destination_directory>"
exit 1
fi
source_dir="$1"
dest_dir="$2"
# Check that the source directory exists
if [ ! -d "$source_dir" ]; then
echo "ERROR: Source directory '$source_dir' does not exist."
exit 1
fi
echo "Copying files from '$source_dir' to '$dest_dir'..."
cp -r "$source_dir" "$dest_dir" && echo "Copy completed successfully." || echo "Copy failed."
Şu şekilde çalıştırın:
./myscript.sh /var/www/html /var/backups/html_backup
Çıkış Kodları ve Hata Yönetimi
Sağlam Bash betikleri her zaman hataları zarif bir şekilde yönetir. Linux’taki her komut bir çıkış kodu döndürür: 0 başarıyı gösterir ve sıfır dışındaki herhangi bir değer bir hatayı gösterir.
exit ve $? Kullanımı
#!/bin/bash
# Attempt to create a directory
mkdir /tmp/test_directory
if [ $? -eq 0 ]; then
echo "Directory created successfully."
else
echo "Failed to create directory."
exit 1
fi
Otomatik Hata Yönetimi İçin set -e Kullanımı
Betiğinizin başına set -e eklemek, herhangi bir komut sıfır dışında bir çıkış kodu döndürürse betiğin hemen çıkmasına neden olur — bu, üretim betikleri için en iyi uygulamadır:
#!/bin/bash
set -e # Exit on any error
set -u # Treat unset variables as errors
set -o pipefail # Catch errors in pipelines
echo "Starting deployment..."
cd /var/www/html
git pull origin main
systemctl reload nginx
echo "Deployment complete."
Bash Betiklerinde Hata Ayıklama
Deneyimli geliştiriciler bile hatalı betikler yazar. Bash, sorunları verimli bir şekilde izlemenize ve düzeltmenize yardımcı olmak için yerleşik araçlar sağlar.
Yöntem 1: -x Bayrağıyla Çalıştırma (İzleme Modu)
bash -x myscript.sh
Bu, çalıştırıldığında her komutu terminale + önekiyle birlikte, genişletilmiş değişkenlerin değerleriyle birlikte yazdırır. En yaygın kullanılan hata ayıklama tekniğidir.
Yöntem 2: Betiğin İçine set -x Ekleme
Betiğinizin belirli bölümleri için izlemeyi etkinleştirebilir ve devre dışı bırakabilirsiniz:
#!/bin/bash
echo "Normal execution..."
set -x # Enable tracing
cp /source/file /destination/
chmod 644 /destination/file
set +x # Disable tracing
echo "Tracing disabled again."
Yöntem 3: Kontrol Noktaları İçin echo İfadeleri Kullanma
Stratejik olarak yerleştirilmiş echo ifadeleri, değişken değerlerini doğrulamanıza ve çalıştırmanın betikteki belirli bir noktaya ulaştığını onaylamanıza yardımcı olur:
echo "DEBUG: backup_dir = $backup_dir"
echo "DEBUG: Reached checkpoint before rsync"
Pratik Gerçek Dünya Örneği: Otomatik Yedekleme Betiği
İşte bu kılavuzda ele alınan kavramların çoğunu gösteren eksiksiz, üretime hazır bir Bash betiği:
#!/bin/bash
set -euo pipefail
# ============================================================
# Automated Backup Script
# Description: Backs up a specified directory with a timestamp
# ============================================================
# Configuration
SOURCE_DIR="/var/www/html"
BACKUP_ROOT="/var/backups/web"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_NAME="backup_${TIMESTAMP}.tar.gz"
BACKUP_PATH="${BACKUP_ROOT}/${BACKUP_NAME}"
RETENTION_DAYS=7
LOG_FILE="/var/log/backup.log"
# Logging function
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
# Validate source directory
if [ ! -d "$SOURCE_DIR" ]; then
log "ERROR: Source directory '$SOURCE_DIR' not found. Aborting."
exit 1
fi
# Create backup root if it doesn't exist
mkdir -p "$BACKUP_ROOT"
log "Starting backup of '$SOURCE_DIR'..."
# Create compressed archive
tar -czf "$BACKUP_PATH" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
log "Backup created: $BACKUP_PATH ($(du -sh "$BACKUP_PATH" | cut -f1))"
# Remove backups older than retention period
log "Removing backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_ROOT" -name "backup_*.tar.gz" -mtime +"$RETENTION_DAYS" -delete
log "Backup process completed successfully."
Bu tür bir betik, herhangi bir üretim sunucusunda paha biçilmezdir. Dedicated Servers veya VPS üzerinde bir web sitesi veya uygulama çalıştırıyorsanız, yedeklemelerinizi böyle bir betikle — bir cron işiyle birleştirerek — otomatikleştirmek, verilerinizin manuel müdahale olmadan her zaman korunmasını sağlar.
Bash Betiklerini Cron ile Zamanlama
Bash betiklerinizi bir programa göre otomatik olarak çalıştırmak için Linux görev zamanlayıcısı olan cron‘u kullanın. Crontab’ınızı şununla düzenleyin:
crontab -e
Aşağıdaki biçimde bir satır ekleyin:
# Run backup script every day at 2:00 AM
0 2 * * * /path/to/backup.sh >> /var/log/backup_cron.log 2>&1
Cron sözdizimi: minute hour day-of-month month day-of-week commandBash Betikleri Yazmak İçin En İyi Uygulamalar
Bu kurallara uymak betiklerinizi daha güvenilir, okunabilir ve bakımı kolay hale getirecektir:
- Her zaman shebang’ı dahil edin (
#!/bin/bash) ilk satırda - Hataları erken yakalamak için üretim betiklerinde
set -euo pipefailkullanın - Sözcük bölme ve globbing sorunlarını önlemek için değişkenlerinizi tırnak içine alın (
"$variable") - Anlamlı değişken adları kullanın —
backup_directory,bd‘dan daha açıktır - Kodunuzu yorumlayın — *ne* yaptığını değil, *neden* yaptığını açıklayın
- Girdileri doğrulayın — devam etmeden önce gerekli argümanların ve dosyaların var olduğunu kontrol edin
- Karmaşık mantığı yeniden kullanılabilir, adlandırılmış bloklara düzenlemek için fonksiyonlar kullanın
- Üretim sistemlerinde betikleri çalıştırmadan önce güvenli bir ortamda test edin
- Global kapsamı kirletmekten kaçınmak için fonksiyonların içinde
localdeğişkenleri kullanın - Betik davranışını daha sonra denetleyebilmek için önemli eylemleri bir dosyaya kaydedin
Bash Becerilerinizi İlerletme
Temel konularda rahat hissettikten sonra bu ileri düzey konuları keşfetmeyi düşünün:
- Güçlü metin işleme için
grep,sedveawkile düzenli ifadeler - Betiklere çok satırlı dizeler gömmek için here belgeleri (
heredoc) - Karmaşık veri ardışık düzenleri için süreç değiştirme ve adlandırılmış kanallar
- Zarif betik sonlandırma için
trapile sinyal yönetimi - Anahtar-değer veri yapıları için ilişkisel diziler (Bash 4+)
- Betik kütüphaneleri —
sourceile paylaşılan bir dosyadan ortak fonksiyonları kaynak alma
Web uygulamaları, veritabanları veya e-posta altyapısı yönetiyorsanız, Bash betik yazımı küçük projeler için Shared Web Hosting gibi hizmetlerle veya grafik arayüzü kabuk erişimiyle birlikte istediğiniz ortamlar için tam yönetilen bir VPS with cPanel ile doğal olarak eşleşir.
Veri yoğun iş yükleri veya makine öğrenimi ardışık düzenleri çalıştıran ekipler için Bash betikleri, GPU Hosting altyapısındaki işleri düzenlemede — model eğitim çalıştırmalarını otomatikleştirme, veri kümelerini yönetme ve ortam kurulumunu yönetme konularında — eşit derecede değerlidir.
Sonuç
Bash betik yazımı, Linux ile çalışan herkes için vazgeçilmez bir beceridir — ister ilk tekrarlayan görevini otomatikleştiren bir başlangıç seviyesi kullanıcısı olun, ister karmaşık sunucu altyapısını yöneten kıdemli bir sistem yöneticisi. Bu kılavuzda ele alınan kavramlar — dosya oluşturma, değişkenler, koşullar, döngüler, fonksiyonlar, argüman yönetimi, hata yönetimi ve hata ayıklama — güvenilir, üretim kalitesinde betikler yazmanız için ihtiyaç duyduğunuz tam temeli oluşturur.
Küçük başlayın: her gün manuel olarak gerçekleştirdiğiniz bir görevi otomatikleştirin. Güveniniz arttıkça, bu yapı taşlarını saatlerce çalışmayı tasarruf eden, insan hatası riskini azaltan ve sistemleriniz üzerinde size kesin, tekrarlanabilir kontrol sağlayan giderek daha sofistike araçlara dönüştürün.
Bash betiklerinizi pratik yapmak ve dağıtmak için en iyi ortam için AlexHost’un Linux tabanlı VPS Hosting planları yelpazesini keşfedin — geliştiriciler ve sistem yöneticileri için tasarlanmış tam root erişimi, SSD depolama ve esnek yapılandırmalar sunar.
