10 - Kabuk Programlama
2026
Şimdiye kadar terminalde birçok komutu tek tek çalıştırdık.
Örneğin:
Bu komutları her seferinde elle yazmak yerine bir dosyaya yazabiliriz.
Dosya çalıştırıldığında komutlar sırayla çalışır.
Yani artık tek tek komut çalıştırmak yerine, hazırlanmış bir komut listesini çalıştırmış oluruz.
Kabuk betiği, kabuk komutlarını içeren düz metin dosyasıdır.
Örnek:
Bu dosya çalıştırıldığında:
yedekler klasörü oluşturulur.notlar.txt dosyası bu klasöre kopyalanır.yedekler klasörünün içeriği listelenir.Burada yeni olan şey komutlar değil, komutların bir dosya içinde sıraya konulmasıdır.
Bir betiği okumak, her satırın sistemde ne yapacağını tahmin edebilmektir.
Örneğin şu betiğe bakalım:
Bu betiği okurken şunları sorarız:
DOSYA değişkeninin değeri nedir?cp komutu hangi dosyayı kopyalıyor?Bu derste uzun betikler yazmaktan çok, bu tür soruları cevaplamaya odaklanacağız.
Kabuk betikleri sistem yönetiminde, dosya işlemlerinde ve otomasyon görevlerinde sık karşımıza çıkar.
Bugün bu betikleri sıfırdan yazmak çoğu zaman zorunlu değildir.
AI araçları basit betikler üretebilir.
Ama yine de şu becerilere ihtiyaç vardır:
Amaç, kabuk betiği okuryazarlığı kazanmaktır.
Bu betikte iki temel satır vardır.
#!/bin/bash satırı, betiğin bash ile çalıştırılacağını belirtir.
echo komutu ekrana metin yazdırır.
Bu betik çalıştırıldığında ekranda şu çıktı görülür:
Betiğin ilk satırında genellikle şu ifade görülür:
Bu satıra shebang denir.
Sisteme şu bilgiyi verir:
Bu satır yoksa betik yine çalışabilir.
Fakat sistem farklı bir kabukla çalıştırmayı deneyebilir.
Bu durumda bazı bash özellikleri beklenenden farklı davranabilir.
# ile başlayan satırlar açıklama satırıdır.
Yorum satırları çalıştırılmaz.
Kodun ne yapmak istediğini anlatmak için kullanılır.
AI tarafından üretilen betiklerde yorum satırları faydalı olabilir.
Fakat yorum doğru görünse bile kod ayrıca kontrol edilmelidir.
Bir betiği çalıştırmak için dosyaya çalıştırma izni verilir.
Sonra betik çalıştırılır.
Buradaki ./, mevcut dizindeki dosyayı çalıştırmak istediğimizi belirtir.
Linux, güvenlik nedeniyle bulunduğumuz klasördeki dosyaları her zaman sadece adını yazarak çalıştırmaz.
Bu nedenle kontrol.sh yerine çoğu zaman ./kontrol.sh yazarız.
Bazı komutlar sistemde kalıcı değişiklik yapar.
Örnek:
Bu komut dosyaya çalıştırma izni verir.
Aşağıdaki türde komutlar ise daha dikkatli incelenmelidir:
Özellikle şu ifadeler görüldüğünde durup düşünmek gerekir:
sudo-R/*rmchmodchownDeğişkenler geçici bilgi saklamak için kullanılır.
Bu kodda:
AD değişkeninin değeri AyşeDOSYA değişkeninin değeri notlar.txtolur.
Değişkenin değerini kullanmak için başına $ işareti konur.
Aşağıdaki kodun çıktısını tahmin edelim.
Beklenen çıktı:
Bu betik herhangi bir dosyayı değiştirmez.
Sadece iki değişken tanımlar ve ekrana yazdırır.
Kabuk betiklerinde tırnak işaretleri sonucu değiştirebilir.
Çift tırnak içinde değişkenin değeri kullanılır.
Çıktı:
Tek tırnak içinde metin olduğu gibi yazılır.
Çıktı:
Bu farkı bilmek, betiğin çıktısını tahmin etmek için yeterlidir.
Dosya ve klasör adlarında boşluk olabilir.
Daha güvenli kullanım:
Sorun çıkarabilecek kullanım:
Çünkü kabuk bu ifadeyi iki ayrı parça gibi yorumlayabilir:
Bu nedenle değişkenleri çoğu durumda çift tırnak içinde görmek isteriz.
Bir komutun çıktısı değişkene atanabilir.
Bu kodda:
date komutu tarih bilgisini üretir.pwd komutu mevcut dizini verir.$(...) yapısı komutun çıktısını alır.Bu kullanım AI’ın yazdığı betiklerde sık görülür.
read komutu kullanıcıdan bilgi almak için kullanılır.
Bu betik çalıştığında kullanıcıdan bir değer ister.
Kullanıcı Ali yazarsa çıktı şu olur:
Bu tür betikler etkileşimlidir.
Otomatik çalışacak betiklerde her zaman uygun olmayabilir.
Betiğe çalıştırma sırasında değer verilebilir.
Burada notlar.txt bir argümandır.
Betik içinde bu değer şöyle okunur:
Yaygın özel değişkenler:
| Değişken | Anlamı |
|---|---|
$0 |
betiğin adı |
$1 |
birinci argüman |
$2 |
ikinci argüman |
$# |
argüman sayısı |
Çalıştırma:
Örnek çıktı:
Bu kod dosya üzerinde işlem yapmaz.
Sadece kendisine verilen argümanı ekrana yazar.
Aşağıdaki komutla betik çalıştırılıyor:
Betik içinde şu satır var:
Bu durumda DOSYA değişkeninin değeri nedir?
kontrol.shrapor.pdf$1DOSYACevap: B
AI’ın yazdığı betiklerde argüman kontrolü olup olmadığına bakılmalıdır.
Bu kod şu anlama gelir:
Bu kontrol yoksa betik eksik bilgiyle çalışmaya devam edebilir.
Kabukta aritmetik işlem için $((...)) yapısı kullanılır.
Çıktı:
Bu kullanım sayaç, basit hesaplama ve koşul kontrollerinde karşımıza çıkar.
Detaylı hesaplama yapmak bu dersin ana konusu değildir.
Koşullu ifadeler, betiğin belirli durumlara göre karar vermesini sağlar.
Bu kodda:
$1 değeri başlat ise ilk mesaj yazılır.Koşullu ifadeler betiklerin karar noktalarıdır.
| İfade | Anlamı |
|---|---|
-eq |
eşit |
-ne |
eşit değil |
-gt |
büyük |
-ge |
büyük veya eşit |
-lt |
küçük |
-le |
küçük veya eşit |
Örnek:
Bu kodda koşul doğrudur.
Kabuk betiklerinde dosya kontrolü çok yaygındır.
| Test | Anlamı |
|---|---|
-e |
var mı? |
-f |
normal dosya mı? |
-d |
dizin mi? |
-r |
okunabilir mi? |
-w |
yazılabilir mi? |
-x |
çalıştırılabilir mi? |
-s |
boş değil mi? |
Örnek:
#!/bin/bash
if [ "$#" -eq 0 ]; then
echo "Kullanım: $0 dosya_adi"
exit 1
fi
DOSYA="$1"
if [ -f "$DOSYA" ]; then
echo "Dosya bulundu: $DOSYA"
else
echo "Dosya bulunamadı: $DOSYA"
fiBu betik:
DOSYA değişkenine atar.Döngüler aynı işlemi birden fazla öğe için yapar.
Bu kod mevcut dizindeki .txt dosyalarını listeler.
Döngüleri okurken şu sorular sorulur:
Aşağıdaki kod .tmp dosyalarını siler.
Bu kodun etkisi sınırlı görünür.
Ama şu kod daha risklidir:
Çünkü mevcut dizindeki birçok dosyayı silmeye çalışır.
AI’ın yazdığı betiklerde rm, mv, cp, chmod, chown komutları dikkatle incelenmelidir.
while Döngüsünü Okumakwhile döngüsü, koşul doğru olduğu sürece çalışır.
Çıktı:
Döngüde sayaç artırılmazsa betik sonsuz döngüye girebilir.
Fonksiyonlar, komutları bir isim altında toplar.
Bu kodda:
selamla bir fonksiyondur."Ayşe" fonksiyona gönderilen değerdir.$1 olarak okunur.Bu derste fonksiyon yazma ayrıntısına girmiyoruz.
Çünkü temel hedef, AI’ın veya başka bir kişinin yazdığı betikte fonksiyonun nerede tanımlandığını ve nerede çağrıldığını anlayabilmektir.
Bir fonksiyon gördüğümüzde şu sorular yeterlidir:
exit kullanıyor mu?Örnek:
Bu satır, yedekle adlı fonksiyona iki değer gönderildiğini gösterir.
Her komut çalıştıktan sonra bir çıkış durumu üretir.
| Değer | Anlamı |
|---|---|
0 |
başarılı |
0 dışı |
hata |
Örnek:
Bu kodda dosya varsa betik başarılı biter.
Dosya yoksa hata kodu ile biter.
AI’ın yazdığı bir kabuk betiği doğrudan çalıştırılmamalıdır.
Önce şu üç soru sorulmalıdır:
Özellikle dosya sistemiyle ilgili komutlar dikkat ister.
Bir betiğin kısa olması güvenli olduğu anlamına gelmez.
Bazen tek satırlık bir komut bile geniş etki oluşturabilir.
AI tarafından yazılmış bir kabuk betiğini incelerken şu noktalara bakılmalıdır:
rm, mv, cp, chmod, chown, sudo var mı?exit 1 ile duruyor mu?Bu liste, betiği tamamen ezbere bilmeden de temel riskleri yakalamayı sağlar.
AI araçları bazen doğru komutu seçer ama yanlış parametre önerebilir.
Örneğin:
Bu tür karmaşık seçenekler her sistemde beklenen biçimde çalışmayabilir.
Ayrıca bazı komutların GNU/Linux ve macOS sürümleri farklı seçeneklere sahip olabilir.
Bu nedenle emin olunmayan komutlar için yardım çıktısına bakılmalıdır:
AI’ın verdiği komut çalışıyor gibi görünse bile ne yaptığını anlamadan kullanılmamalıdır.
Bu istek çok belirsizdir.
Eksik noktalar:
Belirsiz istekler, riskli betiklerin üretilmesine neden olabilir.
Bash ile okunabilir bir yedekleme betiği yaz.
İstekler:
- İki argüman alsın: kaynak_klasor ve hedef_klasor.
- Kaynak klasör yoksa hata mesajı verip çıksın.
- Hedef klasör yoksa oluştursun.
- Kaynak klasörü .tar.gz olarak sıkıştırsın.
- Dosya adında tarih bilgisi olsun.
- Silme işlemi yapmasın.
- sudo kullanmasın.
- Değişkenleri çift tırnak içinde kullansın.
- Dry-run seçeneği eklesin.
- Her önemli satıra kısa açıklama yorumu eklesin.Bu istek, AI’ın daha güvenli ve okunabilir bir çıktı üretmesini sağlar.
AI’dan gelen betiği doğrudan çalıştırmak yerine önce okumak gerekir.
Özellikle şu komutları arayın:
Bu komutların hepsi kötü değildir.
Fakat dosya sistemi, yetkiler veya dış kaynaklarla ilgili işlem yaptıkları için dikkat gerektirir.
Komutu görmek tek başına yeterli değildir; hangi değişkenlerle ve hangi klasörde çalıştığı da incelenmelidir.
Dry-run, işlemi gerçekten yapmadan önce ne yapılacağını göstermektir.
Örnek:
Bu satır dosyayı silmez.
Sadece hangi dosyanın silineceğini gösterir.
Riskli betiklerde dry-run modu istemek iyi bir alışkanlıktır.
Aşağıdaki betik ne yapar?
#!/bin/bash
KLASOR="$1"
if [ -d "$KLASOR" ]; then
echo "Klasör bulundu."
else
echo "Klasör bulunamadı."
fiSorular:
$1 hangi değişkene atanıyor?-d testi neyi kontrol ediyor?Aşağıdaki betikte riskli olabilecek satır hangisidir?
#!/bin/bash
HEDEF="$1"
echo "Geçici dosyalar temizleniyor..."
rm -rf "$HEDEF"/*
echo "İşlem tamamlandı."Tartışma soruları:
rm -rf ne yapar?HEDEF boş gelirse ne olabilir?Riskli satır şudur:
Bu satır, HEDEF değişkeninin gösterdiği klasörün içeriğini siler.
Sorunlar:
HEDEF boş mu kontrol edilmiyor.HEDEF gerçekten klasör mü kontrol edilmiyor.Silme işleminden önce şu kontroller yapılmalıdır.
Bu kontrol, HEDEF değişkeninin boş olup olmadığını denetler.
Bu kontrol, verilen hedefin gerçekten bir klasör olup olmadığını denetler.
Aşağıdaki betik hangi durumda hata mesajı verir?
#!/bin/bash
DOSYA="$1"
if [ ! -f "$DOSYA" ]; then
echo "Dosya bulunamadı."
exit 1
fi
echo "Dosya bulundu."Seçenekler:
DOSYA iseCevap: B
AI size şu betiği verdi:
Bu betik mevcut dizindeki .log dosyalarını siler.
Asıl risk yalnızca rm komutu değildir.
Asıl risklerden biri betiğin hangi dizinde çalıştırıldığıdır.
Yanlış dizindeyseniz beklediğinizden farklı log dosyalarını silebilirsiniz.
Bu nedenle silme işlemlerinden önce mevcut dizin kontrol edilmelidir.
Önceki örnekte .log dosyaları siliniyordu.
Böyle bir betiği doğrudan çalıştırmak yerine önce hangi dizinde olduğumuzu kontrol etmek gerekir:
Sonra silinecek dosyaları gerçekten silmeden listelemek daha güvenlidir:
Bu betik dosya silmez.
Sadece hangi dosyaların etkileneceğini gösterir.
AI’dan betik isterken şu ifade eklenebilir:
"$1" neyi ifade eder?-f testi neyi kontrol eder?-d testi neyi kontrol eder?rm -rf neden dikkatle incelenmelidir?exit 1 genellikle ne anlama gelir?Bu dersten sonra şu sorulara cevap verebilmeniz beklenir:
Amaç, uzun betikler ezberlemek değil; temel yapıları tanıyıp riskleri görebilmektir.
Kabuk betiklerini tamamen yazmak zorunda olmayabilirsiniz.
Ancak bir betiği çalıştırmadan önce ne yaptığını anlamak gerekir.
Özellikle AI tarafından üretilen komutlarda şu yaklaşım güvenlidir:
Önce oku.
Etkilenecek dosyaları kontrol et.
Gerekirse dry-run çalıştır.
Daha sonra gerçek işlemi yap.Komut satırında küçük bir hata, beklenenden büyük sonuçlar doğurabilir.