---
title: 'Burada Belge ve Burada Dizgi'
source: 'https://academia.sh/tr/kurslar/kabuk-programlama/burada-belge-ve-burada-dizgi'
course: 'Kabuk Programlama'
language: tr
updated: '2026-08-17T18:10:02+00:00'
license: 'CC BY-SA 4.0'
---

# Burada Belge ve Burada Dizgi

Betiğe gömülü girdi, sonlandırıcının alıntılanmasının genişletmeye etkisi, girinti kaldırma ve tek satırlık girdi gösterimi.

Önceki üç ders girdinin iki kaynağını gösterdi: klavye ve dosya. Betikler üçüncü bir
kaynağa daha ihtiyaç duyar — betiğin kendi metnine gömülü sabit içerik. Yapılandırma
şablonu, çok satırlı kullanım iletisi, sınama verisi ve veritabanı sorgusu bu sınıfa
girer.

Bu içeriği ayrı bir dosyada tutmak, betiği tek başına taşınamaz kılar. Her satırı ayrı
`echo` ile yazmak ise satır sonlarını, tırnakları ve boşlukları elle yönetmeyi gerektirir.
Kabuk bu iş için iki gösterim tanımlar.

## Burada Belge

**Burada belge (here document)**, `<<` işlecinden sonra bir **sonlandırıcı** yazılarak
başlar; sonlandırıcının tek başına geçtiği satıra kadarki metin, komutun standart
girdisi olur.

```sh
kod=404
cat <<SON
Aranan kod: $kod
SON
```

```
Aranan kod: 404
```

Sonlandırıcı adı serbesttir; içerikte geçmeyecek bir dizi seçilir. `EOF` yaygın bir
seçimdir, ama zorunlu değildir — bu kursta `SON` kullanılacak.

İki kural katıdır. Sonlandırıcı satırında ondan başka hiçbir karakter bulunamaz;
sondaki tek bir boşluk bile satırı sonlandırıcı olmaktan çıkarır ve kabuk dosya sonuna
kadar okumaya devam ederek hata verir. İkincisi, sonlandırıcı satırı girintili olamaz —
bunun bir istisnası aşağıda ele alınıyor.

## Genişletme ve Sonlandırıcının Alıntılanması

Burada belge içeriği, öntanımlı olarak çift tırnak içindeymiş gibi işlenir: değişken
genişletme, komut yerine koyma ve aritmetik genişletme uygulanır.

```sh
ad="rapor"
cat <<SON
Kutuk: $ad.log
Satir sayisi: $(grep -c '' erisim.log)
Aritmetik: 5 * 3 = $((5 * 3))
SON
```

```
Kutuk: rapor.log
Satir sayisi: 30
Aritmetik: 5 * 3 = 15
```

Sonlandırıcı **alıntılanırsa** hiçbir genişletme yapılmaz; metin harfi harfine geçer.
Alıntılama tek tırnak, çift tırnak veya ters bölü ile yapılabilir; üçü de aynı sonucu
verir.

```sh
cat <<'SON'
Kutuk: $ad.log
Komut: $(pwd)
Aritmetik: $((5 * 3))
SON
```

```
Kutuk: $ad.log
Komut: $(pwd)
Aritmetik: $((5 * 3))
```

Bu ayrım yazım süsü değil, doğruluk koşuludur. Bir betiğe başka bir betiğin kaynak kodunu,
bir kabuk yapılandırmasını veya `$` içeren herhangi bir şablonu gömerken sonlandırıcı
alıntılanmazsa, gömülü metindeki `$` işaretleri dış betikte genişletilir ve içerik sessizce
bozulur. Kural olarak: **genişletme bilinçli olarak isteniyorsa sonlandırıcı açık
bırakılır, aksi hâlde alıntılanır.**

## Girinti Kaldırma

Burada belge, bir `if` veya `for` gövdesinin içindeyken çevresindeki kodun girintisine
uymaz; içerik harfi harfine aktarıldığı için girinti de metne girer. `<<-` biçimi bu
sorunu kısmen çözer: içerik satırlarının ve sonlandırıcı satırının **başındaki sekme
karakterlerini** siler.

```sh
if true; then
	cat <<-SON
		girintili satir
		ikinci satir
	SON
fi
```

```
girintili satir
ikinci satir
```

Kısıt açıktır: yalnızca sekme karakteri silinir, boşluk silinmez. Boşlukla girintileyen
bir dosyada `<<-` hiçbir işe yaramaz. Bu, kabuk dilinin taşınabilir tutulmuş ama
kullanışsız kalmış köşelerinden biridir; yazım kurallarınız boşluk girintisi
gerektiriyorsa burada belgeyi girintisiz bırakmak daha az sürprizlidir.

## Burada Dizgi

**Burada dizgi (here string)**, tek satırlık girdi için kısaltmadır. `<<<` işlecinin
sağındaki değer, sonuna bir satır sonu eklenerek komutun standart girdisi olur.

```sh
ad="rapor"
tr 'a-z' 'A-Z' <<< "$ad hazir"
```

```
RAPOR HAZIR
```

Eklenen satır sonu gerçektir ve sayılır:

```sh
wc -c <<< "abc"
printf '%s' "abc" | wc -c
```

```
       4
       3
```

Bu fark, uzunluk sayan veya baytı baytına karşılaştıran işlerde önemlidir. Satır sonu
istemiyorsanız burada dizgi değil, `printf` ile boru hattı kullanın.

Burada dizginin en yaygın kullanımı, bir dizgiyi alanlarına ayırmaktır:

```sh
read -r adres kod <<< "10.0.0.12 200"
echo "adres=$adres kod=$kod"
```

```
adres=10.0.0.12 kod=200
```

Aynı işi boru hattıyla yapmak, önceki dersteki alt kabuk tuzağına düşerdi:
`echo ... | read` yazımında `read` alt kabukta çalışır ve atadığı değişkenler kaybolur. Burada dizgi
yönlendirmedir, boru değildir; komut ana kabukta kalır. `<<<` bash eklentisidir, POSIX
kabuk dilinde yoktur.

## Boru Hattında ve Yönlendirmeyle

Burada belge de sıradan bir girdi yönlendirmesidir; komutun geri kalan yönlendirmeleriyle
ve boru hattıyla birlikte kullanılabilir. Yönlendirmeler komut satırının sonunda toplanır,
içerik ise komutu izleyen satırlardan başlar:

```sh
sort <<'SON' | head -2
gamma
alpha
beta
SON
```

```
alpha
beta
```

Çıktının hedefe yazılması da aynı satırda belirtilir. Bu, sabit içeriği dosyaya dökmenin
en doğrudan yoludur:

```sh
cat > mini.log <<'SON'
10.0.0.1 GET /a 200
10.0.0.2 GET /b 404
SON
```

```sh
wc -l mini.log
```

```
       2 mini.log
```

## Kütüğü Yeniden Üretmek

Bu kursun `erisim.log` dosyası bir dış kaynaktan indirilmez; betikle üretilir. Böylece
her okur aynı veriyle çalışır ve sonuçlar birebir karşılaştırılabilir olur.

Aşağıdaki `veri-uret.sh` betiği kütüğü sıfırdan yazar. Sonlandırıcı alıntılanmıştır:
içerikte `$` geçmese bile, veri metnini genişletmeye açık bırakmamak doğru varsayılandır.

```sh
cat > veri-uret.sh <<'BETIK_SONU'
cat > erisim.log <<'SON'
10.0.0.12 - - [07/Feb/2024:09:12:44 +0000] "GET /index.html HTTP/1.1" 200 5120
10.0.0.31 - - [07/Feb/2024:09:12:51 +0000] "GET /statik/stil.css HTTP/1.1" 200 2048
SON
BETIK_SONU
```

Dıştaki sonlandırıcı (`BETIK_SONU`) ile içteki (`SON`) farklı seçilmiştir. Aynı olsalardı
dış belge ilk `SON` satırında biterdi ve geri kalan metin komut olarak yorumlanırdı. İç
içe burada belge yazarken sonlandırıcıların ayrı olması zorunludur.

Yukarıdaki parça, dersin başındaki otuz satırın ilk ikisini içerir; tam veri
kümesi Standart Girdi, Çıktı ve Hata dersinde verilmişti. Kendi `veri-uret.sh`
dosyanızı otuz satırın tamamıyla oluşturun; sonraki derslerde kütük bozulduğunda tek
komutla geri getirilebilir olacak.

## Ne Zaman Hangisi

Üç gösterim aynı işi farklı ölçeklerde yapar:

| Gösterim | Girdi | Genişletme | Tipik kullanım |
|---|---|---|---|
| `<< SON` | çok satırlı | uygulanır | şablon, biçimlendirilmiş rapor başlığı |
| `<< 'SON'` | çok satırlı | uygulanmaz | gömülü kaynak kod, sabit veri |
| `<<<` | tek satırlı | uygulanır | dizgiyi alanlara ayırma, tek satır süzme |

Dördüncü bir seçenek olarak `printf` ile boru hattı her zaman kullanılabilir ve
tamamen taşınabilirdir; karşılığında satır sonlarının elle yönetilmesini ister.

## Özet

- Burada belge, `<<` ile başlar ve sonlandırıcının tek başına geçtiği satıra kadarki
  metni komutun standart girdisi yapar.
- Sonlandırıcı alıntılanmazsa içerik çift tırnak kuralıyla genişletilir; alıntılanırsa
  harfi harfine geçer. Gömülü kaynak kodda alıntılamak zorunludur.
- `<<-` biçimi yalnızca sekme girintisini kaldırır; boşluk girintisine etkisi yoktur.
- Burada dizgi tek satırlık girdi verir ve sonuna satır sonu ekler; boru hattının aksine
  komutu alt kabuğa itmez.
- İç içe burada belgelerde sonlandırıcılar farklı seçilmelidir.

## Sonraki Adım

Bu konudaki tüm örneklerde komutların başarılı olduğu varsayıldı. Oysa `grep` eşleşme
bulamadığında, `cut` dosyayı açamadığında ya da `sort` disk alanı bulamadığında bir
sonuç bildirir. Sonraki ders bu bildirimi — çıkış kodunu — tanımlar: sıfırın neden başarı
demek olduğunu, `&&` ve `||` işleçlerinin bu koda nasıl bağlandığını ve kabuğun kendi
ayırdığı kod aralıklarını ele alır.
