İCİNDEKİLER

1 Giriş

1.1 Shell nedir

1.2 Shell Scripts nedir?

1.3 Shell Scripts ler nicin kullanılır ?

2 Tek satırcılar

2.1 Yonlendirme
2.1.1 Dosya Tanımlayıcılar

2.1.2 Basit yonlendirme

2.1.3 Lots of Files!

2.1.4 Cıktıya Bağlanma

2.1.5 Ekler

2.2 Koşullar

2.3 Cevresel değişkenler

2.4 Quotes, Strings, and Expansion

2.4.1 Wildcards

2.4.2 The Tilde

2.4.3 listeler

2.4.4 Değişkenler

2.4.5 Quotes

3 Story Problemleri

3.1 Donguler

3.1.1 For dongusu

3.1.2 While ve until donguleri

3.2 More Variables

3.2.1 Sayılar

3.2.2 Daha iyi string manuplasyonu

3.3 koşullar

4 Gelişmiş komutlar

4.1 On tanımlı değişkenler

4.1.1 sayılar

4.1.2 Dinlenme

4.1.3 Diziler

4.2 On tanımlı fonkisyonlar

4.3 Fonksiyonlar

5 Scriptlerin Otesi

5.1 Readline guzelliği

5.2 Unix aracları

5.3 Ayar dosyaları

6 Ornekler

6.1 Background u değiştirme

6.2 Mesajlarınızı kontrol





















1 Giriş

Bu dokuman kabuk programlamayı tanıtım yazısıdır. Bu eksiksiz veya guvenilir bi kaynak anlamına gelmez ama aynı ifade ile ben ne hakkında konuştuğumun da oldukca farkındayım.. bu dokumandaki tum ornekler aksi belirtilmedikce bash syntax ı kullanır. Eğer burda bir script den bahs edersem bu scripti dokumanın sonundaki ornekler kısmına eklemeye calışacağım.

1.1 Shell nedir?

Pek cok bilgisayarda komut satır arayuzu vardır. Bundan dolayı siz pek cok bilgisyarda komut satırı denen bir pencere acıp bilgisayardan yapmasını istediğiniz şeyi, komut şeklinde yazarbilirsiniz . Actığınız her pencerede sizin yazdıgınız her karakteri okuyup bilgisyarın donanımının anlayacağı gercek komutlara ceviren bir program calışır. Işte bu programa komut cevirici veya shell denir. DOS shell olarak command.com kullanır. Unıx sitemlerde pek cok shell var.



1.2 Shell Scripts= Kabuk Programı nedir?

Shell script shell de calıştırılmak uzere komutlar topluluğu iceren bir text dosyasıdır. Bunu basit bir orneği windows .bat dosyasıdır. Gelişmiş shell ler bir script dosyasının icindeki daha fazla karmaşık veya uygun komut topluluğu nu destekler. Pek cok durumda bu script dosyasının iceriği komut satırına yazılabilir ve sonuc calışan script le aynı olabilir.

Unix sistemlerde pek cok shell ortaya cıktıkdan beri scriptler bu shell lerden herhangi biri ile yazılabilir. Ve her shell farklı syntax ve farklı yeteneklere sahip oldugundan beri her shell scripti doğru davranış gosterebilmesi icin hangi shell de yorumlanacağının tanımlanması gegekmektedir. Bu tanımlam script in ilk satırında yapılır .

Dosyanın ilk satırı şu şekildedir. *Shebang ve shell in tam adresi. (shell genellikle /bin icindedir. ). Stanadart bir ornek şu şekildedir.

#!/bin/bash

*( shebang terimi arkasında unlem olan diyez demek )

Ădet olarak hash işareti C++ deki // a benzer olark acıklama yapmak icin kullanırlır. ( acıklma sonlandırıcı)



1.3 Shell Script ler nicin kullanılır?

Bazıları shell scriptlerine baktıklarında “hey bu başka bir programlama diline benziyor. Kullandığım programlama dili ile aynısı nı yapabilirim “ derler. Ve pek cok şeyi yapabilirle ama ss basit gorevleri kolayca yapmaktadır. Orneğin siz resimlerin bulundugu bir klasore bakıp , onlardan birini rastgele secen ve onu desktop resmi olarak atayan bir program istediniz. Bunu yapması icin bir c porgramı yazmalısınız. Bundan dolayı ceşitli sistem api larını kullanmalısınız, sonra desktop resim ayarları icin Xwindows apilerini oğrenmelisiz . program hatalarını temizlemelisiniz , derlemelisiz ve sonrada bugları arayıp durmalısınız. Veya X ile gelen onceden yapılmış aracları kullanan 5 satırlık ss yazarsınız ( eger fantezi yaparsanız 12 satırlık da olabilir. )

Eğer mesajlarınıza bakmak ve bilgisayardan belli bir kritere gore sınıflandırılmış 5 mesajınızın

kopyasını size email ile gondemesini isterseniz , var logmesajı acan ve yazdığınız algoritma ile kriterler mesajları bulan , onları sayısını alıp memory e kaydeden , sonra tcp portu acıp mail server ınıza bağlanan ve smtp ile mesajlarınızı gonderen ve actığı portu kapayan bir C programı yazmalsınız veya for dongusu grep wc sort kullanan ve sonucları sendmail e yollayan 7 satırlık ss yazarsınız

ozetle ss yazmanın arkasında nokta sadece aynı komutları, defalarca tekrar tekrar yazmadan ve yuzuncu kez calıştırdığınızda yazım hataları icin endişelanmeden tekrar tekrar calıştırabilmek değil fakat tekerleği yeniden keşfetmek yerine unixle gelen pek cok kullnılışlı aracı kullanmak tır.

2 Tek Satircilar

ss ler tek satırda pek cok şaşırtıcı şey yapabilri. hernekadar unix sistemlerde pek cok ss, 1 tane shell tanımlayıcı satır birde komplex komuttan oluşan toplam 2 satır dan da oluşsa siz onların gercekk ss olup olmadıgını tartışabilirsiniz ama onlar herhalukarda bilinmesi guzel şeyler.

2.1 Yonlerdirme

2.1.1 Dosya tanımlayıcılar

Unix program lar calıştırıldıklarında 3 dosya tanımlayıcı acılır. bunlar stdin stdout ve stdserr olarak isimlendirilirler.pek cok komut satırlı program ınputları stdin den okur hataları stderr a yazar ve diğer tum şeyleri stdout a yazar. her dosya dosya tanımlayıcısının bir sayısı vardır. Bunlar Stdin ki 0 , stdout ki 1, stderr ki 2 dir. ( bunların onemini daha sonra goruceğiz. )

2.1.2 Basit Yonlendirme (sort )

Cok kullanışlı unix araclarından biri sort dur. sort ınputları stdin den alır onları sıralar ve sınıflanmış formlar lar şeklinde stdout a yazar. Sıralanacak kelimlerden oluşan bir dosyanız oldugunu soylerseniz shell kullanarak sort ile yapabilrisiniz.

sort < file

bu dosyanın iceriğin sıralanmış şekilde cıktı verir. aynı zaman da siz komutun sonucunu baska bir dosyaya da yonlendirebilirsiniz.

sort < file > file.sorted

yonlendirmenin sırası genellikle cok onemli değildir. Şu şekilde de yapailirsiniz

sort > file.sorted < file

sadece stdout u yonlendirdiğinize dikkat edin bundan dolayı stderr hala terminal de duruyor.

eger siz strerr u da baska dosyaya yonledirmek isterseniz ( numarası 2 idi )

sort < file > file.sorted 2 > file.error

2.1.3 LotsofFiles=dosyaların hepsi ?!

Shell ile dosya okuma veya yazmak dan başka, tanımlayıcının alacağı numarasını belirtmek koşuluyla yeni dosyalarda acabilirsiniz. Meraklıysanız işte ornek:

sort < file > file.sorted 2 >file.error 3> file.3 4 < file2

2.1.4 Sonucların Birleştirilmesi

Sonucları birbirine bağlayabilrisiniz. Orneğin stdout ve stderr u aynı dosyaya yazdırmak istiyorsunuz. :

Sort < file 1 >&2 > file.out

2.1.5 Ekleme

Buna benzer her yonlendirme yaptığınızda file.sorted dosyanızın her seferinde yeni kopyası ile yerdeğiştirdiğini farketmişsinizdir. Eğer bunu istemezseniz basitce > yerine >> kullanın

2.2 Koşullar

komutların / programların calışması bittiğinde shell e return value denen bir sonuc dondururler. bu sonuc komutun duzgun calışıp calışmadıgını bıldirir. genel bir duşunce olarak bir komutun doğru calışması ondan onceki komutun doğru calışmasına bağlıdır. orneğin calışması gereken onemli bir komutunuz olabilir ve siz bu komut calışmazsa size email ile bildirilmesini istiyorsunuz veya komutlardan biri calışmasa da programızınız durmasını istemediğiniz komutlar seriniz olabilir. Bunu yapmanızın yolu return value uzerinden calışan koşullardır.

Koşullar geleneksel boolean operatorleridir. Bazı standart semboller kullanırsınız: || (or), $$ (and), ! (not), ve ; . komutlar kısa devre biciminde yorumlanır. bundan dolayı a && b komutu a false sonuc dondururse b calışmaz fakat a ve b true dondururse b calıştırılır.

bu komut foo.c dosyasını derliyor ve hata yoksa sonuc dosyasını calıştırıyor

gcc foo.c && ./a.out

burda ise foo.c derleniyor ve hata varsa vim ( lınux da editor ) ile duzenleniyor.

gcc foo.c I vim foo.c

siz bu ikiisni birbirine bağlayabilirsiniz. burda hata yoksa calıştıran , hata varsa edit icin vim i acan komut bu.

gcc foo.c && ./a.out | vim foo.c

2.3 Cevresel Değişkenler

İşletim sistemlerinde ki kavramlardan biri de uzun sure once bulunan cevresel değişkenlerdir.

Cevresel değişkenler tum uygulamalar tarafından okunabilen bir degişken yığınına verilen isimdir.

dos prompt’ta veya unix shell’de set yazip enter’a basinca goreceginiz degişkenlerdir.

Cevresel değişkenleri şu şekilde atayabilirsiniz.

Export HISTCONTROL=”ignoredups”

Dikkat etmeniz gereken bazısı:

HISTCONTROL

Bunu ignoredups a atayın ve sonra bana teşekkur edin. ( komut history nizi oluştururken tekrarları onemsemez. Eğer ne hakkında konuştuğumu anlamıyorsanız Readline bolumunu okurken bana teşekkur edersiniz )

PS1&PS2

bu istemciyi ayarlar, kurar. PS1 standart istemcidir , PS2 kapsayıcı ( dongu, tırnak işareti parantes vs ) yı acık bıraktığında bilgi ister .

PS3 de var fakat nadiren kullanılır.

PAGER

text dosyalarını gormek icin varsayılan program . man – ı kullanır. Siz pager ı orneğin man sayfalarını gormek icin more ve less ile man sayfaları arasında geciş yaparak da kullanabilirsiniz.

EDITOR

text dosyaları oluşturmak veya duzenlemk icin varsayılan program . Pek cok mail okuyucu veya oluşturucu bu programı kullanıyor.

PATH

Bir komut yazıldığında onu araştırmak icin sutunlara ayrılmış dizinler listesi . Eğer komut bu dizinlerden birinin icindeyse , calıştırılır. Liste başından sonuna sırayla aranır ve ilk bulunan kullanılır.

2.4 Quotes, Strings, and Expansion

2.4.1 Wildcard , Jokerler

Belli olmayan bir veya daha fazla karakterin yerine gecen karakterler

bir komuta string ifade ettiğinizde gercekten değerlendirilmeden once genellikle bir kac yolla yorumlanır. orneğin siz şu komutu calıştırdığınızda

ls *.txt

dizindeki sonu txt le biten tum dosyalar consol ekranına yazılır. yıldız ilk shell surumlerinde a joker olarak kullanılırdı.

Shell *.txt paternini genişletir ve sizin dizininizde 2 tane txt uzantılı dosya varsa ls komutu ls bar.txt foo.txt olarak algılar.

2.4.2 Tilde ( ~ )

unix’te kullanıcıların home dizinlerine işaret eden kısayol.

web server’larda kullanıcı sayfalarını belirlemek icin de kullanılır. aynı zamnda diğer kullanıcı isimleri ile birlikte belirtilen kullanıcını home dizininin yolunu gostermek icin kullanılır.

ls ~ ostermann/classbin

2.4.3 List

listeleri kullanarak bir string in alabileceği değerleri onceden tanımlayabilirsiniz ve bu kısıtlı wildcard (joker) gibi calışır. Orneğin:

rm foo.

foo.aux, foo.dvi, foo.log, foo.pdf, foo.ps dosyalarını siler.

2.4.4 Değişkenler

Değişkenler de karakter katarlarında yorumlanırlar. Gecerli cevrenin iceriği tum değişkenlerdir. boylece oğrenmek icin , orneğin PATH değişkeniniz ne ?

echo $PATH

echo $

ikisi aynı fakat 2. si komplike scriptdir ama daha guvenli ve karışıktır. Aynı zamanda kendi değişkenlerinizi şoyle tanımlayabilir ve kullanbilisiniz.:

FOO=bar

echo $FOO

2. satır eger siz echo bar yazsanızda shell tarafında yorumlanır. bunun anlamı siz aynı zamanda şoylede yapabilirsiniz:

FOO = ’ls -l’

$FOO /usr/bin

ve siz ls -l /usr/bin yazmışsınız gibi davranır.

2.4.5 Tırnak İşaretleri

eger siz acıklamanın standart yapısını değiştirmek isterseniz tırnak işareti kullanarak stirng in icindeki şeyleri gruplayabilirsiniz.

3 tip tırnak var. cift tırnak tek tırnak ve ters tırnak . Cift tırnak string icindeki leri gruplar boylece sizin boşluk iceren bir argumannınız olabilir. Değişkenler , tilde, wildcards ve diğer tırnak tipleri cift tırnak icin de kullanılabilir.

tek tırnak da cift tırnak gibi string iceriğini gruplayabilir ama tek tırnak icinde başka bir şey yorumlanmaz.

Ters tırnak iceriği sanki başka bir komutmuş gibi değerlendirir.

kafanız karıştı değil mi ?

tabloyu inceleyin.



Cift tırnak
Tek tırnak
Ters tınak

echo foo > file.txt

echo bar >> file.txt

THEFILE=file.txt

echo “wc –l $THEFILE”
echo foo > file.txt

echo bar >> file.txt

THEFILE=file.txt

echo ’wc –l $THEFILE’
echo foo > file.txt

echo bar >> file.txt

THEFILE=file.txt

echo ‘wc –l $THEFILE‘

Sonuc:



wc –l file.txt
wc –l $THEFILE
2


3 Story Problemleri

boylece siz tırnakları değişkenleri wildcardları , yonlendirmeyi anladınız ve dunya ya hakimsiniz . o halde siz bir dizindeki tum dosyaların uzantısını .html yapmak istiyorsunuz

3.1 Donguler

Shell bir kac ceşit donguyu destekler. Şimdi bunlardan for while ve until i inceleyelim .

3.1.1 For-Loops

2 tip for dongusu var. c- stil ve list stil. c-stil donguyu ornekle acıklamak kolaydır.

for (( I = 1; $I