Sie sind auf Seite 1von 20

Bash kullanarak pratik programlama

Linux zerinde kullancnn iletim sistemini kullanmas iin temel iki yol vardr. Bunlardan biri GUI olarak adlandrdmz ra!ik arabirimler dieri de konsol"s#ell olarak adlandrabileceimiz komut satr y$netimidir. %abuk &ro ramlamada aslnda konsoldan verilen komutlar belirli bir dzene uyarak altrmaktan ibarettir. 'ani konsoldan altrdmz komutlar bir dosyaya sras ile yazarak en basitinden bir s#ell scri&t yazm oluruz. (abiki belirli amalara y$nelmi &ro ramlar iin !onksiyon) dizi ) d$n ler ibi da#a st dzey ya&lar kullanmamz erekebilir ki *bas#+ bunlar !azlasyla salamaktadr.

%od yazmaya balamadan bir ek da#a ya&alm. 'az boyunca kodladmz $rnekleri sizlerde #er#an i bir Linux altnda yaz& altrabilirsiniz. ,dit$r olarak %-, altnda %edit) Gnome altnda Gedit kullanmanz tavsiye ederim. , er #er iimi konsoldan ya&mak istiyorum derseniz &ico) nano ya da .i ibi konsol tabanl edit$rleri de kullanmay deneyebilirsiniz. ,er elinizin altnda #ali#azrda bir Linux"U/I0 yoksa ve kuracak durumda da deilseniz internet zerinden cretsiz olarak 1#ell #esab salayan !irmalardan bir #esa& edinerek $rnek kodlar deneyebilirsiniz. #tt&2""333.ducta&e.net"4mit5a"!reeunix.s#tml adresi eitli Linux ve U/I0 sistemler zerinde cretsiz olarak s#ell #esabna sa#i& olmak isteyenler iin iyi bir balan noktas. Buradan bir #esa& edindikten sonra 6utty 117 &ro ram ile sunucunuza balanarak $rnek kodlar altrabilirsiniz.

La! !azla uzatmadan &ro ramlama dnyasnn o me#ur ilk &ro ram ile kodlamaya balayalm.. ,vet) *7ello 8orld9 * " *:er#aba dnya9+ &ro ramndan ba#sediyorum.

;9"bin"bas# ec#o *:er#aba -unya9< B$ylece ilk s#ell scri&t=betik>imizi yazm olduk. 'ukardaki basit &ro ramda dikkatimizi eken bir satr var #!/bin/bash) bu satr sonraki alt satrlarn #an i kabuk tara!ndan yorumlanacan bildiren standart bir tanmdr ve #er bas# scri&tinde olmaldr. ,er bas# &ro ram "bin"bas# deilde !arkl bir yerde ise scri&tlerin bana o deer yazlmaldr. Linux altnda bir &ro ramn #an i dizin altnda olduunu 3#ic# komutu ile bulabiliriz. ? 3#ic# bas#

"bin"bas# 1cri&timizi kaydettikten sonra altrma #akk verelim. Bunun iin Linux dnyasnda c#mod komutu kullanlr. 1cri&timizi #ello.s# ad ile kaydettiimizi varsayarsak aadaki komut ile scri&timize altrma #akk vermi oluruz.

$ chmod 700 hello.sh $./hello.sh Merhaba Dunya!

evresel Deikenler
7er iletim sistemi eitli amalarla kullanlmak zere evresel deikenlere sa#i&tir. Linux ibi sistem y$netiminin ounlukla komut satrndan ya&ld sistemlerde bu deikenlerin $nemi bir kat da#a !azladr. Linux altnda sk kullanlan evresel deikenler ve manalar2

7@:, U1,B 61C 17,LL

A @ anki kullancnn ev dizinini $sterir A @ anki kullancnn kim olduunu $sterir A %ullancnn komut satrndaki iaret= #uzey!eD linux ? ibi> A %ullancnn komut yrtt kabuk ismi

Eevresel deikenleri ayn normal deikenler ibi kullanabiliriz. #echo $HOM /root $echo $!H "" /bin/bash

evresel Deiken tan#mlama


Eevresel deikenler iletim sistemi kurulumu ile birlikte #azr elecei ibi kendimizde tanmlayabiliriz ve devaml kullanm iin kaydedebiliriz. :esela 'F1F%GB@LG, diye bir evresel deiken tanmlay& bunu tm &ro ramlar iin eerli klmak istersek aadaki komut iimizi $recektir. ?ex&ort 'F1F%GB@LG,A+"#ome"#uzey!e"tools"security+ Bu ya&tmz tanmlamalar sistemin bir sonraki alnda kaybolacaktr) kalc #ale etirmek iin "etc"bas#rc ya da kendi ev dizinimizdeki .bas#rc dosyasna yazmalyz.

Deikenler
6ro ramlama dillerinin vaz eilmez $elerinden biri deikenlerdir. Bas# ile birlikte deiken tanm ve kullanm olduka kolaydr. -ier dillerden !arkl olarak tanmladmz deikenin ti&inin belirtilmesine erek yoktur) deikenin kullanld yere $re ti&i belirlenir. ? adimA H7uzey!e @/FLI ?ec#o ?adim Huzeyfe ONAL Fyn deikeni $adim=Huzeyfe ONAL seklinde de ya&abilirdik. -eiken kullanrken i!t trnak =* +> ya da tek trnak=H I> kullanmann !ark 2 * + arasnda kullanacamz baz $zel karekterler BF17 tara!ndan !arkl komutmu ibi ilem $recektir . :esela bas# iin 9 karekterinin $zel bir anlam vardr ve biz bu karekteri * * arasnda kullanrsak ekrana 9 karekteri baslmazda 9 karekterinin bas# iin i!ade ettii deer baslr. Bu ti& #atalardan kanmak iin yeri eldiinde tek trnak =H H> kullanlr. Ei!t trnan aksine tek trnak arasnda ald tm karekterleri olduu ibi yanstr.

$omut %#kt#s#n# &eikene atama


Linux altnda #er#an i bir komutun kts sonradan kullanmak amacyla deikene atlabilir.

Ealtrlan komutu => arasna alarak ve bana ? iareti koyarak deikene atama ya&ar ve istediimiz yerde kullanabiliriz) nasl mJ KrnekL

MYFILES=$(ls /etc | grep ab)

$ echo $MYFILES crontab entropychatdisable fstab inittab mtab quotatab updfstab

Mlk satrda "etc dizini listelenerek ierisinde ab kelimesi=birleik ab karekterleri> een tm dosyalar :'NIL,1 deikenine atanyor. 1onraki satrda ise bu deikenin ierii ekrana baslyor. Mlk satrdaki *' * karekteri Linux dnyasnda &i&e olarak eer ve bir komutun ktsn bir sonraki komuta irdi olarak aktarmaya yarar) yani ls "etc"nin kts re& komutuna &arametre olarak aktarlm

()el Deikenler*
Bas# ile &ro ramlama ya&arken kullanabileceimiz baz $zel deikenler vardr. Bunlar kullanmak iin tanmlamamz erekmez. :esela bu deikenlerden ?O alan &ro ramn adn verirken ?C ilk &arametreyi ) ?P P. &arametreyi ve ?; deikeni de to&lam &arametre saysn $sterir. ;9"bin"bas# ec#o *&ro ram ismiA ?O+ ec#o *ilk &arametreA ?C* ec#o *ikinci &arametreA?Pn+ ec#o *(o&lam &arametre sayisiA?; * $ */test*sh parametre+, parametre+program ismi=test.sh ilk parametre= parametre ! ikin"i parametre= parametre # $oplam parametre sayisi=%

$ullan#c# ile iletiim


'azacamz scri&tlerde bazen kullanc ile iletiim erekir) bu durumda read komutunu kullanarak kullancdan bil i alr ve bu bil iyi bir deikene atayarak kullanabiliriz. Basit bir etkileim scri&tiL

#!/bin/sh echo n "Adinizi Gi iniz! " e"d n"me echo "Me h"b" $n"me !"

1cri&timize ad.s# olarak adlandr& altralm $chmo& .// a&*sh $*/a&*sh Adinizi &iriniz' Huzeyfe ONAL (erhaba Huzeyfe ONAL ) Bead komutuna Qt &arametresi vererek kullancnn belirli bir sre iinde iri ya&masn salayabiliriz. ,er belirlene srede kullanc #er#an i bir ey irmezse bir sonraki adm ileme sokulur yani kullanc #akkn kaybetmi olur. Benzer ekilde kullancnn irdii verileri ekrana yazmak istemezsek Qmesela &arola ibiR read komutunu Qs &arametresi ile denemeliyiz.

(rnekL ;9"bin"bas# ec#o Rn <S saniye icinde iris ya&malisiniz9 T < i! read Rt S res&onseL t#en ec#o <Basarilar) S saniyeyi ecirmediniz< else ec#o <Biraz da#a #izli yazmalisiniz9< !i ec#o Rn <%ullanici Fdiniz2<

read Rt U user ec#o Rn <6arolaniz read Rs &arola ec#o <?user kullanicisi ve ?&arola si!resi ile sisteme iris ya&tiniz9< $*/a*sh % saniye i"inde giris yapmalisiniz) * aa!!%% +asarilar, % saniyeyi ge"irmediniz -ullani"i Adiniz'Huzeyfe .arolaniz ' Huzeyfe kullani"isi /e Deneme12% sifresi ile sisteme giris yaptiniz) 2<

0ritmetik ilemler
(emel U ilemi kullanarak bas# altnda ileri dzey matematik ilemleri ya&abiliriz. Bas# altnda aritmetik ilemler iin ?==>> ya&s kullanlr. KrneklerL
$ echo $## $00 / % && 33

$ m'(" )"*+" $ echo $## $m'(" 68 , $- &&

;9"bin"bas# xAV yAU zA?==?x W ?y>> ec#o < ?x W ?y to&lamiA ?z<

1ek mi2 i3t mi !cripti


Fadaki scri&t kullancdan say irmesini bekler ve irilen saynn tek mi) i!t mi olduunu bulur. Bu basit $rnekleri elitirmek mmkndr ;9"bin"bas# numberAO ec#o Rn <Bir sayi irini T < read number ec#o <Girdi iniz 1ayi ?number< i! X ?==number Y P>> ReZ O [L t#en ec#o <Girdi iniz sayi ci!ttir< else ec#o <Girdi iniz sayi tektir.< !i scri&ti sayi.s# olarak kaydedi& altralm.

$ */sa4i*sh +ir sayi girini * 0 &irdiginiz 1ayi 0 &irdiginiz sayi tektir. $*/sa4i*sh +ir sayi girini * #2223 &irdiginiz 1ayi #2223 &irdiginiz sayi "ifttir

56 $oul De4imi

7emen #er &ro ramlama dilinde kendine yer bulan IN ya&s bas# &ro ramlamada da karmza kyor. Basitce bir arta bal olarak &ro ram iletmeye yarayan IN ya&s scri&tlerimizi da#a kontroll yazmamza olanak salyor. Bas# scri&tlerindeki temel i! ya&s aaddaki ibidirL
i ! "art #

then pr$gra%&g$'(esi i

da#a elimi bir i! ya&s ise i!) eli! ve elseIden oluur.

! )$"ul #

then )$%utlar eli then )$%utlar&* + + ! )$"ul* #

eli then ++ else

! )$"ul, #

)$%utlar&i

Bu ya& ile biraz da#a elimi koullu ya&lar kullanabiliriz. Mlk uyan eli! koulundan sonra &ro ram i! ya&sn terkeder. ,er i! ya da eli! artlarndan birine uymazsa sra elseIye elir ve burada verilen komut uy ulanr.

KrnekL
i ! .$sayi. /e0 , #

then ech$ .sayi ,1e esittir ,. i

! .$sbt. = .,. #

then ech$ .sbt (egeri ,1(ur. i

ilk $rnekde aritmetik bir karlatrma ya&lrken ikinci $rnekte strin karlatrmas ya&lyor. 1trin karlatrma ilemlerinde deiken ve karlatrma ya&lan tara! mutlaka * + arasnda verilmelidir) aksi takdirde #ata alabilirsiniz.

7likisel Operat8rler
Bir $nceki aritmetik i! $rneinde QeZ i!adesi kullandk) &eki ne ie yarar bu QeZ ve benzeri i!adelerJ Bu i!adeler bas# &ro ramlamada kullanlan $zel karlatrma o&erat$rleridir ve #er birinin anlam vardr. =In ilizce>. Fritmetik karlatrmalar iin kullanlan bu o&erat$rlerden bazlar ve anlamlarL
.e/ .l0 E"ittir )232)t2r

.10 .1e .le

b2y2)t2r b2y2) e"ittir )232) e"ittir

2os'" 3li45ili 67e "08 le

.9 9ile . 9ile

D$sya sira(an bir ($sya %i D$sya 'ar 'e $)unabilir (uru%(a %i D$sya 'ar 'e ya45labilir (uru%(a %i D$sya 'ar 'e 3al5"t5r5labilir (uru%(a %i 6e(e 6e(e ($sya bir (i4in %i ($syan5n b$yutu s5 5r(an b2y2) %2

.: 9ile .; 9ile .d 9ile .s 9ile

." .o

<E i"le%i i3in )ullan5l5r+ <EYA i"le%i i3in )ullan5l5r

i9 = .n "$s0 $" ." .n "$s0 -" > 0hen echo ? $s0 $ (e $s0 - bo40@ ? 9i

(rnek9 \
i ! $'ar = .Yes. # then ech$ .Deger = Yes. eli ! $'ar = .7$. #

then ech$ .Deger= 7$. else

ech$ .8ecersi4 Deger++. i

:ase ;ap#s#
]ase ya&s i!Rt#enRelse ya&snn biraz elimi versiyonudur. Bir deikene ait oklu seim vardr ve bu seimlerden #er biri !arkl bir deeri temsil etmektedir. 7an i deiken arta uyduysa o deikenin temsil ettii komut yrtlr. ,er #er#an i bir koula uymazsa ^> ile balayan satrdaki komut devreye irer. ]ase temel ya&sL case se4enek in durumC> komutlar LL durumP> komutlar LL durumS> komutlar LL ^> komutGx esac

1akvim (rnei9 Fadaki scri&t aylar ve isimleri eletirmitir. Bu scri&ti elitiri& kullancdan ayI say olarak irmesini isteyi& karln yazdrabiliriz.

9!/bin/sh

: : case $; in <; | ;) ech$ .M$nth is =anuary.>> <* | *) ech$ .M$nth is February.>>

<, | ,) ech$ .M$nth is March.>> <? | ?) ech$ .M$nth is @pril.>> <A | A) ech$ .M$nth is May.>> <B | B) ech$ .M$nth is =une.>> <C | C) ech$ .M$nth is =uly.>> <D | D) ech$ .M$nth is @ugust.>> <E | E) ech$ .M$nth is Septe%ber.>> ;<) ech$ .M$nth is Fct$ber.>> ;;) ech$ .M$nth is 7$'e%ber.>> ;*) ech$ .M$nth is Dece%ber.>> G) ech$ .8ecersi4 Hara%etre!!.>> esac

<O1= Her sat#r#n sonuna 99 ekleme)sek program u4&uu case koulunu &eil t>m koullar# ekrana basacakt#r

1ay bulmaca 1cri&tiL ;9"bin"bas# ec#o Rn <C ile S arasinda bir sayi iriniz T < read c#aracter case ?c#aracter in C > ec#o <Bir irdiniz.< LL P > ec#o <Iki irdiniz..< LL S > ec#o <Uc irdiniz.< LL ^ > ec#o <bir ile uc arasinda bir de er irmediniz9< ,sac

Fyn scri&ti i! ya&s kullanarak yazmak isteseydik aadaki ibi olacakt. 7er iki scri&ti incelersek i! ile case arasnda !ark da#a iyi anlam oluruz
9!/bin/bash

ech$ /n . ile , arasin(a bir sayi girini4 I . rea( character i ! .$character. = .;. #> then ech$ .Jir 8ir(ini4+. else i ! .$character. = .*. #> then ech$ .I)i gir(ini4++. else i ! .$character. = .,. #> then ech$ .Kc gir(ini4+++. else ech$ .Yanlis (eger gir(ini4+.

i i i

6or2 ?hile D8ng>leri


Bir ii belirli sayda ya da belirli koula kadar ya&mak iin kullanlan !orR3#ile d$n leri &ro ramlama dillerinin vaz eilmez kalasik $elerinden biridir. 7i unutmuyorum ilk &ro ramlama dersi aldmz zamanlarda #enuz !or ya&sn $renmemitik ve #oca ekrana CIden COOIe kadar saylarn ktsn yazdrmamz istemiti. (abii #aliyle d$n nedir bilmediimiz iin biraz dn& 2 * ne var bunda ) alt atla yazariz demitik+..Bir mddet sonra #ocamz bizim &ro rammz incelemeye eldiinde kendisini lmekten alamamt ve *'a bine kadar yazn desem ne ya&acaksnz ocuklar demiti+ . 1onraki ders d$n ler idi ve biz can kula ile dersi dinliyorduk.

(emel Nor ya&sL 6or degisken in Do -omutlar.. &one KrnekL


9!/bin/bash $r aylar ($ ech$ $aylar ($ne in Fca) Subat Mart nisan Mayis 6a4iran te%%u4 @gust$s

scri&t altrldnda sras ile @cak subat ... okuyarak ekrana basacaktr.

Bir dier $rnekle konuyu &ekitirelim2 "etc" dizininde r ile balayan tm dosyalar listelenerelk aralarnda *dizin+ $zellii tayanlar ekrana dizin ad =dir>) dizin $zellii tamayanlar ise dosyaGadi =!ile > ekilde yazdrlacaktr.

9!/bin/bash

$r %y ile in /etc/rG ($ i ! /( .$%y ile. #

then ech$ .$%y ile ((ir). else ech$ .$%y ile ( ile)L

i ($ne

!istem&eki kullan#c#lar# "isteleme !cripti "etc"&ass3d dosyasnda bulunan kullanclar listelemek iin aadaki scri&ti kullanabiliriz. 1cri&t ierisinde kullanlan a3k bas# ibi bir scri&t dilidir ve scri&t ierisindeki $revi "etc"&ass3d dosyasndaki satrlar 2 karekterine $re ayrtr& ilk kolonu semektir. ;9"bin"bas# 6F118-GNIL,A"etc"&ass3d aAC !or name in ?=a3k RN2 _`&rint ?Ca_ b <?6F118-GNIL,< > do ec#o <U1,B ?a A ?name< let <a WA C< done exit O

$chmo& .// user*sh $*/user*sh 5167 8! = root 5167 8# = daemon 5167 8% = operator 5167 82 = bin 5167 89 = smmsp 5167 8: = popa%d 5167 8; = sshd 5167 8< = portmap 5167 80 = identd

@hile 2 until $ullan#m#


*%oul tuttuu srece ve koul erekleene kadar ilem ya& * mant ile alan 3#ile ve Until ya&s bas# altnda kullanabileceimiz d$n eitlerindendir.

(emel 8#ile ya&sL


Mhile ! koul # ($ ilemler ($ne

;9"bin"bas#
%y'ar=< Mhile ! $%y'ar /ne ;< # ($ ech$ $%y'ar %y'ar=$(( $%y'ar N ; )) ($ne

myvar deikeninin OIa eitle ve karlatrmaya bala) deiken CO olmad mddete ekrana deikenin deerini yaz ve deerini bir artr. until 3#ileIin tam tersi denilebilir. Fadaki $rnekte dekenimiz CO olana dek ekrana yaz diyoruz. ;9"bin"bas#
%y'ar=< until ! $%y'ar /e0 ;< # ($

ech$ $%y'ar %y'ar=$(( $%y'ar N ; )) ($ne

6onksi4onlarla ilemler 6ro rammz iinde sk kullanacamz baz ya&lar bir dzen altnda tanmlayarak devaml kullanabiliriz. :esela &ro rammz ierisinde kullancdan veri alacak bir b$lm olsun ve biz bu b$lm birden !azla yerde kullanmak isteyelim) normalde #er kullanacamz yerde idi& ayn eyleri yazmamz erekecekti. @ysa bu blou !onksiyon olarak tanmlarsak kullanmamz ereken yerde sadece !onksiyonu adyla armamz yeterlidir. 1emel 6onksi4on ;ap#s#9 Bas# &ro ramlamada iki eit !onksiyon tanm ya&labilir. 3unction fonksiyon_Adi `
komutlar

a ya da
fonksiyon_adi komutlar

=> `

a KrnekL ;9"bin"bas# ; ekrana #ello yazmak iin kullanlan !onksiyon #ello=> ` ec#o <1u an #ello=> !onksiyonunu ca irdiniz..< a ec#o <#ello=> !onksiyonu ca riliyor..< #ello ;-i er tanimlama yontemi !unction #ello=> ` ec#o <#ello=> !onksiyonunu ca irdiniz..< a

<O1=6onksi4onlar kullan#lma&an 8nce tan#mlanmal#&#r*

Nonksiyon tanmlarken dikkat edeceimiz bir #usus. /ormal dillerde !onksiyon iinde tanmlanan deiken sadece o !onksiyon ierisinde eeli olurdu. 7albuki bas#Ide !onksiyon iinde tanmlanan deiken tm &ro ram boyunca akti! olur. Bunu en ellemek yani !onksiyon iinde tanmlanan deikenin $mrn !onksiyon ile snrlamak istersek local deiken tanm kullanrz. "ocal de iskenA+bu de isken yereldir+ ibi

;9"bin"bas# -e iskenACOO Nunction #esa&lama ` Local de iskenAcO ,c#o Rn * Bir sayi iriniz2+ Bead sayi ,c#o *sayiWde iskenA?== ?sayi W ?de isken >>+ a #esa&lama 1cri&ti altrlrsa ekrana *1ayiWde iskenAcOW irdiinizGdeer+ yazacaktr.

6onksi4on 2 until kar##m# bir 8rnek9


9!/bin/bash

uncti$n press&enter O ech$ .. ech$ /n .Hress Enter t$ c$ntinue. rea( clear P

selecti$n= until ! .$selecti$n. = .<. #> ($ ech$ .. ech$ .HQF8Q@M ME7K. ech$ .; R J$s Dis) alanini 8$runtule ech$ .* R J$s belle) alanini 8$runtule ech$ .. ech$ .< R Hr$gra%(an ci)is ech$ .. ech$ /n SSeci%ini4i 8irini4TL rea( selecti$n ech$ .. case $selecti$n in ; ) ( * ) > press&enter >> ree > press&enter >>

< ) e-it >> G ) ech$ .Lut en ;U *U ya ( a< (egerini girini4L> press&enter esac ($ne

Di)iler -iziler benzer $zellikteki deikenleri ru&lamaya yarar. :esela yln aylarn bir diziye atayarak bu diziye ay adn verirsek elimizde CP elemanl bir dizi olur. FylarA=@cak 1ubat :art nisan :ayis 7aziran (emmuz F ustos ,ylul ,kim %asim Fralik > CP elemanl bir dizi. -izilerin indisi OIdan balar yani aylar dizisine bakacak olursak dizinin ilk eleman aylarXO[ Hdr.

array=( 4er$ $ne tM$ three ech$ $Oarray!<#P ech$ $O9array!G#P 9 9 9

$ur si ir B

i'e )

(i4i(e )ac ele%an $l(ugu

Das könnte Ihnen auch gefallen