'echo'

'Hello World!' isimli blogda ekrana 'Hello World' yazdırmak için 'echo' komutunu kullandık. Fakat echo komutu, basit bir komut değildir. Şimdi, biraz detaya girelim.

Normalde programlama dillerinde 'Data Types - Veri Tipleri' diye bir konu vardır. Bu veri tipleri arasında temel olarak 'string', 'int', 'float', 'bool' veri tipleri vardır. Detay vermeden kısaca açıklayacağım.

'string' veri tipleri, metinsel ifadeleri kapsar ve değerler çift tırnak veya tek tırnak arasına yazılır. Örneğin; 'Cyber Worm' veya "Cyber Worm" şeklinde.

'int' veri tipleri, tam sayıları ifade eder ve aldığı değer tırnak içerisine yazılmadan kullanılır. Örneğin; 2, 1000, 39 gibi.

'float' veri tipleri, kesirli (virgüllü) sayıları ifade eder ve tırnak içerisine alınmazlar. Örneğin; 2.13, 100.19, 20.1 gibi.

'bool' veri tipleri ise yalnızca iki değer alır. Bunlar; 'true' ve 'false' şeklindedir. Tırnak içerisine yazılma durumu programlama dilinden programlama diline değişiklik gösterir fakat genel olarak tırnak içerisine alınmaz. Örneğin; true, false gibi.

Peki, bunları neden anlattım? Normal şartlarda programlama dillerinin çoğunda bir 'int' ile bir 'string' veya 'float' ile 'int' yan yana gelemez. Bunun için çeşitli dönüştürme (type conversion) işlemleri vardır ama bu genel olarak böyledir. Fakat Python gibi bazı programlama dillerinde bu geçerli değildir. Yani örneğin bir 'int' ile bir 'string' yan yana gelebilir; bazı kurallar şartıyla. GoLang programlama dilinde bu durumun nasıl olduğunu görmek için GoLang Dersleri isimli kategorimize bakabilirsiniz. Ben, Python ile ufak bir örnek yapacağım; Python bilmenize gerek yoktur. 

Yukarıdaki 'print' kelimesi; Bash'teki 'echo' kelimesiyle aynı işi yapar; ekrana yazı verir. Dikkat edin 'print()' şeklinde bir kullanım yapmışız ve parantezler içerisine dilediğimizi yazmışız. İçerisinde hem int hem string hem de float var. Çıktı kısmına baktığımızda da her şeyin yolunda olduğunu, kodun çalıştığını görüyoruz. Şimdi, Bash'e gelelim.

Önce sağdaki gedit ekranının ilk satırına bakalım. Kodumuz; echo "Hello, Cyber Worm. How you doin'" şeklinde. Bu satırda herhangi bir sorun yoktur; zaten sol tarafta terminalde yazanlar arasından ilk satıra baktığınızda her şeyin normal olduğunu görürsünüz.

İkinci satırda da bir problem yoktur. Sadece üç tane string değer verip bunları birbirinden virgül ile ayırmışız. İlk satırda tek bir string ifadesi varken burada hepsini ayırmışız. Bunda da sorun yoktur.

Üçüncü satıra baktığınızda sanki bir metin değeri (string) girmemişiz gibi duruyor. Ayrıca dikkat edin; önceki satırlarda doin' şeklinde bir ifade yazmışken son satırda doing şeklinde bir ifade kullanmışım. Peki, bunu neden yaptık? Yani neden burada da doin' yerine doing yaptık?

Şimdi doin' şeklinde kullandık ama hata aldık. Hata mesajlarını inceleyelim.

İlk hatamız; "unexpected EOF while looking for matching `''. Buradaki EOF, End-of-line yani satırın sonu anlamına gelir. Hatanın anlamı ise şudur: " ' ' eşleşmesini ararken beklenmedik satır sonu ile karşılaştık.". İkinci satırdaki hatamız da benzer şeyi söylüyor.

Şimdi, kırmızı kutuya bakalım. Biz, aslında string olan bir değeri tırnak içerisine yazmadık; evet, Bash için bu bir sorun değil ama cümle içerisinde bir tırnak işareti mevcut. Bu ne demek? Tırnaktan sonra yazılan her şey string oldu demektir; zaten dikkat ederseniz tırnaktan sonra yazan her şeyin rengi de yeşile döndü.

Peki neden hata aldık? Çünkü bir tırnak açılırsa o tırnak kapanmak zorundadır; string bir ifadenin saptanması ve ona göre yorumlanması lazım. Burada amacımız, doin' yazmaktı ama Bash bunu böyle yorumlamadı; şu an bizden o tırnak işaretini kapatmamızı bekliyor.

İşte, Bash içerisindeki bu 'veri tipi özgürlüğü' bazen kötü sonuçlara yol açabiliyor. Yani siz, tırnak işareti olmadan bir string yazabilirsiniz ama oradaki en ufak sıkıntı bile size bu şekilde hata verecektir. Bu konu okunabilir kod (readable code) konusuna kadar uzar. Buradan varmamız gereken sonuç tam olarak şudur: "Evet, Bash'te veri tipi özgürlüğü var ama bizim, daha sağlıklı sonuçlar elde edebilmemiz için yine de her veri tipini olduğu gibi yazmamız gerekir."

Şimdi, kodumuzu düzeltelim ve işimize devam edelim.

İsterseniz bir de int ve float tiplerine bakalım.

Yukarıda, üç farklı veri tipini de kullandık ama herhangi bir sorunla karşılaşmadık. Hepsi, istediğimiz gibi sonuçlar verdi. Peki, sizce toplama işlemi gibi matematiksel işlemleri bu kadar kolay yapabilir miyiz? Yine Python'dan örnek vereceğim.

Yukarıdaki Python örneğinde yaptığımız tek şey iki değeri toplamak oldu; sonuçları da doğru bir şekilde önümüze geldi. Aynı şeyi Bash için deneyelim.

Bunu gördükten sonra; "Bu ne şimdi?", "Neden toplamadan, sadece yazdıklarımızı yazdırdı?", "Hani Python'daki print() ile aynı şeyi yapıyordu?" tarzında onlarca sorunuz olabilir. Buradan şunu anlamamız gerekiyor: "echo ile bir şeyleri ekrana yazdırdığımız zaman Bash, hepsini string olarak kabul ediyor". Evet, öyle. Bu sorunu ileriki zamanlarda çözeceğiz; o konuda endişe duymayın. Şu an odaklanmanızı istediğim konu 'echo'.

Peki, echo'nun başka yetenekleri var mı? Elbette var; bash bu!

Yukarıda gördüğünüz gibi 'deneme.txt' isimli, sıradan, boş bir metin belgesi oluşturdum. Şimdi bunun içine bir şeyler yazalım.

Evet, tahmin ettiğiniz gibi dosyayı açıp içerisine bir şeyler yazmadım; bunu, komut satırından yaptım. Bordo kutu içerisindeki ilk komuta bakalım; 'cat deneme.txt'. 'cat' komutu, Kali'yi Tanıyalım isimli blogda da belirttiğimiz gibi bir dosyanın içeriğini okumamıza olanak tanıyordu. Burada bunu çalıştırdığımızda hiçbir şey göremedik çünkü dosyanın içinde bir şey yazmıyor. Bunu, dosyanın içeriğinin boş olduğunu görmeniz için yaptım.

Yeşil kutu içerisine aldığım ikinci komut ise dosyaya dokunmadan dosyanın içerisine dilediğimizi yazabilmemize olanak tanıyor; bunu inceleyelim. 'echo > deneme.txt "Cyber Worm" 12' Buradaki 'echo' komutunun ne işe yaradığını zaten biliyorsunuz. '>' yani büyüktür işaretini, İngilizce'deki 'to' yani '-e, -a' ekine benzetebilirsiniz. Ondan sonra gelen, dosyamızın ismi oldu (deneme.txt). Aslında buraya kadar olan kısım işin bel kemiğini oluşturuyor. Burada söylenmek istenen şey tam olarak budur: "Echo to deneme.txt" yani "deneme.txt'ye yankı yap".

Sonrasında gelen "Cyber Worm" 12 kısmı ise yazdıracağımız metni temsil eder. Komutun tüm anlamı da şu şekilde yorumlanabilir: "Echo "Cyber Worm" 12 to deneme.txt" yani "deneme.txt'ye "Cyber Worm" 12 ifadesini yankıla (yazdır)".

İşte, dosyaya direkt olarak müdahalede bulunmadan kendisini bu şekilde kontrol edebiliyoruz. İlk önce 'echo' komutunu giriyoruz. Sonra '>' işaretini veriyoruz ve hangi dosya için işlem yapılacaksa o dosyanın ismini veriyoruz. Son olarak belirttiğimiz dosyanın içerisine yazacağımız ifadeyi de en sona yazıyoruz.

Peki, aynı işlemleri kod ile yapamaz mıyız? Tabii ki yapabiliriz; bash bu!

İlk önce sağ tarafta duran gedit ekranına bakalım. Biraz önce terminal ekranına verdiğimiz komutu bu sefer kod sayfasına yazdık; sadece 12 sayısı eksik, o da önemli değil. Şimdi de terminale bakalım. İlk komut ile dosyanın içeriğinin boş olduğunu kanıtladık. Daha sonra terminal ekranına echo > deneme.txt "Cyber Worm" şeklinde yazmak yerine sadece kod dosyamızı çalıştırdık. Son olarak tekrar içeriği kontrol ettiğimizde başarılı bir şekilde sonuçlandığını gördük. Lütfen yaptığımız her şeyi deneyin.

echo konusu için bundan sonra sadece terminal üzerinden gideceğim.

Şirketinizde yetkili biri, deneme.txt isimli bir dosyada 5 adet 'Cyber Worm' yazdığını söylüyor ve sizden, altıncıyı eklemenizi ve bunu, ' | 6.Cyber Worm' şeklinde yapmanız gerektiğini belirtiyor. Lütfen şu ana kadar öğrendiklerimiz ile bu dosyadan oluşturup, içerisine aynılarını yazıp size verilen görevi yapmaya çalışın.

Yaptığınızı varsayarak devam ediyorum.

Yüksek olasılıkla echo > deneme.txt " | 6.Cyber Worm" şeklinde bir komut girdiniz ve dosyanın içeriği tamamen silindi; patronunuz sizi azarladı. Demek ki; echo kullanarak bir dosyaya bir şey yazarken > işaretini kullanırsanız dosyadakileri tamamen siler, sadece yazdığınızı oraya aktarmış olursunuz. Bu büyük bir hatadır ve sorundur.

Bu sorunu çözmek için oldukça basit bir işlem yapacağız.

Komuta dikkatli bakın. Değiştirdiğim tek şey küçük, kırmızı yuvarlak içerisine aldığım kısım. Az önceki komutta tek bir tane > işareti vardı; biz bunu ikiye çıkardık ve sonuç tamamen beklediğimiz gibi oldu. Demek ki; echo komutunun, bir dosyanın içeriğinin silmesini ve sadece sizin istediğiniz şeyi yazmasını istiyorsanız bir adet > işareti; bir dosyanın içeriğini silmeden o dosyaya bir şeyler eklemek istiyorsanız da iki adet > işareti koymanız gerekir.

'Kali'yi Tanıyalım' isimli blogda daha önce öğrendiğimiz 'man' komutu ile echo'nun ne işe yaradığını biraz inceleyelim. Bunun için aşağıdaki gibi bir komut verip echo'nun man dosyasına erişiyoruz.

Aşağıdak görselde, kırmızı kutu içerisine aldığım kısma dikkat edin.

Kısaca ve özetle, diyor ki: "Eğer -e parametresini verirsen kaçış karakterlerini kullanabilirsin." Peki, bu ne demek oluyor?

Kaçış karakterleri dediğimiz komutlar vardır. Bu komutlar arasından en yaygın kullanılan iki tanesini göreceğiz.

'\n'

Bu ifade, 'new line' yani 'yeni satır' anlamına gelir. Bu parametreyi echo komutuna verdiğimizde, bizim için bir alt satıra inecektir. Hemen bakalım.

Normal şartlarda çıktı kısmında alt alta gözükmesini istediğimiz şeyleri görseldeki gibi gerçekleştirirsiniz. Şimdi, aynı şeyi tek bir satır ile yapalım.

Gördüğünüz gibi ilk işimiz, echo komutundan sonra '-e' parametresini vermek oldu. Daha sonra yazdığımız cümle içerisinde neleri ayırmak istiyorsak onların arasına \n ifadesini yerleştiriyoruz. Fakat dikkat edin; normal slash işareti değil (/), ters slash (backslash 'AltGr+*') işaretini kullanıyoruz. Bu ifadeden sonra gelen bütün karakterler, bir alt satıra geçecektir.

Bir de bu boşluk işinin bir TAB kadar olanı vardır.

Bu sefer, kullanacağımız ifade '\t' şeklinde olacaktır. Bu ifade, arasına girdiği kelimeler arasına bir TAB boşluğu kadar boşluk bırakır.

Dilerseniz, bunlardan birden fazla da koyabilirsiniz:

Gördüğünüz gibi iki adet '\t' ifadesi yerleştirdim ve aradaki boşluk biraz daha artmış oldu.

Elbette, bu iki karakteri en sık kullanılanlardan olduğu için gösterdim. man dosyasının biraz daha aşağısına inerseniz, yapabileceklerinizi görebilir ve onları deneyebilirsiniz.


Yayınlanma Tarihi: 2022-08-31 22:38:25

Son Düzenleme Tarihi: 2022-09-21 14:55:51