# Kabuk programlama
Kabuk betiği (İngilizcesi: "shell script"), bir Unix kabuğu (bir komut satırı yorumlayıcısı) tarafından çalıştırılmak üzere yazılmış bir bilgisayar programıdır. Kabuk betiklerinin çeşitli lehçeleri komut dili olarak kabul edilir. Kabuk betikleri tarafından gerçekleştirilen tipik işlemler arasında dosya işleme, program çalıştırma ve metin yazdırma yer alır. Ortamı ayarlayan, bir programı çalıştıran ve gerekirse günlükleme veya temizleme işlemleri yapan bir betik, sargı (wrapper) olarak adlandırılır.
Bu terim aynı zamanda, bir işletim sistemi kabuğunun otomatik modda çalıştırılması anlamında daha genel olarak da kullanılmaktadır. Her işletim sistemi bu işlevleri farklı adlarla anmaktadır: toplu işlem dosyaları (MS-DOS-Win95 hattı, OS/2), komut prosedürleri (VMS), kabuk betikleri (Windows NT hattı ve 4NT gibi üçüncü taraf türevleri—makale cmd.exe sayfasında) ve ana bilgisayar işletim sistemleriyle ilişkili çeşitli diğer terimler.
Unix ve Unix benzeri sistemlerde yaygın olarak bulunan kabuklar arasında Korn shell, Bourne shell ve GNU Bash yer alır. Unix tabanlı bir işletim sistemi farklı bir varsayılan kabukla birlikte gelebilir (örneğin macOS'te Zsh), ancak genellikle geriye dönük uyumluluk için bu kabuklar da sistemde bulunur.


## Özellikler.
### Yorum Satırları.
Yorum satırları, kabuk yorumlayıcısı tarafından çalıştırılmaz. Genellikle kare işareti (#) ile başlar ve satır sonuna dek sürer.


### Betik Dili Seçilebilirliği.
Shebang (#!), çalıştırılacak betiğin hangi yorumlayıcı ile yürütüleceğini belirlemek için kullanılan özel bir yorum satırıdır. Betiğin ilk satırında yer almalı ve #! ile başlamalıdır. Unix-benzeri işletim dizgelerinde bu işaretten sonra gelen bölüm, betiği yorumlayacak çalıştırılabilir uygulamanın tam yoludur.


### Kısayollar.
Kabuk betikleri, sistem komutlarını daha elverişli hale getiren kısaltmalar olarak kullanılabilir. Ortam değiştirgeleri, komut seçenekleri ya da ek işlem adımları önceden tanımlanmış olabilir; buna karşın betik, sıradan bir Unix komutu gibi çalışmayı sürdürür.
Örnek olarak, dosyaları listeleyen ls komutunun kısa adlandırılmış bir sürümünü l olarak oluşturmaktır. Bu betik, genellikle kullanıcının bin dizininde /home/"kullanıcıadı"/bin/l yolunda saklanır ve içerisine bazı öntanımlı komut seçenekleri eklenmiştir.
 - !/bin/sh
LC_COLLATE=C ls -FCas "$@"
Burada ilk satır, shebang (#!) kullanılarak, betiği hangi yorumlayıcının çalıştıracağını belirtir. İkinci satır ise ls komutunu; dosya türü simgelerini, sütunlu düzenlemeyi, gizli dosyaları da içerecek şekilde (hiçbirini dışlamadan) ve blok boyutunda dosya boyutlarını gösterecek biçimde çalıştırır.
LC_COLLATE=C ifadesi, harf sıralamasında büyük ve küçük harfleri birleştirmemek ve noktalama işaretlerini yok saymamak için sıralama düzenini C yerelleştirmesine ayarlar. Bu sayede, dotfile ile sıradan dosya adları birbirine karışmaz (noktalı dosyalar genellikle -a gibi seçeneklerle görünür hâle gelir).
"$@" ifadesi, l komutuna verilen tüm girdilerin ls'ye eksiksiz aktarılmasını sağlar; böylece ls'nin tüm alışılmış seçenekleri ve sözdizimi kullanılabilir kalır.
Kullanıcı, sık kullanılan kısa listeleme işlemleri için yalnızca l komutunu çalıştırarak bu betikten yararlanabilir.
Bir başka kısayol örneği, belirli bir dizin içerisindeki tüm dosya ve dizinleri listeleyen basit bir komuttur:
 - !/bin/sh
clear
ls -al
Bu durumda betik, olağan başlangıç satırı olan #!/bin/sh ile başlar. Ardından clear komutu çalıştırılarak uçbirim (terminal) temizlenir. Sonraki satırdaki ls -al komutu ise betiğin çalıştırıldığı dizindeki tüm dosya ve dizinleri ayrıntılı olarak listeler.
ls komutuna ait öznitelikler, kullanıcının gereksinimlerine göre değiştirilebilir.


### Toplu İşler.
Kabuk betikleri, bir dizi komutu tek tek elle girilmeksizin ardışık olarak çalıştırabilir. Örneğin, içinde üç C kaynak kodu dosyası bulunan bir dizinde, bu dosyalardan son programı üretmek için gereken dört komutu tek tek çalıştırmak yerine, POSIX uyumlu kabuklar için build adlı bir betik oluşturulabilir. Bu betik, kaynak dosyalarla aynı dizinde saklanır ve derleme işlemini kendiliğinden yapar:
 - !/bin/sh
printf 'derleniyor...\n'
cc -c foo.c
cc -c bar.c
cc -c qux.c
cc -o myprog foo.o bar.o qux.o
printf 'tamamlandı.\n'
Bu sayede kullanıcı, düzenleyiciden çıkıp yalnızca ./build komutunu çalıştırarak güncel programı üretme, deneme ve ardından düzenleyiciye dönme olanağı tanır. Ancak 1980'lerden bu yana, bu tür işler için özel araçlar olan make gibi yapılandırma sistemleri kullanılır hale gelmiştir.


### Genelleştirme.
Basit toplu işler izole görevler için olağandışı değildir, ancak kabuk döngüleri, testler ve değişkenler kullanmak, kullanıcılara çok daha fazla esneklik sağlar. Komut satırından—muhtemelen joker karakterler aracılığıyla—verilen görsel adları ile JPEG görsellerini PNG görsellerine dönüştüren bir POSIX sh betiği, her görselin betik içinde tek tek listelenmesi yerine, aşağıdaki gibi bir dosyada oluşturulabilir. Bu betik genellikle /home/"kullanıcıadı"/bin/jpg2png gibi bir dosyada saklanır: 
 - !/bin/sh 
for jpg; do # verilen her dosya adı için $jpg yerine geçer 
 png=${jpg%.jpg}.png # dosya adındaki .jpg uzantısını .png ile değiştirerek PNG adı oluştur 
 printf '"%s" dönüştürülüyor...\n' "$jpg" # betiği çalıştıran kullanıcıya durum bilgisi ver 
 if convert "$jpg" jpg.to.png; then # ImageMagick tarafından sağlanan convert komutuyla geçici PNG oluştur 
 mv jpg.to.png "$png" # başarılıysa geçici PNG dosyasını doğru adla yeniden adlandır 
 else # aksi takdirde hata mesajı ver ve betikten çık 
 printf >&2 'jpg2png: hata: çıktı "jpg.to.png" dosyasına kaydedildi.\n' 
 exit 1 
 fi # "if" test yapısının sonu 
done # "for" döngüsünün sonu 
printf 'tüm dönüştürmeler tamamlandı\n' # kullanıcıya işlemin başarıyla tamamlandığını bildir
Bu durumda jpg2png betiği, /home/"kullanıcıadı"/bin/jpg2png *.jpg şeklinde JPEG görsellerle dolu bir dizin üzerinde çalıştırılabilir.


### Programlama.
Günümüzde kabukların birçoğu, yalnızca daha gelişmiş genel amaçlı programlama dillerinde bulunan kontrol akışı yapıları, değişkenler, yorum satırları, diziler, altyordamlar gibi çeşitli özellikleri de sağlar. Bu tür özelliklerin mevcut olması sayesinde, kabuk betikleriyle oldukça gelişmiş uygulamalar yazmak mümkündür.
Ancak, çoğu kabuk dilinin veri türü sistemleri, sınıflar, çok iş parçacığı (threading), karmaşık matematik işlemleri ve diğer yaygın tam teşekküllü dil özellikleri için çok az desteğe sahip olması ya da hiç desteklememesi nedeniyle hâlâ sınırlıdırlar. Ayrıca genellikle derlenmiş kodlara ya da yüksek performans hedefiyle yazılmış yorumlanmış dillere kıyasla çok daha yavaştırlar.
Standart Unix araçları olan sed ve awk, kabuk programlaması için ek yetenekler sağlar; Perl de diğer betik dilleri gibi (örneğin Tcl) kabuk betiklerine gömülebilir. Perl ve Tcl ayrıca grafik araç takımlarıyla birlikte gelir.


## Yaşam döngüsü.
Kabuk betikleri, yazılım geliştirme sürecinde genellikle ilk aşama olarak kullanılır ve daha sonra sıklıkla farklı bir temel uygulama biçimine dönüştürülür. Bu dönüşüm çoğunlukla Perl, Python veya C gibi dillere yapılır. Yorumlayıcı yönergesi (İngilizcesi: "interpreter directive") sayesinde, uygulamanın hangi dilde yazıldığı dosya uzantısıyla belirtilmek zorunda kalmaz; bu bilgi doğrudan betik içinde tanımlanır. Böylece, betiğin farklı bir dilde yeniden uygulanması son kullanıcıyı etkilemeden mümkün olur.
“.sh” dosya uzantısı genellikle bir kabuk betiğini belirtir; ancak çoğu kabuk betiği herhangi bir uzantı taşımaz.


## En çok bilinen kabuklar.
  - bash "(Bourne Again Shell)"
  - csh "(C-Shell)"
  - ksh
  - sh
  - tcsh
  - zsh