Linux Unix

Linux Bash Script Yazım Teknikleri 1.Bölüm Genel Kavramlar

Merhaba arkadaşlar,

Bu makalemizde sizlerle beraber Linux Shell kabuğu üzerinden BASH script yazma ile alakalı temel bilgileri paylaşıyor olacağım.Gelin isterseniz BASH Script’inin kısaca özgeçmişine bakalım;

Bash, Brian Fox tarafından GNU Projesi için Bourne kabuğunun yerine ücretsiz bir yazılım olarak yazılmış bir Unix kabuğu ve komut dili olarak ortaya çıkmıştır.İlk olarak 1989’da piyasaya sürülmüştür.Linux dağıtımında ve Apple’ın MacOS Mojave ve önceki sürümlerinde varsayılan giriş kabuğu olarak yaygın bir şekilde kullanılmıştır. Günümüzde Windows 10 için de kullanılan bir sürümü mevcuttur.

Bash, genellikle kullanıcının eylemlere neden olan komutları yazdığı bir metin penceresinde çalışan bir komut işlemcisidir. Bash ayrıca kabuk betiği adı verilen bir dosyadaki komutları okuyabilir ve yürütebilir. Tüm Unix kabukları gibi, dosya adı globbing (joker karakter eşleştirme), boru tesisatı, burada belgeler, komut değiştirme, değişkenler ve durum testi ve yineleme için kontrol yapılarını destekler. Anahtar kelimeler, sözdizimi, dinamik olarak kapsamlandırılmış değişkenler ve dilin diğer temel özellikleri sh’den kopyalanır. Diğer özellikler, örneğin tarihçe, csh ve ksh’den kopyalanır. Bash POSIX uyumlu bir kabuktur, ancak bir takım uzantıları vardır.

Bash komutu sözdizimi, Bourne kabuğu komut sözdiziminin bir üst kümesidir. Bash, diğer özellikler arasında küme ayracı genişletme, komut satırı tamamlama, temel hata ayıklama ve istisna işleme (tuzak kullanarak) destekler. Bash, Bourne kabuğu komut dosyalarının büyük çoğunluğunu, değişiklik yapılmadan, Bash’te farklı şekilde yorumlanan saçak sözdizimi davranışına giren veya daha yeni bir Bash yerleşikine uyan bir sistem komutunu çalıştırmaya çalışırken, vb. Çalıştırılmadan istisna olarak uygulayabilir. Bir kullanıcı etkileşimli bir komut kabuğundaki sekme tuşuna bastığında, Bash otomatik olarak komut Bash’in sözdiziminde Bourne kabuğunda eksik olan birçok uzantı vardır. Bash, harici işlemleri oluşturmadan tamsayı hesaplamaları dahil bir çok işlemi yapabilirsiniz

Linux ve UNIX sistemlerde yaygın kullanılan bazı kabuk(Shell) türleri şu şekildedir;

Bourne Shell: İlk kullanılan UNIX kabuğudur ve çoğu UNIX dağıtımı ile birlikte öntanımlı kabuk olarak dağıtılmaktadır.

Korn Shell: Korn Shell SH ile uyumlu, birçok ek programlama özelliği  de içeren bir kabuk türüdür.

Bourne Again Shell: Kullanım kolaylığı bakımından en çok rağbet gören bash,  sh ve ksh uyumluluğunu korurken, özellikle etkileşimli kullanıma yönelik (komut tamamlama, gibi) birçok yenilik de içerir.

C Shell: Berkeley Üniversitesi’nde geliştirilen csh’in C diline benzer bir programlama yapısı vardır. Özellikle programcılar tarafından tercih edilir.

TCSH: csh’ın biraz geliştirilmiş hali diyebiliriz.

Linux üzerinde kullanıcının işletim sistemini kullanması için temel iki yol vardır. Bunlardan biri GUI olarak adlandırdığımız grafik arabirimler diğeri de konsol üzerinden yapabileceğimiz komut satırı yönetimidir.Kabuk programlamada en temel fonksiyon esasında konsol üzerinden verilen komutları belirli bir derleme üzerinden çalıştırarak çıktı elde edilmesi faliyetidir. Daha sade anlatmak gerekir ise gün içerisinde user veya sistem tabanlı konsol işlemlerimizi bir dosya içerisinde derleyerek bir shell script yazmış oluruz. Tabiki belirli amaçlara yönelmiş programlar için fonksiyon, dizi , döngüler gibi daha üst düzey yapılar kullanmamız gerekebilir ki bu makalede anlatacağımız yapılardan bir tanesi olan “bash” bunları fazlasıyla sağlamaktadır.

Kod yazmaya başlamadan bir ek daha yapalım. Makalemiz içerisinde yazdığımız script örneklerini sizlerde herhangi bir Linux sürümü içerisinde yazıp çalıştırabilirsiniz.Yanlız her işlem için konsolu tercih ediyor iseniz Nano ve Vi gibi konsol tabanlı editörleri de kullanmayı deneyebilirsiniz.

Bash Shell hakkında biraz konuştuktan sonra isterseniz minik minik uygulamalara girelim.

Ben scriptleri Kali Linux üzerinde yazmak istediğimden ötürü bu işletim sisteminin kernel tarafında çalışacağım dilerseniz siz farklı bir Linux sistem üzerinde çalışabilirsiniz.Kali makinama SSH bağlantımı yaparak terminal oturumunu açıyorum.

Ssh bağlantımızı yaptıktan sonra kernel içerisinde geçerli Shell tiplerini “cat /etc/shells” komutu ile görebilmekteyiz.Yukarıda anlattığım kabuk türleri içerisinde kullanacağımız kernel katmanı bash olacağından ötürü örneklerimizi bu shell üzerinden konumuzda şekillendireceğiz.

Sistemimizin default olarak hangi Shell kabuğunu kullandığını öğrenmek istiyor isek bunun için komut satırına “which bash” yazarak öğrenebiliriz.Sistemimiz default olarak “/.bin” dizinin altında çalıştırılan bash kabuğunu kullanmakta.

Peki Bash shell’inin bulunduğu Bin dizini ne işe yaramaktadır.Bin dizini olması gereken şartlarla dolu komut dosyalarını içerir.Bunun dışında Başlıca alt dizinler /boot, /dev, /etc, /home, /initrd, /lib, /lost+found, /misc, /mnt, /opt, /proc, /root, /sbin, /tmp, /usr ve /var dizinleridir.Bunlar Linux Kernel yapısının çalışmasını ve faliyetini düzenleyen dizin grubudur.

Script yazmadan önce sistemimizde ister Masaüstünde iserseniz başka bir dizinin altında bir dizin oluşturarak işe başlıyoruz.Tabi bu Scriptleri çalıştırmak için öncelikle Root yetkisine sahip hesabımız ile giriş yapmamız gerekli.Bunun için Sudo –S komutu ile root yetkisini aldıktan sonra “mkdir BashScript” komutunu yazarak bir adet dizin oluşturuyoruz.Sonrasında ls komutu ile dizinimizin oluşup oluşmadığını kontrol ediyoruz.

BashScript dizinimizi oluşturduktan sonra bu dizinin içerisine bir adet ScriptOrnek dosyası oluşturuyoruz.Tabi bunun akabinde bu dosya içerisinde yetkili şekilde işlem yapabilmek için )script çalıştırma) dosya izinlerini chmod +x yetkisini vererek içerisinde çalışma alanımızın yetkilendirilmesini sağlıyoruz.

Daha sonra Nano editörü ile oluşturduğumuz dosya içerisine giriyoruz.

Dosyamıza gerekli izinleri verdikten sonra nano editörü ile dosyamızı açıyoruz.Buradaki komutlar default gelmemekte.Bu sizi yanıltmasın.Yazdığım komutları size detaylı şekilde açıklayacağım.

Bildiğiniz gibi eğer yazılım diline biraz aşina iseniz belirli değişkenler ve operatörler vardır.Bir script yazar iken bu script türüne göre başlangıç komutları mevcuttur. Script yazdığımızdan ötürü bu tarz scriptlerin her zaman başlangış noktasında #! /bin/bash komutunu kullanmamız gerekmektedir.Bunun sebebini açıklamak gerekir ise;

#! /bin/bash

#!:Yazmak istediğiniz herhangi bir script dosyasını yazmaya başlamadan önce her daim bu ifadeyi kullanmanız gerekmektedir.Bunun sebebi ise Shebang olarak bildiğimiz bu başlangıç karakterinin bizim hangi bash programını kullanıcak isek onu yazmamız için gerekli olan dizindir.

/bin/bash: Şimdi burdaki en kritik nokta hangi bash yazılımı kullandığımızı bu kısımda belirtmemiz gereklidir.Neden diye sorulucak olursa eğer bunu belirtmez isek farklı sistemlerde bu derlediğimiz Script çalışmayabilir.Tabi Linux sisteminizin hangi bash yazılımını kullandığını biraz üstte “which bash” komutu ile görebileceğinizi söylemiştim.Tabiki bunu yazmasanızda yani (#!—null) olarak bırakırsanız da yazdığınız script çalışabilir. Yanlız yazdığınız Script başka bir sistemde çalıştırılmak istendiğinde hata verme ihtimali vardır. Bu yüzden bu bash dizinini yazmayı kesinlikle bir alışkanlık haline getirmenizde fayda olduğu düşüncesindeyim.

Echo komutuna gelirsek.Aslında C# da ilk derslerde bilirsiniz.Derlemek ve insert ettiğimiz veriyi terminale yazmak için “console.writeline (“Merhaba Dünya”); yazdığınızda ve Ctrl+F5 ile derlediğinizde konsola Merhaba Dünya nasıl yazıyor ise herhangi bir komutu derleyip ekranda göstermek istediğinizde “echo” komutunu kullanırız.Bunu hemen hemen bütün scriptlerimizde değişkenlerin ve diğer değerlerin terminalde görünmesi için sürekli kullanacağız.

Nano editör ile yazdığımız (echo “merhaba Çözümpark” ) yazdıktan sonra Ctrl+X ile kayıt ettikten sonra sıra geldi yazdığımız ilk temel ayarları bulunan scriptin çalıştırılmasına.Bunun için ilgili dizin üzerinde iken (./script ismi) olarak çalıştırabiliyoruz.Peki bunu neden böyle çalıştırmaktayız.Bunuda ayrıca detaylandırmak isterim.

Linux Sisteminde komut satırının çalışma mantığında,eğer bir script veya uygulama derlemek istediğinizde kullandığınız sistem içerisinde çalıştırdığınız uygulamayı path içerisinde bulunan klasörlerde tarayacaktır.Bu sebeptendir ki bulunulan klasör ifadesi olarak “./script dosyası” işaretiyle gerçekleştirilir.

Nano editör ile yazdığımız scripti çalıştırdıktan sonra ekran satırına gördüğünüz üzere yazdığımız mesaj gelmiş bulunmaktadır.

Peki ben bunu normal Linux sistemi içerisinde herhangi bir methoda ihtiyaç duymadan nasıl çağırabilirim ?

Mesela dizin içerisinde çağırdığımızda gördüğünüz gibi gayet rahat şekilde scriptimiz çalışmakta.Ama dışarıya çıktığımızda bu dizin içerisindeki Script yolunu bulamadığından çalışmamakta.Bununda gayet kolay bir yöntemi var adım adım bunu irdeleyelim.

Öncelikle terminalden “/usr” dizinine geçerek işlemimize başlıyoruz.Peki neden bu dizine geldik ? USR dizinin görevi  önemli sistem dosyalarını tutmasıdır. Bu bölüm genelde en kalabalık dizindir, zira yeni kurulan tüm programlar buraya konulmaktadır.Bunun içerisinde bizi ilgilendiren 2 alt dizin vardır.

Bunlar;

Bin-Kullanıcı komutlarını barındıran dizin.

Sbin-Admin komutlarını barındıran dizin.

Şimdi bizim masaüstümüzde bulunan dizini direk usr dizinin içerisine bulunan bin dizinine alıyoruz.

Terminale “/cd /bin” yazarak Bin dizinin içerisine oluşturduğumuz script dosyasının eklendiğini görüyoruz.

Gördüğünüz gibi artık Linux dizinlerinden herhangi bir kısmında scripti çalıştırabiliyoruz.

Değişkenler Nedir ve Nasıl Kullanılır ?

Değişken dediğimiz fonksiyonlar alanındaki hafızasında değer tutan gerektiğinde referans olarak kullanılabilen yada gerektiği zamanda değişebilen araçlardır.Hafızada bir miktar yer ayırıp içerisinde bir değer tutarsınız ve ihtiyacınız olduğunda başka bir hafıza alanı kullanmadan değişkenin değerini değiştirip tekrar kullanabilirsiniz. Çok kullanışlı bir yapı olan değişkenlerin kullanımında uyulması gereken bazı kurallar bulunmaktadır. Bu kurallara mutlaka uymalısınız.

Bir değişkene atıfta bulunup referans göstermek istediğinizde, değişken isminin başına ( $ ) işareti koymanız yeterlidir.Özellikle sistem ve kullanıcı değişikenlerinde buna dikkat edilmesi gerekmektedir.

   
Sistem DeğişkeniKomut AnlamıDeğişken Değer Türünü Görüntülemek İçin Kullanılan Parametre
BASH_VERSIONHolds the version of this instance of bash.echo $BASH_VERSION
HOSTNAMEThe name of the your computer.echo $HOSTNAME
CDPATHThe search path for the cd command.echo $CDPATH
HISTFILEThe name of the file in which command history is saved.echo $HISTFILE
HISTFILESIZEThe maximum number of lines contained in the history file.echo $HISTFILESIZE
HISTSIZEThe number of commands to remember in the command history. The default value is 500.echo $HISTSIZE
HOMEThe home directory of the current user.echo $HOME
IFSThe Internal Field Separator that is used for word splitting after expansion and to split lines into words with
the read builtin command. The default value is <space><tab><newline>.
echo $IFS
LANGUsed to determine the locale category for any category not specifically selected with a variable starting with LC_.echo $LANG
PATHThe search path for commands. It is a colon-separated list of directories in which the shell looks for commands.echo $PATH
PS1Your prompt settings.echo $PS1
TMOUTThe default timeout for the read builtin command. Also in an interactive shell, the value is interpreted as
the number of seconds to wait for input after issuing the command. If not input provided it will logout user.
echo $TMOUT
TERMYour login terminal type.echo $TERM
export TERM=vt100
SHELLSet path to login shell.echo $SHELL
DISPLAYSet X display nameecho $DISPLAY
export DISPLAY=:0.1
EDITORSet name of default text editor.export EDITOR=/usr/bin/vim

Yukarıda gördüğünüz sistem değişkenlerini sizde kendi scriptinize yaptığımız uygulamalardaki  gibi ekleyebilir çalıştırabilirsiniz.

Sistem ve kullanıcı değişkenlerine örnek olarak bir adet yukarıdaki Description kısmında yer alan değişkenleri yazarak CTRL-X ile kayıt ediyoruz.

Gördüğünüz gibi sistem değişkenlerini terminale yazdırdık.Yanlız burda şu nokta var bir önceki durumda biz yazdığımız scripti bin klasörüne usr dizininden eklediğimiz için eskisi çalışıcaktır.Scripti her kayıt ettiğinizde yani güncellediğinizde usr dizinine gidip cp komutu ile kopyalamanız gerekmektedir.

Kullanici değişkeni ise siz kullanıcı olarak girdiğiniz verilerin ekrana yansımasıdır.Esasında bu noktada read dediğimiz değişkeni Numara kısmına set ederek kullanıcının terminal üzerinden insert etmesini sağlayarak çıkan sonucu derliyoruz.

Numaralar kısmında girdiğimiz sayıyı Numara değişkenine atayarak sonucu direk yazdırdık.

Diyelim ki terminal üzerinden insert ederek bir kullanıcı adı ve şifre yazdırmak istiyorsunuz.Bunun için “read –p” parametresini kullanırız.Bunu kullanmamızdaki amaç yazım dizilimini tutarlı şekilde kalmasını sağlamak.

CTRL+X ile kayıt edip terminalden scripti çağırdığımızda kullanıcı verilerini insdert ederek ekranda bu yazılan verilerin çıktısını yatay şekilde alabiliyoruz.

Eğer girilen veride şifrenin giriş yapar iken görünmemesini istiyor isek “read –sp” parametresini ekleyebiliriz.

Bash ile alakalı dizilerin kullanımına ilişkin pratik örnekleri bulmak zordur. Bende temel olarak bir kaç farklı uygulama ile bu konuda sizlere bilgileri pekiştiricek çeşitli temel uygulamalar göstereceğim.Örneğin, sisteminizde gerçekten hiçbir şey yapmayan ancak matematiksel serileri hesaplamak için dizileri kullanan çok sayıda komut dosyası oluşturabiliriz. Esasında dizilerin kullanım zorluğunun nedenlerinden bir tanesi dizilerin oldukça karmaşık yapılar olmasıdır. Dizilerin kullanılabileceği en pratik örneklerin, diziler kullanılarak sisteminize zaten uygulanmış olduğunu, ancak daha düşük bir düzeyde, çoğu UNIX komutunun yazıldığı C programlama dilinde olduğunu eğer biraz iç sistemlerin yazılım mantığını karıştırırsanız göreceksiniz. Buna iyi bir örnek Bash geçmişi yerleşik komutudur. İlgilenen okuyucular Bash kaynak ağacındaki yerleşik dizinini kontrol edebilir ve bu bileşenleri derlerken işlenen kaynak dosyasına bakabilirler.

Peki Dizi yani Array kavramı nedir bundan bahsetmek gerekir ise array dediğimiz yapının temel mantığı aynı tip verilerin birbiri arkasına tanımlanmasıdır. Esasında dizi yapısını bir büyük kümeye benzetebiliriz.Bunun içerisindeki aynı tip verilere teker teker erişmek yerine bir dizi içerisinde atadığımız tek bir isimle erişmek için kullandığımız bir fonksiyondur. Bir dizinin bütün elemanları bellekte peşpeşe saklanırlar. Diziler kullanılarak, aynı isimle birden fazla değişkene erişilebilir ve işlem yapılabilir. Diziler tek ya da çok boyutlu olarak tanımlanabilir ve dizi boyutu ihtiyaca göre ayarlanabilir.char, int, float ve double olarak tanımlanabilen dizilerde sadece aynı veri türünden değişken değerleri yer alabilir.Dizileri tek boyutlu ve çok boyutlu olarak iki kısma ayırabiliriz. Tek boyutlu dizilere sayı dizilerini ve vektörleri örnek verebiliriz. Çok boyutlu dizilere ise matrisleri örnek verebiliriz.

Array Mantığına örnek bir uygulama yapalım;

Örnek olarak kullandığımız script mantığına bakar isek 6 adet sayı değişkenini atayarak toplam dizin ve ona atanan indexkleri kapsayan bir uygulama yazdık.Dikkat ederseniz array yapısı kullanır iken $ {Arr [*]} gibi yapılarda “*” yerine “@” işaretinin kullanılabileceğini unutmayın, sonuçta, alıntı yapılan bir dizgideki dizideki öğelere genişleme dışında sonuç aynı olur. Bu durumda, davranış, “$ *” ve “$ @” dizili dizelerde “$ *” ve “$ @” nin genişletilmesiyle aynıdır: “$ {arr [*]}” tüm öğeleri tek bir sözcük olarak döndürür, oysa “$ {arr [@] } “her maddeyi ayrı bir kelime olarak döndürür.

$ {arr [*]} # Dizideki öğelerin tümü

$ {! arr [*]} # Dizideki tüm dizinler

$ {# arr [*]} # Dizideki öğe sayısı

$ {# arr [0]} # Sıfır öğesinin uzunluğu

Kullanacağınız dizinlerdeki hesaplamaları yukarıdaki gibi kullandığınızda hesaplamadan çıkıcak sonuçlar size dizin yapısındaki sayıların kaç adet sayı bulunduğu gibi bir çok fonksiyon ile hesaplama yapmanıza olanak tanır.

Linux üzerinde Bash Script Array ağırlıklı olmak üzere çeşitli Script yazım teknikleri ile alakalı temel hususların yer aldığı makalemizi bitirmiş bulunmaktayız.Diğer makalemizde daha detaylı Scriptler üzerinde çalışacağız.Görüşmek üzere…

İlgili Makaleler

4 Yorum

  1. Kodda ikinci for dongusunde index yerine indexz hatası sonucunda cıktınızda
    0
    1
    2
    3
    4
    5
    basılması gerekirken bu hatadan dolayı tüm degerler alt alta 0 olarak basılmış. Gözden kaçan küçük bir hata…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu