Bash öğrenmenin en verimli yolu, kabuğun kendi kurallarını sırayla oturtmaktır: önce bir betiği yazıp çalıştırmayı, değişkenleri ve tırnakları öğrenirsiniz; ardından koşullar ve döngüler, fonksiyonlar ve genişletmeler, diziler, yönlendirmeler ve sağlam betik yazma teknikleri gelir. Bu sayfa, GNU Bash Reference Manual'ın bölüm sırasını temel alan bir öğrenme yolu sunar ve serideki 49 yazının tamamını konu gruplarına ayırarak listeler.

Linux'un ne olduğunu ve temel sistem komutlarını (dosya listeleme, arama, süreç ve disk araçları) ayrı yazılarda anlattık: Linux nedir ve Linux sunucu komutları. Bu seri ise kabuğun kendisine odaklanır: dilin sözdizimi, genişletmeler, yerleşik komutlar, kabuk değişkenleri ve etkileşimli kullanım. Örneklerin hepsi gerçekten çalıştırıldı; çıktı yorumları gerçek çıktıyla aynıdır.

Bash nedir?

Bash, GNU işletim sisteminin kabuğu, yani komut dili yorumlayıcısıdır. Adı "Bourne-Again SHell" ifadesinin kısaltmasıdır ve Unix'in yedinci sürümünde ortaya çıkan klasik sh kabuğunu yazan Stephen Bourne'a gönderme yapan bir kelime oyunudur. Kılavuz Bash'i büyük ölçüde sh ile uyumlu, Korn kabuğundan (ksh) ve C kabuğundan (csh) faydalı özellikler almış bir kabuk olarak tanımlar. Hedefi, IEEE POSIX standardının kabuk ve araçlar bölümüne uyumlu bir uygulama olmaktır.

Kılavuza göre bir Unix kabuğu aynı anda iki şeydir: bir komut yorumlayıcısı ve bir programlama dili. Komut yorumlayıcısı olarak sistemdeki araçlara kullanıcı arayüzü sağlar; programlama dili olarak bu araçları birleştirmenize izin verir. Komutları bir dosyaya yazdığınızda o dosya da bir komuta dönüşür. Kabuk etkileşimli olarak (klavyeden yazdıklarınızı okuyarak) ya da etkileşimsiz olarak (bir dosyadan veya bir metin dizgesinden komut okuyarak) çalışabilir.

Kabuğun gücünün büyük kısmı gömülü programlama dilinden gelir: değişkenler, akış denetimi yapıları, tırnaklama ve fonksiyonlar. Bunun yanında cd, break, continue ve exec gibi yerleşik komutlar (builtin) kabuğun içinde yer alır, çünkü kabuğun kendi durumunu değiştirirler ve ayrı bir program olarak yazılamazlar. İş denetimi, komut satırı düzenleme, komut geçmişi ve takma adlar ise etkileşimli kullanım için eklenmiş özelliklerdir.

Bash ile sh arasındaki fark

sh tek bir program adı değil, POSIX standardının tanımladığı kabuk dilini temsil eden bir isimdir. Bash bu dili uygular ama varsayılan davranışı bazı noktalarda standarttan ayrılır. Bash'i --posix seçeneğiyle başlattığınızda, çalışırken set -o posix komutunu verdiğinizde ya da Bash'i sh adıyla çağırdığınızda POSIX moduna geçer; bu modda farklı olan davranışlar standarda göre değişir. Kılavuz, sh adıyla çağrılan Bash'in başlangıç dosyalarını okuduktan sonra POSIX moduna girdiğini belirtir.

Pratikte fark şuraya çıkar: [[ ]], diziler, ${degisken//a/b} gibi gelişmiş genişletmeler ve $'...' tırnaklama gibi özellikler Bash'e özgüdür. Betiğinizin başına #!/bin/sh yazarsanız, sistemde sh olarak hangi kabuk kuruluysa betik onunla çalışır ve bu özellikler orada bulunmayabilir. Bash özelliklerini kullanan bir betiğin ilk satırında Bash'i açıkça istemek bu yüzden önemlidir. POSIX modunun ayrıntılı listesi ve taşınabilir betik ipuçları için Bash ve sh farkı yazısına bakın.

bash
#!/usr/bin/env bash
# ilk.sh: Bash'e özgü iki özellik
meyveler=(elma armut)            # dizi
if [[ ${#meyveler[@]} -eq 2 ]]; then
  echo "İki meyve var: ${meyveler[*]}"
fi
# çıktı: İki meyve var: elma armut

Bu küçük betikteki dizi tanımı ve [[ ]] testi POSIX sh dilinde yoktur. Aynı dosyayı Bash ile çalıştırdığınızda sorun yaşamazsınız; başka bir sh uygulamasıyla çalıştırdığınızda ise sözdizimi hatası alabilirsiniz.

Bu seriyi nasıl kullanmalısınız?

Yazılar, kılavuzun bölüm düzenine yakın bir öğrenme yolu izler. Kabuğa yeniyseniz ilk iki grubu sırayla okuyun; bu iki grup, günlük işlerin büyük kısmını otomatikleştirmeye yeter. Daha sonra ihtiyacınıza göre ilerleyebilirsiniz: veri işleyen betikler yazıyorsanız diziler ve girdi/çıktı gruplarına, sunucuda bakım betikleri çalıştırıyorsanız sağlam betik yazma grubuna, terminalde çok zaman geçiriyorsanız etkileşimli kabuk grubuna geçin.

Kılavuz Bash 5.3 sürümünü anlatıyor; örnekleri GNU Bash 5.2.37 ile çalıştırdık. Kılavuzda anlatılıp 5.2.37'de çalışmayan birkaç özellik (örneğin ${ komut; } biçimindeki komut ikamesi) ilgili yazılarda açıkça işaretleniyor. Kendi sisteminizdeki sürümü öğrenmek ve uyumluluk modunu anlamak için Bash sürümü ve uyumluluk modu yazısına bakabilirsiniz.

1. İlk adımlar

1. İlk adımlar: Bash script yazma ve çalıştırma, Bash değişkenler ve atama, Tek tırnak ile çift tırnak farkı, echo ve printf kullanımı

2. Koşullar ve döngüler

2. Koşullar ve döngüler: if, elif, else koşulları, test ile [[ ]] farkı, case esac kullanımı, for döngüsü
  • if, elif, else koşulları: Bash'te koşulun bir komutun çıkış durumu olduğunu ve ! ile sonucu nasıl tersine çevireceğinizi öğrenirsiniz.
  • test ile [[ ]] farkı: test, [ ] ve [[ ]] arasındaki farkları ve -f, -z, -eq gibi koşul ifadelerini karşılaştırırsınız.
  • case esac kullanımı: desenlerle dallanmayı, | ile birden çok deseni ve ;;, ;&, ;;& sonlandırıcılarının farkını görürsünüz.
  • for döngüsü: liste üzerinde dönen for, C tarzı for (( )) ve "$@" üzerinde güvenli döngü kurmayı öğrenirsiniz.
  • while ve until döngüsü: dosyayı satır satır okumayı, break ve continue ile döngüyü yönetmeyi ve sonsuz döngü kurmayı görürsünüz.
  • Ve/veya operatörleri ve komut listeleri: ;, &, && ve || listelerinin önceliğini ve a && b || c tuzağını öğrenirsiniz.
  • Bash aritmetik işlemler: $(( )), (( )) ve let ile tamsayı aritmetiğini, taban gösterimlerini ve sıfıra bölme hatasını görürsünüz.

3. Fonksiyonlar ve genişletmeler

  • Bash fonksiyon tanımlama: fonksiyon tanımlama biçimlerini, argüman almayı ve değeri return ya da echo ile döndürmenin farkını öğrenirsiniz.
  • local değişken ve kapsam: local ile dinamik kapsamı, declare -n ile sonucu bir değişkene yazmayı ve FUNCNAME dizisini görürsünüz.
  • Parametre genişletme ile varsayılan değer: ${v:-x}, ${v:=x}, ${v:?mesaj} ve ${v:+x} biçimlerini ve iki noktanın yarattığı farkı öğrenirsiniz.
  • String işlemleri: kesme ve değiştirme: uzunluk, alt dizgi, önek ve sonek silme, değiştirme ve büyük/küçük harf dönüşümlerini örneklerle görürsünüz.
  • Komut ikamesi: $( ) ile ters tırnak farkını, sondaki yeni satırların silinmesini ve iç içe kullanımı öğrenirsiniz.
  • Brace expansion ve tilde: {a,b} ve {1..10..2} biçimlerini, ~ genişletmesini ve genişletmelerin hangi sırayla yapıldığını görürsünüz.

4. Diziler ve desenler

  • Bash dizi (array) kullanımı: indeksli dizi tanımlamayı, += ile eleman eklemeyi, ${a[@]} ve ${#a[@]} biçimlerini ve dilimlemeyi öğrenirsiniz.
  • İlişkisel dizi (declare -A): anahtar/değer dizileri kurmayı, üzerinde dönmeyi ve bir anahtarın var olup olmadığını denetlemeyi görürsünüz.
  • declare ve readonly: declare ile verilen -i, -r, -l, -u, -x, -n gibi nitelikleri ve declare -p ile incelemeyi öğrenirsiniz.
  • mapfile ve readarray: bir dosyanın satırlarını tek komutla diziye okumayı ve -t, -n, -s, -d seçeneklerini görürsünüz.
  • Joker karakterler (glob): *, ?, [...] desenlerini, karakter sınıflarını ve nullglob, dotglob, globstar seçeneklerini öğrenirsiniz.
  • extglob genişletilmiş desenler: ?(), *(), +(), @() ve !() desenlerini dosya adlarında, case içinde ve [[ ]] içinde kullanmayı görürsünüz.

5. Girdi, çıktı ve süreçler

  • Yönlendirme: stdout ve stderr: >, >>, 2>, &> ve 2>&1 yönlendirmelerini ve yazım sırasının neden önemli olduğunu öğrenirsiniz.
  • Here document ve here string: <<EOF ile çok satırlı girdi vermeyi, tırnaklı sonlandırıcının genişletmeyi kapatmasını ve <<< biçimini görürsünüz.
  • Pipe, PIPESTATUS ve pipefail: boru hattının çıkış durumunu, PIPESTATUS dizisini ve set -o pipefail ile hata yakalamayı öğrenirsiniz.
  • Process substitution: <( ) ve >( ) ile bir komutun çıktısını dosya gibi kullanmayı ve döngüde değişken kaybını önlemeyi görürsünüz.
  • Dosya tanımlayıcıları ve exec: exec ile tanımlayıcı açıp kapatmayı, {fd}> ile otomatik numara almayı ve betiğin tüm çıktısını bir dosyaya yönlendirmeyi öğrenirsiniz.
  • Regex eşleşme ve BASH_REMATCH: [[ =~ ]] ile genişletilmiş düzenli ifade eşleştirmeyi ve yakalanan grupları BASH_REMATCH dizisinden okumayı görürsünüz.

6. Sağlam betik yazma

6. Sağlam betik yazma: set -euo pipefail ile güvenli betik, trap ile sinyal ve temizlik, Exit kodları ve çıkış durumu, getopts ile seçenek ayrıştırma

7. Etkileşimli kabuk

  • .bashrc ve .bash_profile farkı: login ve login olmayan, etkileşimli ve etkileşimsiz kabukların hangi başlangıç dosyalarını okuduğunu öğrenirsiniz.
  • Bash alias tanımlama: takma ad tanımlamayı, kalıcı hale getirmeyi ve ne zaman takma ad yerine fonksiyon kullanmanız gerektiğini görürsünüz.
  • PS1 prompt özelleştirme: komut istemindeki \u, \h, \w gibi kaçışları, PROMPT_COMMAND değişkenini ve renk kodlarını öğrenirsiniz.
  • Komut geçmişi (history): geçmiş boyutunu ve kaydını ayarlayan değişkenleri, !! ve !$ gibi geçmiş genişletmelerini ve fc komutunu görürsünüz.
  • Klavye kısayolları ve Readline: satır düzenleme kısayollarını, inputrc dosyasını, bind komutunu ve vi/emacs düzenleme kiplerini öğrenirsiniz.
  • Arka plan işleri: jobs, fg, bg: komutları arka plana almayı, jobs, fg, bg, wait ve disown ile iş denetimini görürsünüz.

8. İleri konular ve hatalar

  • shopt seçenekleri: shopt ile kabuk seçeneklerini açıp kapatmayı ve set ile shopt arasındaki farkı öğrenirsiniz.
  • source ve nokta komutu: bir kütüphane dosyasını mevcut kabukta çalıştırmayı ve betiğin doğrudan mı çalıştırıldığını yoksa içe mi aktarıldığını anlamayı görürsünüz.
  • eval ve dolaylı değişken: eval komutunun risklerini, ${!isim} ile dolaylı genişletmeyi ve daha güvenli declare -n seçeneğini öğrenirsiniz.
  • Bash ve sh farkı, POSIX modu: POSIX modunda değişen davranışları, Bourne kabuğundan farkları ve taşınabilirliği bozan Bash'e özgü yazımları görürsünüz.
  • Bash sürümü ve uyumluluk modu: BASH_VERSION ve BASH_VERSINFO ile sürümü okumayı ve BASH_COMPAT ile eski sürüm davranışını seçmeyi öğrenirsiniz.
  • Sık hata mesajları ve çözümleri: "command not found", "bad substitution", "unary operator expected", "unbound variable" ve satır sonu kaynaklı "bad interpreter" gibi hataların nedenlerini ve çözümlerini görürsünüz.

Örnekleri nasıl çalıştırmalısınız?

Serideki örneklerin çoğu bir dosyaya yazılıp bash ornek.sh komutuyla çalıştırılacak biçimde hazırlandı. Kodun içindeki # çıktı: yorumları ekrana basılan satırları, # $? = 1 biçimindeki yorumlar ise bir önceki komutun çıkış durumunu gösterir. Hata mesajları Bash'in standart biçimindedir: önce betiğin adı, sonra satır numarası, ardından mesaj gelir. Bir örneği denerken boş bir klasörde çalışmanız, dosya oluşturan veya silen örneklerin başka dosyalarınıza dokunmasını önler.

Türkçe karakter içeren metinlerle çalışırken kabuğun bir UTF-8 yerel ayarıyla (locale) çalıştığından emin olun. Yerel ayar UTF-8 değilse ${#metin} gibi işlemler harf yerine bayt sayabilir ve büyük/küçük harf dönüşümleri beklediğiniz gibi çalışmayabilir. Sunucunuzda kabuğa nasıl bağlanacağınızı SSH ile sunucuya bağlanma yazısında, uzun süren işler için kalıcı terminal oturumlarını tmux ve screen yazısında bulabilirsiniz.

Sık Sorulan Sorular

Bash öğrenmek için hangi yazıdan başlamalıyım?

İlk betiğinizi yazmak için Bash script yazma ve çalıştırma yazısıyla başlayın, ardından değişkenler ve tırnaklama yazılarına geçin. Tırnaklama kurallarını erken öğrenmek, ileride karşılaşacağınız hataların büyük bölümünü önler.

Bash ile sh aynı şey mi?

Hayır. sh, POSIX kabuk dilinin adıdır ve sisteminizde farklı bir kabuk tarafından sağlanıyor olabilir. Bash bu dili uygular ve üzerine diziler, [[ ]], gelişmiş genişletmeler gibi özellikler ekler. Bash, sh adıyla çağrıldığında POSIX moduna girer.

Bu yazılardaki örnekler hangi Bash sürümüyle denendi?

Kaynak olarak Bash 5.3 kılavuzunu kullandık; örnekleri GNU Bash 5.2.37 ile çalıştırdık. 5.2.37'de çalışmayan özellikler ilgili yazılarda ayrıca belirtiliyor.

Linux komutları da bu seride anlatılıyor mu?

Hayır. grep, sed, awk, find gibi araçlar kabuğun parçası değil, ayrı programlardır. Sık kullanılan sistem komutları için Linux sunucu komutları ve Linux sunucu yönetimi temelleri yazılarına bakın.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Linux nedir · Linux sunucu komutları · Cron job rehberi · Regex başlangıç rehberi