echo Komutu: Terminal Çıktısı ve Değişken Kullanımı — Sysadmin Rehberi

echo komutu ilk bakışta çok basit görünür ama web sunucusu yönetiminde scriptlerin bel kemiğini oluşturur. Değişkenlerden log yazmaya, config dosyası üretmeye kadar echo’nun tüm inceliklerini bu yazıda bulacaksın.

echo komutunu ilk öğrendiğinde muhtemelen şöyle düşündün: “Bu kadar mı? Ekrana bir şey yazdırıyor, tamam.” Ben de öyle düşünmüştüm. Ama yıllarca web sunucusu yönetirken fark ettim ki echo, scriptlerin en sık kullanılan ve en çok küçümsenen komutu. Nginx config’i otomatik üretmek, Apache virtual host dosyası oluşturmak, deploy scriptlerine durum mesajı eklemek… Bunların hepsinde echo var. Hadi sıfırdan, ama bu sefer doğru şekilde öğrenelim.

echo Nedir ve Nerede Çalışır?

echo, kendisine verdiğin argümanları standart çıktıya (stdout) yazan bir komuttur. Linux’ta hem bir shell built-in komutu olarak hem de /bin/echo veya /usr/bin/echo yolunda bağımsız bir binary olarak bulunur. Bu fark önemsiz gibi görünse de scriptlerde taşınabilirlik açısından kritik hale gelebilir.

Bash’in kendi içindeki echo ile sistemdeki /bin/echo arasında davranış farkları var. Özellikle -e ve -n gibi flag’lerde bu fark kendini gösteriyor. Hangi echo’yu kullandığını anlamak için şunu çalıştır:

# Hangi echo kullaniliyor?
type echo

# Sistemdeki echo binary yolu
which echo

# Bash built-in olarak mu cagiriliyor?
type -a echo

Genel kural şu: eğer taşınabilir script yazıyorsan ve kaçış karakterleri kullanman gerekiyorsa, echo yerine printf kullanmayı düşün. Ama web sunucusu ortamında Bash scriptleri yazarken echo gayet yeterli.

Temel Kullanım ve Bayraklar

echo’nun üç temel bayrağı var ve bunları ezberlemen gerekiyor:

  • -n: Satır sonu karakterini bastırma, yani çıktının sonuna newline ekleme
  • -e: Kaçış karakterlerini yorumla ( , , vb.)
  • -E: Kaçış karakterlerini yorumlama (bazı sistemlerde varsayılan değil, açıkça belirtmek gerekir)
# Temel kullanim
echo "Merhaba, Dunya"

# Satir sonu olmadan yaz (-n)
echo -n "Sunucu durumu kontrol ediliyor: "
echo "OK"

# Kacis karakterleriyle (-e)
echo -e "Satir 1
Satir 2
Satir 3"

# Tab karakteri
echo -e "Kolon1	Kolon2	Kolon3"

# Renk kodlariyla terminal ciktisi (ANSI)
echo -e "\e[32mBasarili\e[0m: Nginx yeniden baslatildi"
echo -e "\e[31mHata\e[0m: Port 80 kullanimda"

Renk kodlarına gelince: web sunucusu deploy scriptlerinde yeşil/kırmızı renk kullanmak, script çıktısını izleyen birinin durumu anında anlamasını sağlar. Küçük bir detay ama production deploy sırasında gerçekten fark yaratıyor.

Değişken Kullanımı

echo’nun asıl gücü değişkenlerle birleştiğinde ortaya çıkıyor. Web sunucusu scriptlerinde sürekli değişken değerlerini ekrana basmak, log dosyalarına yazmak ya da config dosyalarına aktarmak gerekir. Burada tırnak işaretlerinin nasıl davrandığını anlamak şart.

Kural basit: çift tırnak içinde değişkenler expand edilir, tek tırnak içinde edilmez. Bu fark seni ciddi baş ağrısından kurtarır.

# Degisken tanimlama
SITE_NAME="mywebsite.com"
WEB_ROOT="/var/www/html"
PHP_VERSION="8.2"
SERVER_IP=$(hostname -I | awk '{print $1}')

# Cift tirnak: degisken expand edilir
echo "Site adi: $SITE_NAME"
echo "Web root: $WEB_ROOT"
echo "PHP versiyonu: $PHP_VERSION"
echo "Sunucu IP: $SERVER_IP"

# Tek tirnak: degisken oldugu gibi yazilir
echo 'Degisken: $SITE_NAME'
# Cikti: Degisken: $SITE_NAME

# Karma kullanim
echo "Domain: ${SITE_NAME}, Root: ${WEB_ROOT}/"

# Komut ciktisini degiskene atayip echo ile goster
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}')
echo "Disk kullanimi: $DISK_USAGE"

# Array degiskenlerini gosterme
declare -a SITES=("site1.com" "site2.com" "site3.com")
echo "Birinci site: ${SITES[0]}"
echo "Tum siteler: ${SITES[@]}"

Ipucu: Değişkenleri kullanırken ${DEGISKEN} formatını alışkanlık haline getir. $DEGISKEN da çalışır ama süslü parantez, değişken adının nerede bittiğini kesin olarak belirtir. Özellikle ${SITE_NAME}.conf gibi kullanımlarda süslü parantez olmadan hata alırsın.

Web Sunucusu Senaryolarında echo Kullanımı

Şimdi gerçek hayata gelelim. Web sunucusu yönetirken echo’yu en çok şu üç senaryoda kullanıyorum: config dosyası üretmek, deploy scriptlerine durum mesajı eklemek ve hızlı diagnostic çıktısı almak.

Nginx Virtual Host Config Üretmek

Bir müşteri için yeni bir domain kuruyorsun diyelim. Her seferinde aynı Nginx config’i elle yazmak yerine, parametreleri değişkene atayıp echo ile dosyayı üretebilirsin. Bu, hem hata riskini azaltır hem de süreci hızlandırır.

#!/bin/bash
# nginx_vhost_create.sh — Otomatik Nginx virtual host olusturucu

DOMAIN="$1"
WEB_ROOT="/var/www/${DOMAIN}"
NGINX_CONF="/etc/nginx/sites-available/${DOMAIN}.conf"
PHP_SOCK="/run/php/php8.2-fpm.sock"

if [ -z "$DOMAIN" ]; then
    echo "Kullanim: $0 "
    exit 1
fi

echo "[INFO] $DOMAIN icin Nginx config olusturuluyor..."

# Web dizinini olustur
mkdir -p "${WEB_ROOT}/public"
echo "[OK] Dizin olusturuldu: ${WEB_ROOT}"

# Config dosyasini yaz
cat > "${NGINX_CONF}" << EOF
server {
    listen 80;
    server_name ${DOMAIN} www.${DOMAIN};
    root ${WEB_ROOT}/public;
    index index.php index.html;

    access_log /var/log/nginx/${DOMAIN}_access.log;
    error_log  /var/log/nginx/${DOMAIN}_error.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:${PHP_SOCK};
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
EOF

echo "[OK] Nginx config yazildi: ${NGINX_CONF}"
echo "[INFO] Sites-enabled sembolik link olusturuluyor..."
ln -sf "${NGINX_CONF}" "/etc/nginx/sites-enabled/${DOMAIN}.conf"
echo "[OK] Sembolik link olusturuldu"
echo "[INFO] Nginx test ediliyor..."
nginx -t && echo "[OK] Nginx config gecerli" || echo "[HATA] Nginx config hatali!"

Bu scriptte hem cat heredoc hem de echo birlikte kullanılıyor. echo durum mesajları için, cat ise çok satırlı config bloğu için daha uygun. İkisini karıştırmak yerine amaca göre seçmek önemli.

Deploy Script’inde Durum Çıktısı

Canlı ortama deploy yaparken her adımın ne durumda olduğunu bilmek istiyorsun. echo ile renkli ve yapılandırılmış çıktı üretmek, deploy sürecini takip etmeyi çok kolaylaştırır.

#!/bin/bash
# deploy.sh — Web uygulamasi deploy scripti

# Renk tanimlari
GREEN="\e[32m"
RED="\e[31m"
YELLOW="\e[33m"
BLUE="\e[34m"
RESET="\e[0m"

APP_DIR="/var/www/myapp"
GIT_BRANCH="main"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

log_info()    { echo -e "${BLUE}[INFO]${RESET} $1"; }
log_success() { echo -e "${GREEN}[OK]${RESET} $1"; }
log_warning() { echo -e "${YELLOW}[UYARI]${RESET} $1"; }
log_error()   { echo -e "${RED}[HATA]${RESET} $1"; }

echo -e "
${BLUE}================================================${RESET}"
echo -e "${BLUE} Deploy Basladi: ${TIMESTAMP}${RESET}"
echo -e "${BLUE}================================================${RESET}
"

log_info "Proje dizinine geciliyor: ${APP_DIR}"
cd "${APP_DIR}" || { log_error "Dizin bulunamadi: ${APP_DIR}"; exit 1; }

log_info "Git pull islemi: origin/${GIT_BRANCH}"
git pull origin "${GIT_BRANCH}" && log_success "Kod guncellendi" || { log_error "Git pull basarisiz"; exit 1; }

log_info "Composer bagimliliklar yukleniyor..."
composer install --no-dev --optimize-autoloader 
    && log_success "Composer tamamlandi" 
    || { log_error "Composer basarisiz"; exit 1; }

log_info "Cache temizleniyor..."
php artisan cache:clear && log_success "Cache temizlendi"

log_info "Nginx yeniden yukleniyor..."
systemctl reload nginx && log_success "Nginx reload edildi" || log_error "Nginx reload basarisiz"

echo -e "
${GREEN}================================================${RESET}"
echo -e "${GREEN} Deploy Tamamlandi: $(date '+%Y-%m-%d %H:%M:%S')${RESET}"
echo -e "${GREEN}================================================${RESET}
"

echo ile Dosyaya Yazmak

echo’yu yönlendirme operatörleriyle kullanmak, web sunucusu yönetiminde en sık başvurulan tekniklerden biri. Yeni bir dosya oluşturmak için > kullanırsın, mevcut dosyaya eklemek için >> kullanırsın. Bu farkı unutursan ciddi sorunlarla karşılaşabilirsin.

Uyari: > operatörü dosyanın mevcut içeriğini tamamen siler ve üzerine yazar. /etc/nginx/nginx.conf gibi kritik bir dosyada > ile echo kullanıyorsan, önce yedeğini al. Bu hatayı production’da bir kez yaşarsan, bir daha yaşamazsın.

# Yeni dosya olusturma (veya ustune yazma)
echo "ServerName mywebsite.com" > /tmp/apache_test.conf

# Dosyaya ekleme (append)
echo "DocumentRoot /var/www/html" >> /tmp/apache_test.conf
echo "ErrorLog /var/log/apache2/error.log" >> /tmp/apache_test.conf

# Log dosyasina tarihli kayit ekleme
LOG_FILE="/var/log/deploy.log"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Deploy baslatildi: $(whoami)" >> "${LOG_FILE}"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Git commit: $(git rev-parse --short HEAD)" >> "${LOG_FILE}"

# Basit bir durum dosyasi olusturma
echo "OK" > /var/www/html/health.txt
echo "Last-Updated: $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> /var/www/html/health.txt

# PHP bilgi dosyasi olusturma (test ortami icin)
echo "" > /var/www/html/info.php
echo "[UYARI] info.php olusturuldu, test sonrasi silmeyi unutma!"

# /dev/null'a yonlendirme: ciktiyi susturma
echo "Bu mesaj gorunmeyecek" > /dev/null

Özel Değişken Türleri ve echo

Bash’in özel değişkenleri web sunucusu scriptlerinde çok işe yarar. Bu değişkenleri echo ile birleştirdiğinde, scriptlerin debug edilmesi ve izlenmesi çok kolaylaşır.

DeğişkenAnlamıÖrnek Kullanım
$0Scriptin adıecho “Script: $0”
$1, $2…Positional parametrelerecho “Domain: $1”
$#Argüman sayısıecho “$# arguman verildi”
$?Son komutun çıkış koduecho “Cikis kodu: $?”
$$Mevcut process IDecho “PID: $$”
$@Tüm argümanlarecho “Tum: $@”
$HOSTNAMESunucu adıecho “Sunucu: $HOSTNAME”
$USERAktif kullanıcıecho “Kullanici: $USER”
#!/bin/bash
# server_info.sh — Sunucu ozet bilgisi

echo "========================================"
echo " Sunucu Ozet Raporu"
echo "========================================"
echo "Script      : $0"
echo "Calistiran  : $USER"
echo "Sunucu Adi  : $HOSTNAME"
echo "Tarih/Saat  : $(date '+%d.%m.%Y %H:%M:%S')"
echo "Uptime      : $(uptime -p)"
echo "----------------------------------------"
echo "CPU Kullanim: $(top -bn1 | grep 'Cpu(s)' | awk '{print $2}')%"
echo "RAM Kullanim: $(free -h | awk '/^Mem:/ {print $3"/"$2}')"
echo "Disk (/)    : $(df -h / | awk 'NR==2 {print $3"/"$2" ("$5" dolu)"}')"
echo "----------------------------------------"
echo "Aktif Nginx : $(systemctl is-active nginx)"
echo "Aktif MySQL : $(systemctl is-active mysql)"
echo "Aktif PHP   : $(systemctl is-active php8.2-fpm)"
echo "----------------------------------------"
echo "Acik Portlar:"
ss -tlnp | grep LISTEN | awk '{print "  " $4}'
echo "========================================"

# Son komutun basarili olup olmadigini kontrol et
if [ $? -eq 0 ]; then
    echo "Rapor basariyla olusturuldu."
else
    echo "Rapor olusturulurken sorun yasandi. Cikis kodu: $?"
fi

echo ile PHP ve Apache .htaccess Oluşturmak

Web sunucusu yönetiminde sık karşılaşılan bir senaryo: birden fazla site için standart .htaccess veya PHP yapılandırma dosyaları oluşturmak. echo ile bunu script haline getirdiğinde, onlarca siteyi dakikalar içinde yapılandırabilirsin.

#!/bin/bash
# setup_site_config.sh — Site yapılandırma dosyalarini olustur

DOMAIN="${1:-ornek.com}"
WEB_ROOT="/var/www/${DOMAIN}/public"

echo "[INFO] ${DOMAIN} icin yapilandirma dosyalari olusturuluyor..."

# .htaccess olustur (Apache icin)
cat > "${WEB_ROOT}/.htaccess" << 'HTACCESS'
Options -Indexes
ServerSignature Off


    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [L]



    ExpiresActive On
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"

HTACCESS
echo "[OK] .htaccess olusturuldu"

# php.ini override olustur
PHP_INI="/var/www/${DOMAIN}/php.ini"
echo "upload_max_filesize = 64M" > "${PHP_INI}"
echo "post_max_size = 64M" >> "${PHP_INI}"
echo "max_execution_time = 120" >> "${PHP_INI}"
echo "memory_limit = 256M" >> "${PHP_INI}"
echo "display_errors = Off" >> "${PHP_INI}"
echo "log_errors = On" >> "${PHP_INI}"
echo "error_log = /var/log/php/${DOMAIN}_error.log" >> "${PHP_INI}"
echo "[OK] php.ini override olusturuldu: ${PHP_INI}"

echo "[INFO] Tum dosyalar basariyla olusturuldu."
echo "Domain     : ${DOMAIN}"
echo "Web Root   : ${WEB_ROOT}"
echo "htaccess   : ${WEB_ROOT}/.htaccess"
echo "PHP Config : ${PHP_INI}"

Sık Yapılan Hatalar

echo kullanımında yıllar içinde gördüğüm ve bizzat yaptığım hataları paylaşayım:

  • Tek tırnak ve çift tırnak karıştırmak: Değişken içeren stringleri tek tırnak içine almak, değişkenin expand edilmemesine yol açar. Her zaman bilinçli seç.
  • $? kontrolünü geciktirmek: $? sadece bir sonraki komutu çalıştırana kadar geçerli. echo $? demeden önce başka bir komut çalıştırırsan, o komutun çıkış kodunu görürsün.
  • Özel karakterleri escape etmemek: echo ile string içinde ! kullanmak Bash history expansion’ı tetikler. Özel karakterlerin önüne \ koy veya tek tırnak kullan.
  • -e flag’ini unutmak: veya kullanacaksan -e flag’ini eklemeyi unutma, yoksa bu karakterler olduğu gibi ekranda görünür.
  • >> yerine > kullanmak: Log dosyasına eklemek istediğinde > ile tüm log geçmişini silmek, en acı verici hatalardan biri.

Uyari: Eğer scriptlerini sudo ile çalıştırıyorsan ve echo ile kritik sistem dosyalarına yazıyorsan, her adımda bir yedek al. “sudo echo ‘bir sey’ > /etc/critical.conf” şeklindeki komutlar, yönlendirme operatörünün sudo kapsamı dışında kalması nedeniyle beklenmedik şekilde davranabilir. Bu durumda “sudo tee” kullanmak daha güvenlidir.

echo mi, printf mi?

Bu soruyu kaçınılmaz olarak soruyorsun. Kısa cevap: web sunucusu scriptlerinde echo genellikle yeterli. Ama şu durumlarda printf’e geç:

  • Farklı shell’lerde (sh, dash, zsh) çalışması gereken taşınabilir scriptler yazıyorsun
  • Sayısal formatlama gerekiyor (örneğin: %.2f ile ondalık basamak kontrolü)
  • Çıktıda kesin boşluk hizalaması önemli
  • Kaçış karakteri davranışının tutarlı olmasını garanti altına almak istiyorsun

Sonraki Adımlar

echo komutunu bu yazıda sıfırdan ele aldık ve web sunucusu yönetimindeki gerçek dünya kullanım senaryolarına baktık. Ama bu sadece bir başlangıç. echo’yu gerçekten verimli kullanmak için şu konulara da hakim olman gerekiyor:

  • tee komutu: Hem ekrana yazmak hem de dosyaya kaydetmek istediğinde echo | tee kombinasyonu hayat kurtarır. Özellikle sudo gerektiren dosyalara yazarken.
  • printf komutu: Taşınabilir ve formatlı çıktı için echo’nun daha güçlü alternatifi. C programcıları kendini evinde hisseder.
  • Heredoc (cat << EOF): Çok satırlı içerik üretirken echo’yu defalarca çağırmak yerine heredoc kullanmak çok daha temiz kod üretir.
  • Bash string manipülasyonu: ${DEGISKEN#prefix}, ${DEGISKEN%suffix} gibi parametre expansion teknikleri, echo ile birleştiğinde çok güçlü araçlara dönüşür.
  • Cron ile echo: Cron job’larında echo çıktısını log dosyasına yönlendirerek otomatik raporlama sistemi kurabilirsin.

Web sunucusu yönetiminde otomasyon ne kadar çok olursa, manuel hata riski o kadar azalır. echo komutunun bu kadar basit görünmesine aldanma — iyi yazılmış bir scriptte bu küçük komut, saatlik manuel işleri dakikalara indirir. Şimdi gidip kendi deploy scriptini yaz, içine biraz renk ekle ve terminal çıktısını güzelleştir. Bir dahaki deploy’da farkını göreceksin.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir