Professional Documents
Culture Documents
Bashkomutlari PDF
Bashkomutlari PDF
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.
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
USER
PS1
SHELL
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.
altrlan komutu () arasna alarak ve bana $ iareti koyarak deikene atama yapar ve
istediimiz yerde kullanabiliriz, nasl m?
rnek;
$ echo $MYFILES
crontab entropychatdisable fstab inittab mtab quotatab updfstab
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
#!/bin/sh
echo n "Adinizi Giriniz: "
read name
echo "Merhaba $name !"
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
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"
$ ./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
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
-f file
-r file
-w file
-x file
-d file
-s file
-a
-o
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
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";;
NOT: Her satrn sonuna ;; eklemezsek program uyduu case koulunu deil tm koullar
ekrana basacaktr
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
fi
fi
fi
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
fi
done
#!/bin/bash
myvar=0
while [ $myvar -ne 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done
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.."
}
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.
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.
sifir
echo ${#array[*]}