Download as pdf or txt
Download as pdf or txt
You are on page 1of 20

Bash kullanarak pratik programlama

Linux zerinde kullancnn iletim sistemini kullanmas iin temel iki yol vardr. Bunlardan biri
GUI olarak adlandrdmz grafik arabirimler dieri de konsol/shell olarak adlandrabileceimiz
komut satr ynetimidir.
Kabuk programlamada aslnda konsoldan verilen komutlar belirli bir dzene uyarak altrmaktan
ibarettir. Yani konsoldan altrdmz komutlar bir dosyaya sras ile yazarak en basitinden bir
shell script yazm oluruz. Tabiki belirli amalara ynelmi programlar iin fonksiyon, dizi ,
dngler gibi daha st dzey yaplar kullanmamz gerekebilir ki bash bunlar fazlasyla
salamaktadr.

Kod yazmaya balamadan bir ek daha yapalm. Yaz boyunca kodladmz rnekleri sizlerde
herhangi bir Linux altnda yazp altrabilirsiniz. Editr olarak KDE altnda Kedit, Gnome altnda
Gedit kullanmanz tavsiye ederim. Eger her iimi konsoldan yapmak istiyorum derseniz pico, nano
ya da Vi gibi konsol tabanl editrleri de kullanmay deneyebilirsiniz.
Eer elinizin altnda halihazrda bir Linux/UNIX yoksa ve kuracak durumda da deilseniz internet
zerinden cretsiz olarak Shell hesab salayan firmalardan bir hesap edinerek rnek kodlar
deneyebilirsiniz. http://www.ductape.net/~mitja/freeunix.shtml adresi eitli Linux ve UNIX
sistemler zerinde cretsiz olarak shell hesabna sahip olmak isteyenler iin iyi bir balang
noktas. Buradan bir hesap edindikten sonra Putty SSH program ile sunucunuza balanarak rnek
kodlar altrabilirsiniz.

Laf fazla uzatmadan programlama dnyasnn o mehur ilk program ile kodlamaya balayalm..
Evet, Hello World! / Merhaba dnya! programndan bahsediyorum.

#!/bin/bash
echo Merhaba Dunya!"
Bylece ilk shell script(betik)imizi yazm olduk. Yukardaki basit programda dikkatimizi eken bir
satr var #!/bin/bash, bu satr sonraki alt satrlarn hangi kabuk tarafndan yorumlanacan bildiren
standart bir tanmdr ve her bash scriptinde olmaldr. Eer bash program /bin/bash deilde farkl
bir yerde ise scriptlerin bana o deer yazlmaldr. Linux altnda bir programn hangi dizin altnda
olduunu which komutu ile bulabiliriz.
$ which bash

/bin/bash
Scriptimizi kaydettikten sonra altrma hakk verelim. Bunun iin Linux dnyasnda chmod
komutu kullanlr. Scriptimizi hello.sh ad ile kaydettiimizi varsayarsak aadaki komut ile
scriptimize altrma hakk vermi oluruz.

$ chmod 700 hello.sh


$./hello.sh
Merhaba Dunya!

evresel Deikenler
Her iletim sistemi eitli amalarla kullanlmak zere evresel deikenlere sahiptir. Linux gibi
sistem ynetiminin ounlukla komut satrndan yapld sistemlerde bu deikenlerin nemi bir
kat daha fazladr.
Linux altnda sk kullanlan evresel deikenler ve manalar:

HOME

= O anki kullancnn ev dizinini gsterir

USER

= O anki kullancnn kim olduunu gsterir

PS1

= Kullancnn komut satrndaki iaret( huzeyfe@ linux $ gibi)

SHELL

= Kullancnn komut yrtt kabuk ismi

evresel deikenleri ayn normal deikenler gibi kullanabiliriz.


#echo $HOME
/root
$echo $SHELL
/bin/bash

evresel Deiken tanmlama


evresel deikenler iletim sistemi kurulumu ile birlikte hazr gelecei gibi kendimizde
tanmlayabiliriz ve devaml kullanm iin kaydedebiliriz.
Mesela YASAK_BOLGE diye bir evresel deiken tanmlayp bunu tm programlar iin geerli
klmak istersek aadaki komut iimizi grecektir.
$export YASAK_BOLGE=/home/huzeyfe/tools/security
Bu yaptmz tanmlamalar sistemin bir sonraki alnda kaybolacaktr, kalc hale getirmek iin
/etc/bashrc ya da kendi ev dizinimizdeki .bashrc dosyasna yazmalyz.

Deikenler
Programlama dillerinin vazgeilmez elerinden biri deikenlerdir. Bash ile birlikte deiken
tanm ve kullanm olduka kolaydr. Dier dillerden farkl olarak tanmladmz deikenin
tipinin belirtilmesine gerek yoktur, deikenin kullanld yere gre tipi belirlenir.
$ adim= Huzeyfe ONAL
$echo $adim
Huzeyfe ONAL
Ayn deikeni $adim=Huzeyfe ONAL seklinde de yapabilirdik. Deiken kullanrken ift
trnak ( ) ya da tek trnak( ) kullanmann fark : arasnda kullanacamz baz zel
karekterler BASH tarafndan farkl komutmu gibi ilem grecektir . Mesela bash iin ! karekterinin
zel bir anlam vardr ve biz bu karekteri arasnda kullanrsak ekrana ! karekteri baslmazda !
karekterinin bash iin ifade ettii deer baslr. Bu tip hatalardan kanmak iin yeri geldiinde tek
trnak ( ) kullanlr. ift trnan aksine tek trnak arasnda ald tm karekterleri olduu gibi
yanstr.

Komut ktsn deikene atama


Linux altnda herhangi bir komutun kts sonradan kullanmak amacyla deikene atlabilir.

altrlan komutu () arasna alarak ve bana $ iareti koyarak deikene atama yapar ve
istediimiz yerde kullanabiliriz, nasl m?
rnek;

MYFILES=$(ls /etc | grep ab)

$ echo $MYFILES
crontab entropychatdisable fstab inittab mtab quotatab updfstab

lk satrda /etc dizini listelenerek ierisinde ab kelimesi(birleik ab karekterleri) geen tm dosyalar


MYFILES deikenine atanyor. Sonraki satrda ise bu deikenin ierii ekrana baslyor. lk
satrdaki | karekteri Linux dnyasnda pipe olarak geer ve bir komutun ktsn bir sonraki
komuta girdi olarak aktarmaya yarar, yani ls /etc/nin kts grep komutuna parametre olarak
aktarlm

zel Deikenler.
Bash ile programlama yaparken kullanabileceimiz baz zel deikenler vardr. Bunlar kullanmak
iin tanmlamamz gerekmez. Mesela bu deikenlerden $0 alan programn adn verirken $1 ilk
parametreyi , $2 2. parametreyi ve $# deikeni de toplam parametre saysn gsterir.
#!/bin/bash
echo program ismi= $0
echo ilk parametre= $1
echo ikinci parametre=$2n
echo Toplam parametre sayisi=$#
$ ./test.sh parametre_1 parametre_2
program ismi=test.sh
ilk parametre= parametre_1
ikinci parametre= parametre_2
Toplam parametre sayisi=3

Kullanc ile iletiim


Yazacamz scriptlerde bazen kullanc ile iletiim gerekir, bu durumda read komutunu kullanarak
kullancdan bilgi alr ve bu bilgiyi bir deikene atayarak kullanabiliriz.
Basit bir etkileim scripti;

#!/bin/sh
echo n "Adinizi Giriniz: "
read name
echo "Merhaba $name !"

Scriptimize ad.sh olarak adlandrp altralm


$chmod 700 ad.sh
$./ad.sh
Adinizi Giriniz: Huzeyfe ONAL
Merhaba Huzeyfe ONAL !
Read komutuna t parametresi vererek kullancnn belirli bir sre iinde giri yapmasn
salayabiliriz. Eer belirlene srede kullanc herhangi bir ey girmezse bir sonraki adm ileme
sokulur yani kullanc hakkn kaybetmi olur. Benzer ekilde kullancnn girdii verileri ekrana
yazmak istemezsek mesela parola gibi- read komutunu s parametresi ile denemeliyiz.

rnek;
#!/bin/bash
echo -n "3 saniye icinde giris yapmalisiniz! > "
if read -t 3 response; then
echo "Basarilar, 3 saniyeyi gecirmediniz"
else
echo "Biraz daha hizli yazmalisiniz!"
fi
echo -n "Kullanici Adiniz:"

read -t 4 user
echo -n "Parolaniz

:"

read -s parola
echo "$user kullanicisi ve $parola sifresi ile sisteme giris yaptiniz!"
$./a.sh
3 saniye icinde giris yapmalisiniz! > aa1133
Basarilar, 3 saniyeyi gecirmediniz
Kullanici Adiniz:Huzeyfe
Parolaniz

Huzeyfe kullanicisi ve Deneme123 sifresi ile sisteme giris yaptiniz!

Aritmetik ilemler
Temel 4 ilemi kullanarak bash altnda ileri dzey matematik ilemleri yapabiliriz. Bash altnda
aritmetik ilemler iin $(()) yaps kullanlr.
rnekler;
$ echo $(( 100 / 3 ))
33

$ myvar="56"
$ echo $(( $myvar + 12 ))
68

#!/bin/bash
x=8
y=4
z=$(($x + $y))
echo " $x + $y toplami= $z"

Tek mi, ift mi Scripti


Aadaki script kullancdan say girmesini bekler ve girilen saynn tek mi, ift mi olduunu bulur.
Bu basit rnekleri gelitirmek mmkndr
#!/bin/bash
number=0
echo -n "Bir sayi girini > "
read number
echo "Girdiginiz Sayi $number"
if [ $((number % 2)) -eq 0 ]; then
echo "Girdiginiz sayi cifttir"
else
echo "Girdiginiz sayi tektir."
fi
scripti sayi.sh olarak kaydedip altralm.

$ ./sayi.sh
Bir sayi girini > 9
Girdiginiz Sayi 9
Girdiginiz sayi tektir.
$./sayi.sh
Bir sayi girini > 24440
Girdiginiz Sayi 24440
Girdiginiz sayi cifttir

IF Koul Deyimi

Hemen her programlama dilinde kendine yer bulan IF yaps bash programlamada da karmza
kyor. Basitce bir arta bal olarak program iletmeye yarayan IF yaps scriptlerimizi daha
kontroll yazmamza olanak salyor.
Bash scriptlerindeki temel if yaps aaddaki gibidir;
if [ art ]
then
program_govdesi
fi

daha gelimi bir if yaps ise if, elif ve elseden oluur.

if [ koul ]
then
komutlar
elif [ koul2 ]
then
komutlar_2
.
.

elif [ koul3 ]
then
..
else
komutlar_x
fi

Bu yap ile biraz daha gelimi koullu yaplar kullanabiliriz. lk uyan elif koulundan sonra
program if yapsn terkeder. Eer if ya da elif artlarndan birine uymazsa sra elseye gelir ve
burada verilen komut uygulanr.

rnek;
if [ "$sayi" -eq 3 ]
then
echo "sayi 3e esittir 3"
fi

if [ "$sbt" = "3" ]
then
echo "sbt degeri 3dur"
fi

ilk rnekde aritmetik bir karlatrma yaplrken ikinci rnekte string karlatrmas yaplyor.
String karlatrma ilemlerinde deiken ve karlatrma yaplan taraf mutlaka arasnda
verilmelidir, aksi takdirde hata alabilirsiniz.

likisel Operatrler
Bir nceki aritmetik if rneinde eq ifadesi kullandk, peki ne ie yarar bu eq ve benzeri
ifadeler? Bu ifadeler bash programlamada kullanlan zel karlatrma operatrleridir ve her birinin
anlam vardr. (Ingilizce).
Aritmetik karlatrmalar iin kullanlan bu operatrlerden bazlar ve anlamlar;
-eq

Eittir

-lt

kktr

-gt

byktr

-ge

byk eittir

-le

kk eittir

Dosya likili Operatrler

-f file

Dosya siradan bir dosya mi

-r file

Dosya var ve okunabilir durumda mi

-w file

Dosya var ve yazlabilir durumda mi

-x file

Dosya var ve altrlabilir durumda mi

-d file

Hedef dosya bir dizin mi

-s file

Hedef dosyann boyutu sfrdan byk m

-a

VE ilemi iin kullanlr.

-o

VEYA ilemi iin kullanlr

if [ -n "$str1" -a -n "$str2" ]
then
echo ' $str1 ve $str2 botur'
fi

rnek;

if [ $var = "Yes" ]
then
echo "Deger = Yes"
elif [ $var = "No" ]
then
echo "Deger= No"
else

echo "Gecersiz Deger.."


fi

Case Yaps
Case yaps if-then-else yapsnn biraz gelimi versiyonudur. Bir deikene ait oklu seim vardr
ve bu seimlerden her biri farkl bir deeri temsil etmektedir. Hangi deiken arta uyduysa o
deikenin temsil ettii komut yrtlr. Eer herhangi bir koula uymazsa *) ile balayan satrdaki
komut devreye girer.
Case temel yaps;
case seenek in
durum1)
komutlar ;;
durum2)
komutlar ;;
durum3)
komutlar ;;
*)
komut_x
esac

Takvim rnei;
Aadaki script aylar ve isimleri eletirmitir. Bu scripti gelitirip kullancdan ay say olarak
girmesini isteyip karln yazdrabiliriz.

#!/bin/sh

case $1 in
01 | 1) echo "Month is January";;
02 | 2) echo "Month is February";;

03 | 3) echo "Month is March";;


04 | 4) echo "Month is April";;
05 | 5) echo "Month is May";;
06 | 6) echo "Month is June";;
07 | 7) echo "Month is July";;
08 | 8) echo "Month is August";;
09 | 9) echo "Month is September";;
10) echo "Month is October";;
11) echo "Month is November";;
12) echo "Month is December";;
*) echo "Gecersiz Parametre!!";;
esac

NOT: Her satrn sonuna ;; eklemezsek program uyduu case koulunu deil tm koullar
ekrana basacaktr

Say bulmaca Scripti;


#!/bin/bash
echo -n "1 ile 3 arasinda bir sayi giriniz > "
read character
case $character in
1 ) echo "Bir girdiniz."
;;
2 ) echo "Iki girdiniz.."
;;
3 ) echo "Uc girdiniz."
;;
* ) echo "bir ile uc arasinda bir deger girmediniz!"
Esac

Ayn scripti if yaps kullanarak yazmak isteseydik aadaki gibi olacakt. Her iki scripti incelersek
if ile case arasnda fark daha iyi anlam oluruz
#!/bin/bash

echo -n " ile 3 arasinda bir sayi giriniz > "


read character
if [ "$character" = "1" ]; then
echo "Bir Girdiniz."
else
if [ "$character" = "2" ]; then
echo "Iki girdiniz.."
else
if [ "$character" = "3" ]; then
echo "Uc girdiniz..."
else
echo "Yanlis deger girdiniz."

fi
fi
fi

For, while Dngleri


Bir ii belirli sayda ya da belirli koula kadar yapmak iin kullanlan for-while dngleri
programlama dillerinin vazgeilmez kalasik elerinden biridir. Hi unutmuyorum ilk programlama
dersi aldmz zamanlarda henuz for yapsn renmemitik ve hoca ekrana 1den 100e kadar
saylarn ktsn yazdrmamz istemiti. Tabii haliyle dng nedir bilmediimiz iin biraz
dnp : ne var bunda , alt atla yazariz demitik..Bir mddet sonra hocamz bizim programmz
incelemeye geldiinde kendisini glmekten alamamt ve Ya bine kadar yazn desem ne
yapacaksnz ocuklar demiti . Sonraki ders dngler idi ve biz can kula ile dersi dinliyorduk.

Temel For yaps;


For degisken in
Do
Komutlar..
done
rnek;
#!/bin/bash
for aylar

in Ocak Subat Mart nisan Mayis Haziran temmuz Agustos

do
echo $aylar
done

script altrldnda sras ile Ocak subat ... okuyarak ekrana basacaktr.

Bir dier rnekle konuyu pekitirelim: /etc/ dizininde r ile balayan tm dosyalar listelenerelk
aralarnda dizin zellii tayanlar ekrana dizin ad (dir), dizin zellii tamayanlar ise
dosya_adi (file ) ekilde yazdrlacaktr.

#!/bin/bash

for myfile in /etc/r*


do
if [ -d "$myfile" ]
then
echo "$myfile (dir)"
else
echo "$myfile (file)

fi
done

Sistemdeki kullanclar Listeleme Scripti


/etc/passwd dosyasnda bulunan kullanclar listelemek iin aadaki scripti kullanabiliriz. Script
ierisinde kullanlan awk bash gibi bir script dilidir ve script ierisindeki grevi /etc/passwd
dosyasndaki satrlar : karekterine gre ayrtrp ilk kolonu semektir.
#!/bin/bash
PASSWD_FILE=/etc/passwd
a=1
for name in $(awk -F: '{print $1}' < "$PASSWD_FILE" )
do
echo "USER $a = $name"
let "a += 1"
done
exit 0

$chmod 700 user.sh


$./user.sh
USER #1 = root
USER #2 = daemon
USER #3 = operator
USER #4 = bin
USER #5 = smmsp
USER #6 = popa3d
USER #7 = sshd
USER #8 = _portmap
USER #9 = _identd

While , until Kullanm


Koul tuttuu srece ve koul gerekleene kadar ilem yap mant ile alan while ve Until
yaps bash altnda kullanabileceimiz dng eitlerindendir.

Temel While yaps;


while [ koul ]
do
ilemler
done

#!/bin/bash
myvar=0
while [ $myvar -ne 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done

myvar deikeninin 0a eitle ve karlatrmaya bala, deiken 10 olmad mddete ekrana


deikenin deerini yaz ve deerini bir artr.
until whilein tam tersi denilebilir. Aadaki rnekte dekenimiz 10 olana dek ekrana yaz diyoruz.
#!/bin/bash
myvar=0
until [ $myvar -eq 10 ]
do

echo $myvar
myvar=$(( $myvar + 1 ))
done

Fonksiyonlarla ilemler
Programmz iinde sk kullanacamz baz yaplar bir dzen altnda tanmlayarak devaml
kullanabiliriz. Mesela programmz ierisinde kullancdan veri alacak bir blm olsun ve biz bu
blm birden fazla yerde kullanmak isteyelim, normalde her kullanacamz yerde gidip ayn
eyleri yazmamz gerekecekti. Oysa bu blou fonksiyon olarak tanmlarsak kullanmamz gereken
yerde sadece fonksiyonu adyla armamz yeterlidir.
Temel Fonksiyon Yaps;
Bash programlamada iki eit fonksiyon tanm yaplabilir.
function fonksiyon_Adi {
komutlar

}
ya da
fonksiyon_adi
komutlar

() {

}
rnek;
#!/bin/bash
# ekrana hello yazmak iin kullanlan fonksiyon
hello()
{
echo "Su an hello() fonksiyonunu cagirdiniz.."
}
echo "hello() fonksiyonu cagriliyor.."
hello
#Diger tanimlama yontemi
function hello()
{
echo "hello() fonksiyonunu cagirdiniz.."
}

NOT:Fonksiyonlar kullanlmadan nce tanmlanmaldr.

Fonksiyon tanmlarken dikkat edeceimiz bir husus. Normal dillerde fonksiyon iinde tanmlanan
deiken sadece o fonksiyon ierisinde geeli olurdu. Halbuki bashde fonksiyon iinde tanmlanan
deiken tm program boyunca aktif olur. Bunu engellemek yani fonksiyon iinde tanmlanan
deikenin mrn fonksiyon ile snrlamak istersek local deiken tanm kullanrz.
Local degisken=bu degisken yereldir gibi

#!/bin/bash
Degisken=100
Function hesaplama
{
Local degisken=50
Echo -n Bir sayi giriniz:
Read sayi
Echo sayi+degisken=$(( $sayi + $degisken ))
}
hesaplama
Scripti altrlrsa ekrana Sayi+degisken=50+girdiiniz_deer yazacaktr.

Fonksiyon , until karm bir rnek;


#!/bin/bash

function press_enter
{
echo ""
echo -n "Press Enter to continue"
read
clear
}

selection=
until [ "$selection" = "0" ]; do
echo ""
echo "PROGRAM MENU"
echo "1 Bos Disk alanini Goruntule
echo "2 Bos bellek alanini Goruntule
echo ""
echo "0 Programdan cikis
echo ""
echo -n Seciminizi Giriniz:
read selection
echo ""
case $selection in
1 ) df ; press_enter ;;
2 ) free ; press_enter ;;
0 ) exit ;;
* ) echo "Lutfen 1, 2, ya d a0 degerini giriniz; press_enter
esac
done

Diziler
Diziler benzer zellikteki deikenleri gruplamaya yarar. Mesela yln aylarn bir diziye atayarak
bu diziye ay adn verirsek elimizde 12 elemanl bir dizi olur.
Aylar=(Ocak Subat Mart nisan Mayis Haziran Temmuz Agustos Eylul Ekim Kasim Aralik )
12 elemanl bir dizi. Dizilerin indisi 0dan balar yani aylar dizisine bakacak olursak dizinin ilk
eleman aylar[0] dr.

array=( zero one two three four five )


echo ${array[0]}

sifir

echo ${#array[*]}

dizide kac eleman oldugu

You might also like