You are on page 1of 92

Bash Shell Programozs

1. oldal

Bash Shell Programozs

BASH SHELL PROGRAMOZS (basic2bash)

Ksztette: Raffai Gbor Istvn alias Glindorf


Kelt: Kecskemt, 2003.04.18.
( frissitve: 2003.04.25.)

A dokumentum szabadon felhasznlhat, msolhat,


amennyiben a szerz adatai nem kerlnek eltvoltsra,
megvltoztatsra. A szerz kln engedlye nlkl, a
dokumentum csak vltozatlan formban s formtumban,
valamint tartalomal tehet kzz, vagy msolhat.

Hiba bejelents:
Mail: rgi@vipmail.hu glindorf@mailbox.hu
Mobil: 70/259-0425
ICQ: 108767553

2. oldal

Bash Shell Programozs

3. oldal

Tartalom
Bevezets --------------------------------------------------------------------- 5.old
1. Hello World ! -------------------------------------------------------------- 7.old
- echo
- vltoz kezels 1.
- futtathat script fjl ksztse
- Xdialog --msgbox
2. Vltozk s argumentumok ------------------------------------------ 12.old
- rtkads a vltozknak
- read
- script argumentumok
- specilis scriptvltozk
- Xdialog --inputbox --3inputsbox
3. Szoksos be s kimenetek, adatfolyamszerkeszts --------------- 18.old
- grep 1.
- szoksos bemenet, szoksos kimenet
- szoksos hibakimenet
- adatfolyam szerkeszts
- Xdialog --rangebox
- regulris kifejezsek, metakarakterek
- script kd rsa
4. Adatfolyam szrk s szerkesztk. ----------------------------------- 23.old
- grep 2.
- cut
- sort, join
- tr, sed
- Xdialog --timebox --infobox
5. Felttel vizsglat, feltteles vezrlsi szerkezetek ------------------ 30.old
- test
- if
- case
- menu a scriptben
- Xdialog menrendszer
6. Ciklusok ------------------------------------------------------------------ 41.old
- while, until
- for
- Xdialog --dselect, script: mp3 fjl katalogizl

Bash Shell Programozs

4. oldal

7. Sajt fgvnyek ksztse ---------------------------------------------- 48.old


- function
- loval
- tput
- kls fgvnyknyvtr ksztse
- tbb Xdialog megmyitsa egyszerre
- Xdialog --3rangesbox --calendar --buildlist
8. Tmbvltozk s tbbdimenzis tmbk modellezse ------------- 61.old
- bash tmbvltoz
- tbbdimenzis tmbk modellezse
- Xdialog --wizard --yesno, script: adatrekord felvitel
9. Scriptnk tesztelse, hibajavtsa ------------------------------------ 75.old
10. Nhny tlet ------------------------------------------------------------ 76.old
tsz ------------------------------------------------------------------------ 77.old
Xdialog jegyzet, man-szer lers. -------------------------------------- 78.old

Bash Shell Programozs

5. oldal

Bevezets
dvzlm a kedves rdekldt, aki felttte ezen az oldalakat.
Ez az rs a Bash shell scriptek rsnak alapjait igyekszik bemutatni, illetve segt
azt elsajttani. Kicsit fellengzsen gy is utalhatunk r, mint shell
programozsra. Br nyilvnvalan a lehetsgek tern, a shell messze elmarad a
valdi program nyelvektl, mg is nagyon hatkony eszkz tud lenni a
keznkben. Az, hogy milyen mrtkben az tulajdonkppen rajtunk mlik.
Egyrszt, hogy milyen mlysgeiben ismerjk meg a bash shell-t, msrszt pedig,
hogy mennyi parancssoros programot, ismernk meg s tanulunk meg hasznlni.
Hiszen a shell scripteknek egy jellemzje, hogy a shell-en kvl klnfle egyb
programokat hvunk, hvhatunk meg belle.
Termszetesen az rs messze nem trekszik teljessgre. Clja, egy j kezdethez
segteni a felhasznlt, msrszt a windowshoz szokott szemlyeknek bepillantst
engedni a linux lelkivilgba. Nem titkolt clja az rsnak, hogy felkeltse az
rdekldst s motivcit is adjon, az alapvet parancsok s konzolos programok
megismershez. Hogy a kezd, de rdekld felhasznlt, mintegy tvezesse a
grafikus fellet burkn s btorsgot, illetve nbizalmat adjon a konzol
hasznlathoz, a config fjlok s scriptek tszerkesztshez, programok forrsbl
trtn forgatshoz, stb. Azaz, hogy a felhasznlt, kontaktusba hozza a linux
valdi "njvel".
Ez a dokumentum, az egszen kezd felhasznlkhoz is szl, akik mg sohasem
programoztak ms nyelven. (Pl.: basic, pascal, c, stb.) De az rs nem hajt
programozstechnikai fogsokkal foglalkozni. Ebbl is "csak" az alapokat adja
meg.
A rszeket rdemes elejtl fogva, sorba olvasni, mert fokozatosan egyre tbb
mindent bz a felhasznl nll gondolkodsra, mr megszerzett ismereteire,
azaz az anyag felttelezi az elz rszek elolvasottsgt s megrtst. ppen
ezrt, a pldkat s a scripteket, rdemes vgigcsinlni, elkszteni. Egy-egy rsz
utn, akkor j ha tovbb megynk, ha azt, valamint az ott szerepl parancsokat
s scriptek mkdst megrtettk. A ksbbi rszekben egyre tbb informci a
plda scriptek kommentjeiben van megadva illetve az utols rszekben nhol,
csak egy rvid sszefoglal lers van a script mkdsrl. De aki a fentiek
szerint vgig kvetti az anyagot, annak ez nem fog problmt okozni, st, gy
jobban ttekinthetk szmra a pldk s a scriptek.
A pldk s a plda scriptek csak az adott anyag megrtst szolgljk.
Nyilvnvalan egy-egy feladatot sokflekppen, ms parancsokkal, rvidebb
kddal is meg lehet oldani. Ez is egy nagyszer lehetsg az nkpzsre s
fejldsre. Mivel a bash-script, nem ms, mint parancssori utastsok sorozata,
ezrt nhny egyszerbb esetben elg csak a konzolon, parancssorba rni a
pldt. Ezt a mdszert, fleg eleinte hasznlni fogjuk, mivel gy egyszerbben s
gyorsabban kvethet az anyag. Ezeknl a pldknl, egy "$" jel lthat a sor
elejn, mely a promptot jelenti, vagyis azt nem kell a terminlba begpelni.
Amelyik sor pedig az elzleg begpelt parancs eredmnyt tartalmazza, ott nincs

Bash Shell Programozs

6. oldal

eltte "$" jel. Ezzel lehet ket jl megklnbztetni. Ahol script forrsa szerepel,
azt kt szaggatott vonalakat tartalmaz sor kz helyeztem. Gyakran fogunk
tallkozni a scriptekben, olyan hossz parancssorokkal, sorozatokkal, amelyek
nem frnek el a knyv egy sorba. Ezek az rtelmezst megneheztik, mert nem
biztos, hogy az ember rgtn ltja, j sorrl, van-e sz, vagy az elz folytatdik.
Ezrt, a \ jelet hasznlom a scriptekben. Ez mintegy semmiss teszi a sortrst.
(Levdi a sorvgjelet.) Ha ilyen sorokat msolunk ki a dokumentumbl, azok
helyesen fognak vgrehajtdni. Mert a shell szmra, ezek egy sornak
szmtanak.
A scripteket brmilyen text fjlt kezel szvegszerkesztvel el lehet lltani, de
erre a clra rdemesebb egyszer editort, vagy direkt erre a clra kifejlesztett
editort hasznlni. A legegyszerbb az mc editort hasznlni (mcedit). Ha mr a fjl
elejn megnyitskor szerepel a "#!/bin/bash" bejegyzs, akkor a bash shell
szablyainak megfelelen emeli ki a script egyes elemeit. Ha inkbb grafikus
fellett szeretnnk hasznlni, akkor a kwrite is tudja a bash-nak megfelelen
kiemelni az elemeket. Egy kisebb s gyorsabb lehetsg a nedit, ami szintn tudja
sznezni a szveget a bash szablyinak megfelelen. rdekes lehetsg mg a
kate, amely a kwrite-hez hasonl, de knny vele egyszerre tbb fjlt szerkeszteni,
kezelni, a kpernyt meg tudja osztani kt szerkesztend fjl kztt, fjl
csoportokat azaz fjllistkat is is lehet vele menteni, megnyitni, valamint a kate-n
bell lehet nyitni egy parancsrtelmezt, azaz terminlt, ami aktulis knyvtra
dinamikusan, az ppen kivlasztott dokumentum knyvtrra vlt.
A dokumentum egyes rszeinek vgn egy-egy Xdialog-os plda szerepel. Mi is
azaz Xdialog ? Egy grafikus dialgus ablakokat megjelent program, amely
scriptekbl hvhatk meg. A script beli hvsakor megadott kapcsolk,
paramterek, argumentumok hatrozzk meg a mkdst s a tpustl fggen
rtkeket is kpes visszaadni. Aki foglalkozott windows API-val, Visual Basic-el,
Delphi-vel, Kilyx, vagy brmilyen egyb hasonl vizulis fejleszteszkzzel, akkor
azok grafikus ptelemeire gondoljon. Termszetesen sszesem hasonlthatan
kevesebb lehetsggel. Az Xdialog-al, knnyen s gyorsan kszthetnk,
"ltvnyos" s felhasznlbart scripteket. Az albbi oldalakrl lehet letlteni.
http://xdialog.dyns.net http://freshmeat.net/projects/xdialog
A dokumentumban szerepl pldascriptek, letlthetek a http://glindorf.fw.hu ,
Letltsek > Shell Programozs dokumentum - scriptek szekcibl. Illetve az
oldalon megtallhat ennek a dokumentumnak a legfrisebb vltozata, txt s pdf
formtumban is.
Szvesen veszek a dokumentummal kapcsolatos mindenfle visszajelzst, kritikt.
Az albbi cmeken vagyok elrhet:
Raffai Gbor Istvn:
Mail: rgi@vipmail.hu glindorf@mailbox.hu
ICQ: 108767553
Web: http://glindorf.fw.hu
Mobil: 70/259-0425

Bash Shell Programozs

7. oldal

1. Hello World !
Mivel a legtbb j rdekld, windows-os vagy DOS-os rendszereken ntt fel,
elszr hasonltsuk a shell scriptet a legtbbnk ltal ismert batch fjlokhoz.
Ezek a windows-os vagy mg inkbb a dos-os rendszerekbl ismert futtathat
fjlok, amikbl programokat s dos parancs sorozatokat lehet futtatni. A hasonlat
kedvrt tekintsk a dos-t egy shell-nek. Ezeknl a batch fjl voltt, a *.bat
kiterjeszts jellte. Viszont, mivel a linux esetben tbbfle shell is futhat, ezrt
fontos, hogy a script-ben meg legyen hatrozva, milyen shell-re rtk. Ezt a fjl
els sorban kell jelezni, valahogy gy:
#!/shell/elrsi/utvonala
Ha ez nincs benne, akkor a rendszer alap rtelmezett shell-jvel prblja azt
futtatni. Br ez a legtbb mai linux-ban alapbl a bash shell. A shell scriptet
tartalmaz fjlnl nem kell klnleges kiterjesztst hasznlni. Csupn
futtathatv kell tenni a fjlt.
$ chmod +x scriptfajl
Kzeltsk meg a shell scripteket egy msik hasonlatbl. A program kdokat
alapveten kt fle kpen lehet futtatni. Vagy binris kdd fordtja azt egy
compiler, vagy futs idben rtelmezi egy interpreter. A modern programozsban,
lehetsg van mindkettre. Mr a QBasic tervez programjban is, a program
rsa kzben, magt a kdot is le lehet futtatni de ha jl mkdik, akkor binriss
is fordthat. Az azta megjelent fejleszt eszkzkben pedig alapvet funkci ez.
A shell scriptek esetben sajnos nincs lehetsg binriss fordtani. A shell
scripteket a shell soronknt, parancsonknt rtelmezi s hajtja vgre. gy is
tekinthetnk a scriptekre, mint konzolon, egyms utn begpelt parancsokra.
A shell-t hj-programnak is szoktk nevezni. Tulajdon kpen ez burkolja be a
kernelt. A shell a sajt nyelvezetben kapott parancsokat a kernel szmra
rtelmezhet mdon kldi tovbb. Valamint visszafel, a kernel zeneteit
tovbbtja a felhasznlnak, vagy a shell-t hasznl programnak. A shell
scriptbl, nem csak shell parancsokat adhatunk ki, hanem brmilyen programot
futtathatunk is. St, a legtbb esetben ez trtnik, ugyanis a
"linuxos-parancsoknak" legnagyobb rsze, nll program.
Legyen az els pldnk, "ktelezen" egy "Hello World !" program. Rajta keresztl
a bash-script tbb jellemzjt is megvizsgljuk s egy kis Xdialog-os pldt is
megnznk. A parancs sorok eltti "$" jel, a prompt-ot jelkpezi, vagyis azt nem
kell begpelni.
echo
Nyissunk egy terminl ablakot s rjuk bele a lenti parancsokat ! Termszetesen a
sorok vgn enter-t nyomva.
$ clear
$ echo Hello World !

Bash Shell Programozs

8. oldal

Nem nehz kitallni mi trtnt. A "clear" trlte a kpernyt, az "echo" pedig meg
jelentette az utna lev szveget.
Most tegyk a "Hello World !" szveget egy vltozba s gy rassuk ki a
kpernyre.
A bash vltozi, alaphelyzetben szveges vltozk. Br a declare paranccsal lehet
integer (egsz numerikus rtk) tpust s tmb tpust is meghatrozni. Az
integer tpusba, ha szveges adatot tltnk fel, akkor az nulla rtket ad vissza.
Integer, szm tpus vltoz ltrehozsa:
$ declare -i $valt
$ valt="szveg"
$ echo $valt
0
Tmb tpus ltrehozsa:
$ declare -a $valt[elemszam]
rtkads:
$ valt[elemsorszm]="kifejezs"
rtk kinyerse:
$ echo ${valt[elemsorszm]}
A teljes tmbtartalom kirsa:
$ echo ${valt[*]}
Az rtkkel feltlttt elemek szmnak lekrdezse:
$ echo ${#valt[*]}
Ez utbbi dinamikus tmbknt viselkedik, vagyis a deklarcinl meghatrozott
tmbelemszmnl nagyobb sorszm elemmel is feltlthet. Viszont a
tbbdimenzis tmbk nem tmogatottak.
Minden tpus karakteresen troldik. A vltozt alap esetben nem kell kln
ltrehozni. Mikor rtket kap, akkor ltre jn karakteres tpusknt. A ltrejv
vltoz, csak arra shell-re rvnyes, azaz ha kzben becsukjuk a terminl ablakot
s jat nyitunk, akkor jra rtket kell adni a vltozknak. Nzzk meg a
gyakorlatban is, a szveges tpus vltozk hasznlatt.
$ a=Hello World !
A fenti prblkozs az albbi hibazenetet eredmnyezi:
bash: World: command not found
Azt mondja, hogy a "World" parancsot nem tallja. Azaz, az els szkz utni
rszt, jabb parancsnak rtelmezi.
ennek kivdsre, a szveget tegyk idzjelek kz.

Bash Shell Programozs

9. oldal

$ a="Hello World !"


$ echo $a
bash: !": event not found
Ez ismt hiba zenettel trt vissza. Igen, mert a !" ketts karaktert a shell
klnleges esetekre hasznlja. Tegynk egy szkzt kzjk.
$ a="Hello World ! "
$ echo $a
Hello World !
Most oldjuk meg, hogy a szveg egy rszt, dinamikussan vltoztathassuk. Ezt a
szveg adott rsznek vltozval trtn helyettestsvel rhetjke el.
$ b="World"
$ c="City"
$ echo "Hello $b ! "
Hello World !
$ echo "Hello $c ! "
Hello City !
Mint lthatjuk, a vltoz rtke behelyettestsre kerlt. De mi van, ha ezt nem
akarjuk. pl.
$ echo "Adj rtket a $b-nak ! "
Adj rtket a World-nak !
Mivel a $b vltoz rtke a "World" sz ezrt az echo ezt jelenti meg a helyn.
Ha nem akarjuk, hogy a vltoz behelyettestsre kerljn, akkor hasznljunk
egyes-idzjeleket.
$ echo 'Adj rtket a $b-nak !'
Adj rtket a $b-nak !
Ekkor a felkiltjel utni szkz is elhagyhat. Az egyes-idzjelek esetn nem
trtnik semmi klnleges dolog vgrehajtsa. De mivel a legtbb esetre igen is
kell a vltoz-rtk behelyettests, leginkbb a norml idzjel hasznlatos.
Mit tehetnk akkor, ha egy szvegrszen bell, van olyan szakasz, ahol a vltozk
egy rszt szeretnnk, hogy az rtkvel helyettestsen a shell s van ahol
onkrtan a vltoz nevt szeretnnk kiratni.
$ szem="Jzsef"
$ echo "Krlek kedves $szem adj rtket a $b vltoznak ! "
Krlek kedves Jzsef adj rtket a World vltoznak !
$ echo 'Krlek kedves $szem adj rtket a $b vltoznak ! '
Krlek kedves $szem adj rtket a $b vltoznak !
Egyik esetben sem a kvnt eredmnyt kapjuk. Kt fle megolds is knlkozik.

Bash Shell Programozs

10. oldal

$ echo "Krlek kedves $szem1" 'adj rtket a $b vltoznak !'


Krlek kedves Jska adj rtket a $b vltoznak !
Ekkor kt fel vettk az zenetnket. Egyik felt ketts a msik felt szimpla
idzjelekbe tettk.
De hasznlhatunk egy msik lehetsget, mg pedig azt,hogy 1 db blackslash, "\"
jelet tesznk az a vltoz el, amelyiket nem szeretnnk az rtkvel
behelyettesteni. Ez ugyanis az utna kvetkez karakter, a shell szmra
klnleges jelentst hatstalantja. gy is szoktk mondani, "levdi" azt.
$ echo "Krlek kedves $szem adj rtket a \$b vltoznak ! "
Krlek kedves Jska adj rtket a $b vltoznak !
Mg egy problma felmerlhet a vltozk rtknek kiratsa sorn, akkor, ha a
kirand szvegben a vltoz utn nem akarunk szkzt hagyni. Pl. egy frj
nevhez akarju a "n" jelzt fzni:
$ nev="Kovcs"
$ echo "$nevn"
Erre egy res vltozt kapunk, mivel a "nevn" nev vltoznk res. A megolds,
hogy a vltoz nevt jelent rszt s a kirand rszt a "{}" jelekkel klntjuk el.
$ echo "${nev}n"
Kovcsn
Br az eddigi pldkat, parancssorba gpelgettk, de ha ezeket egy
#!/bin/bash
kezdet fjlba helyezzk, majd erre futsi jogot adunk, akkor ugyanezeket az
eredmnyeket kapjuk.
Teht:
$mcedit hw
Ekkor az mc fjlkezel szvegszerkesztje megnyitja a hw nev fjlt, vagy ha nem
ltezik mg, akkor ments sorn ltre hozza. Ebbe begpeljk:
---------------------------------------------------------------#!/bin/bash
a="Hello World ! "
echo $a
Maj ments (F2) utn az mcedit-bl kilpve, futsi jogot adunk neki:
$ chmod +x hw

Bash Shell Programozs

11. oldal

Ha most ki adjuk a
$ hw
parancsot, azt a hiba zenetet kapjuk, hogy nincs ilyen program. Ugyan is a
$PATH globlis vltozban lv tvonalakon keresi. ltalban:
/usr/bin:/usr/local/bin:/usr/X11/bin:/home/user/bin
Ha futtatni akarjuk, adjuk meg neki, hogy az aktulis knyvtrba keresse, a "./"
karakterekket el rva:
$ ./hw
Hello World !
Xdialog plda:
Most megnzzk hogy az Xdialog programot felhasznlva, milyen egyszeren s
gyorsan tehetjk script-jeinket ltvnyoss s felhasznlbartt.
Ehhez szksges, hogy az Xdialog program fel legyen teleptve. Az kvetkez
oldalrl letlthet: http://xdialog.dyns.net/ vagy a
http://freshmeat.net/projects/xdialog cmrl. UHU linux-hoz, a source-t, azaz a
forrskdot tltsk le. Knnyedn lefordul. Nincs semmi fggsge. Kicsomagols
s a forrsnak knyvtrba lpes utn:
$ ./configure
$ make
$ make install
Most az Xdialog legegyszerbb dobozt fogjuk hasznlni, az msgbox-ot. Ez egy
ablak, amiben a "kifejezs" szveg olvashat s egy "OK" gomb van rajta. A kt
szmmal az ablak mrete adhat meg. 0 0 esetn automatikusan a szveghez
mretezi azt. A tovbbiakrt lsd az Xdialog jegyzetet.
Ha felteleptettk az Xdialog-ot akkor szintn egy terminlba rjuk be:
$ Xdialog --title "Shell Programozs" --msgbox "Hello World ! " 0
0
vagy:
$ a="Hello World ! "
$ Xdialog --title "Shell Programozs" --msgbox "$a" 0 0
Itt fontos az idzjelek kz tenni a $a vltozt, mert egybknt nem egysges
egszknt kezeli az kifejezst, hanem gy rtelmezi:
$ Xdialog --title "Shell Programozs" --msgbox Hello World ! 0 0
Ekkor csak a Hello szt rn ki.
Ez rvnyes ms shell parancsoknl is.

Bash Shell Programozs

12. oldal

2. Vltozk s argumentumok
Ebben a rszben a vltozk rtk adsnak klnfle mdjairl lesz sz, bele
rtve a felhasznli adatbevitelt valamint egy parancssorozat eredmnynek
vltozba helyezst is. A vltoz="rtk" s a vltoz='rtk' tpus rtkadsra
itt mr nem trnk ki, hiszen azt az elz rszben megismertk.
let
Mr volt rla sz, hogy a shell vltozk, alapesetben szveges vltozk. Viszont a
vltozkban gyakran numerikus, szm rtket akarunk trolni. Ezzel nincs is
gond, hiszen:
$ a="12"
$ echo $a
12
Azonban ha az rtkekkel, szmolni is szeretnnk, nem ilyen egyszer a dolog.
$ b="24"
$ c=$a+$b
$ echo $c
12+24
A fenti mdszer nem a kvnt eredmnyt hozta. Mind a vltozt rtkt, mind az
opercis jelet, szveges adatknt kezelte. Azt hogy a shell a vltoz rtkt
karakteres, vagy numerikus adatknt, esetleg dtumknt, vagy netn egy fjl
neveknt rtkeli, azt a vltoz felhasznlsi mdja hatrozza meg. Teht a kell
eredmny rdekben meg kell mondanunk a shellnek, hogy hogyan kezelje a
vltozk rtkt. Ha azt akarjuk, hogy egy szmtst vgezzen el, akkor a "let"
parancsot kell hasznlnunk.
$ let c=$a+$b
$ echo $c
36
De ezekben a formban is lehet szmolni:
c=$(($a+$b))
c=$[$a+$b]
A let paranccsal, sszeadst, kivonst, szorzst s osztst vgezhetnk el s
zrjeleket is hasznlhatunk. De csak egsz szmokat tud kezelni. Azaz a :
$ let d=$c/5
$ echo $d
7
helytelen eredmnyt adja.

Bash Shell Programozs

13. oldal

A trt szmokhoz, mr kls programot kell hasznlni pl. a "bc" programot.


$ echo $c/5 | bc -l
7.20000000000000000000
Br meghatrozhat integer tpus vltoz, de ez csak annyit jelent, hogy ha
szveges stringel tltjk fel az gy deklarlt vltozt, akkor annak az rtke 0 lesz.
Szmolni sajnos gy sem lehet velk, csak a fent mutatott technikkkal.
$ declare -i szam
$ szam="szveg"
$ echo $szam
0
Elfordulhat, hogy egy vltoz hosszra vagyunk kvncsiak. Erre megfelel a wc
program hasznlata, amely vissza adja, hogy a bemenetre rkez adat hny
sorbl, szbl s karakterbl ll.
$ nev="Kovcs Gspr"
$ hosz=`echo $nev | wc -c`
$ echo "$nev neve $hosz karakterb l ll a szkzzel egytt."
Kovcs Gspr neve
14 karakterb l ll a szkzzel egytt.
read
Igen gyakori az is, hogy a a felhasznltl szeretnnk, adatot bekrni. Erre a shell
a "read" utastst hasznlja. Ekkor egy vrakoz, kurzort kapunk. Az adatbevitel
sorn, a kurzormozgat billentyk is hasznlhatak. Az adatbevitelt az "enter"
letsvel fejezhetjk be. Ekkor a shell folytatja a tovbbi utastsok
vgrehajtst. Felttelezve, hogy a read utn pl. az "uhulinux" szt gpeljk be:
$read d
$ echo $d
uhulinux
Egyszerre tbb vltozba is krhet be adat. Ekkor a bevitel sorn a szkzknl
darabolja a begpelt szveget. Azaz az els szkzig az els vltozba, az els s
msodik szkz kztti rszt a msodik vltozba, a msodik s harmadik szkz
kztti rszt a harmadik vltozba helyezi, s gy tovbb. Pl. Tegyk fel, hogy a
bevitel sorn a hrom adatot, nevet, lakhelyet s e-mailcmet akarunk bevinni.
$read a b c
$ echo $a
Gbor
$ echo $b
Kecskemt
$ echo $c
nagylevel.nekem@fibermail.hu
Felmerl a krds, hogy mikppen kezelhet helyesen a szkzket tartalmaz

Bash Shell Programozs

14. oldal

kifejezsek. Pldul, ha a nvnl a vezetk s a keresztnevet is meg akarjuk adni.


Az eredmny ez lesz.
$ echo $a
Raffai
$ echo $b
Gbor
$ echo $c
Kecskemt nagylevel.nekem@fibermail.hu
Ltjuk, hogy amg van jabb meghatrozott vltoz a read sorban, addig minden
szkz utn jba helyezi, a maradkot pedig elhelyezi az utolsba. Hogyan lehet
ezt kivdeni ? Ezt a mr ismert backslash "\" karakterrel tehetjk meg. Ez
hatstalantja a mgtte lv karakter, shell szmra trtn klnleges jelentst.
gy a szkzt is. A fenti pldnl maradva a kvetkezkppen gpelve a read
sorn, a helyes eredmnyt kapjuk: "Raffai\ Gbor Kecskemt
nagylevel.nekem@fibermail.hu"
A linux parancsok sorn a szkzkre, s ms klnleges jelents karakterekre
oda kell figyelni s a "\" megoldssal, valamint az idzjel tipusok helyes
alkalmazsval szablyozni kell, hogy a shell hogyan rtelmezzen. A kezdetekben
ez egy gyakori s bosszant hiba forrs lehet.
Az adat bekrse eltt gyakran tjkoztatni kell a felhasznlt, milyen adatot is
krnk tle. Ehhez egy echo parancsot hasznlhatunk eltte.
$ echo "rd be a neved, a vrost ahol laksz s az e-mailcmed: "
$ read adatok
$ echo $adatok
Gbor Kecskemt nagylevel.nekem@fibermail.hu
Ilyenkor mint lttuk, a kurzor az adatbekrshez az echo parancs kirsa alatti
sorba kerl. Ha azt szeretnnk, hogy a kurzor a tjkoztat szveg utn, vele egy
sorba kerljn, hasznljuk az echo parancsot "-n" kapcsolval.
$ echo -n "rd be a neved, a vrosod, s az e-mailcmed: "
$ read adatok
$ echo $adatok
Gbor Kecskemt nagylevel.nekem@fibermail.hu
Elfordul, hogy egy fjl tartamt szeretnnk egy vltozba tenni. Vagy legalbb is
fjlbl szeretnnk a vltoznak rtket adni. Ehhez a "cat" parancsot
hasznlhatjuk. Tegyk fel, hogy a fenti adatainkat, az adat.txt fjl tartalmazza.
$ cat adat.txt
Gbor Kecskemt nagylevel.nekem@fibermail.hu
A cat parancs ebben a formjban a kpernyre rja az adott fjl tartamt.
Vltozba, a balra dl szimpla idzjelekkel segtsgvel tehetjk.

Bash Shell Programozs

15. oldal

$ adatok=`cat adat.txt`
$ echo $adatok
Gbor Kecskemt nagylevel.nekem@fibermail.hu
A balra dl idzjelek esetn, (amelyet ltalban a magyar billentyzeten az
AltGr+7 kombincival rhetnk el,) a kt idzjel kztti rszt, mint parancsot
vgrehajtja a shell s a kapott eredmnyt helyezi a vltozba. Ez akr egy hossz
parancssorozat is lehet.
Az olyan eset is gyakori, hogy egy-egy vltoz rtkt, a script indtsakor,
argumentum formjban akarjuk megadni. Ezekre a scripten bell, specilis
vltozkkal hivatkozhatunk. Nzzk meg egy pldn keresztl, hogy mkdik ez.
Hozzunk ltre egy "proba1" nev fjlt:
$ mcedit proba1
Tltsk fel az albbi tartalommal:
-------------------------------#!/bin/bash
# 2.fej.1.script
clear
echo "Darab : $#"
echo "Nv : $1"
echo "Cm : $2"
echo "E-mail : $3"
-------------------------------Ments utn, adjunk neki futsi jogot:
$ chmod +x proba1
Ezutn futtassuk hrom argumentum-all:
$ ./proba1 Gbor Kecskemt nagylevel.nekem@fibermail.hu
Darab : 3
Nv : Gbor
Cm : Kecskemt
E-mail : nagylevel.nekem@fibermail.hu
Mint ltjuk a $# klnleges vltoz, a script futtatsakor megadott
argumentumok darabszmt tartalmazza.
Megemltenk mg hrom klnleges vltozt:
$0 A script nevt tartalmazza, pontosabban azt, ahogyan meglett hva.
$* Az sszes parancssori argumentumot tartalmazza egyben, egyetlen egysgknt
kezelve.
$@ Az sszes parancssori argumentumot tartalmazza, de kln-kln egysgknt
kezelve.
Ezeken kvl a scriptekbl elrhetek a globlis shell vltozk, mint a $HOME az
$USER, az $PATH s a tbbi.

Bash Shell Programozs

16. oldal

Kicsit vizsgldjunk mg, a script milyen mdon veszi t a parancssori


argumentumokat. A scripten kvl ltezik neknk mr az $adatok nev vltoz, a
"Gbor Kecskemt nagylevel.nekem@fibermail.hu" tartalommal, vagy amit Te
gpeltl be az elzek sorn.
Adjuk t argumentumknt ezt a vltozt a scriptnek, gy:
$ ./proba1 $adatok
Ugyan azt az eredmnyt kapjuk, mert a script az $adatok vltoz tartalmt,
kln-kln argumentumknt kezeli a szkzknl darabolva. De most a vltozt
tegyk idzjelbe.
$ ./proba1 "$adatok"
Darab : 1
Nv : Gbor Kecskemt nagylevel.nekem@fibermail.hu
Cm :
E-mail :
Nos ekkor a script, egyetlen argumentumknt kezeli a vltozt tartalmt, mintha
a szkzket "\"-el levdtk volna.
A teljessg kedvrt, prbljuk mg ki, szimpla idzjellel is.
$ ./proba1 '$adatok'
A balra dl idzjelet is megnzhetjk:
$ ./proba1 `cat adat.txt`
Gondolom a fentebbi sorok fnyben ezeket mr nem kell kln elmagyarzni.
shift
Felmerlhet az igny, hogy az tadsra kerl argumentumokat sorba
feldolgozzuk. Ezt a sift paranccsal tehetjk meg, mely egyel balra lpteti az
argumentumok rtkt. De nzzk meg egy pldn keresztl. proba1 nev
scriptnket, egsztsk ki az albbi sorokkal.
-----------------------------------------------#!/bin/bash
# 2.fej.2.script
clear
echo "Darab : $#"
echo "Nv : $1"
echo "Cm : $2"
echo "E-mail : $3"
echo "\$1:$1 \$2:$2 \$3:$3"
shift
echo "\$1:$1 \$2:$2"
shift
echo "\$1:$1"
------------------------------------------------

Bash Shell Programozs

17. oldal

Mint lthatjuk ez sorban kirja a kapott hrom argumentumot. Az els shift utn
az $1-et, azaz a "Gbor"-t eldobja s a helybe lp a msodik argumentum, azaz a
"Kecskemt". A msodik helyre, ($2) pedig feljtt a harmadik argumentum az
e-mailcm. Ekkor mr nincs $3.
A msodik shift utn, a jelenlegi $1-et, azaz a "Kecskemt"-et aldobja s a
msodik helyrl az e-mailcm feljn a $1-be. A $2 pedig megsznik.
Xdialog plda:
Befejezsl nzzk meg, miknt krhetnk be adatot egy vltozba Xdialog-al.
$ adatok=`Xdialog --stdout --title "Shell Programozs" \
--3inputsbox "rd be a szemlyes adataidat : " 0 0 \
"Nved: " "" "Vrosod: " "" "E-mail cmed: " ""`
$ echo $adatok
Gbor/Kecskemt Mrcius 15.u./nagylevel.nekem@fibermail.hu
Az Xdialog a visszatrsi rtkeit, mg ha az tbb elembl is ll, mindig egyetlen
"sor"-ba adja vissza, egy szepartorral elvlasztva ket. Ez alap esetben a "/". Ms
is meghatrozhat a --separator kapcsolval. Ajnlott a script mveleteivel nem
tkz szepartort vlasztani. Sajnos szepartornak csak egyetlen karaktert
fogad el.
$ adatok=`Xdialog --stdout --title "Shell Programozs" \
--separator ";" --3inputsbox "rd be a szemlyes adataidat : " \
0 0 "Nved: " "" "Vrosod: " "" "E-mail cmed: " ""`
$ echo $adatok
Gbor;Kecskemt Mrcius 15.u.;nagylevel.nekem@fibermail.hu
Ezutn, ha szksges, az egyes elemeket a cut programmal tehetjk kln-kln
vltozkba, de errl mg ksbb lesz sz.
Egy msik rdekes lehetsg az Xdialog inputbox-ainl, a jelsz szer bevitel
lehetsge. A --password kapcsol hasznlatakor, beviteli mezbe trtn rs
sorn, a bevitt betk helyn, csak "*" karakterek ltszanak. Ha egyszer
hasznljuk a kapcsolt, akkor az utols beviteli mezre rvnyes, ha ktszer,
akkor az utols kettre, ha hromszor, akkor mindhromra.
Hasznlhat az -inputbox, az -2inputsbox s a -3inputsbox esetben. A dobozon
megjelenik egy vlaszt kapcsol amellyel ki s be kapcsolhat a "*" effektus, azaz
a karakter rejts.
A rszletekrt s a jobb megrts vgett, lsd a Jegyzetek: Xdialog rszt.

Bash Shell Programozs

18. oldal

3. Szoksos be s kimenet, adatfolyamszerkeszts


Ebben a rszben meg ismerkednk, nhny a windowsos s dos-os vilgban nem
ismert fogalommal, a szoksos bemenet, a szoksos kimenet, a szoksos hiba
kimenet s a pipeline, azaz adatfolyam szerkeszts lehetsgvel.
Alap helyzetben egy program szoksos bemenete, a billentyzet, azaz onnan vrja
a utastsokat. A szoksos kimenet pedig a kperny, ott jelenti meg az
eredmnyeket. A szoksos hiba kimenet is a kperny, a program ide kldi a
hibazeneteit. Ezeket azrt nevezzk "szoksosnak", mert ezek az
alaprtelmezettek, de ha a clunk gy kvnja, megvltoztathatak,
tirnythatak. Nzznk 1-2 pldt s mindjrt vilgosabb lesz.
A echo parancsot mr ismerjk. Ez egy adott karaktersorozatot, vagy egy vltoz
tartalmt rja ki a kpernyre. Most mr fogalmazhatunk pontosabban gy is,
hogy a szoksos kimenetre kldi azt. De mi van, ha a vltoz tartalmt, nem a
kpernyn szeretnnk megjelenteni, hanem egy fjlba szeretnnk ratni. Ekkor a
">" jellel irnythatjuk t a szoksos kimenetet, a fjlba. Ha az elz rszbl mg
meg van az adat.txt nev fjlunk, akkor helyezzk a mr ismert mdon, az
"adatok" nev vltozba. ( Ehhez termszetesen abban a knyvtrban kell
llnunk, ahol a fjl tallhat.) Majd a vltoz rtkt, rassuk egy fjlba az echo
parancs s a szoksos kimenet tirnytsval.
$ adatok=`cat adat.txt`
$ echo "$adatok" > uj-adat.txt
Ez ha mr ltezik az uj-adat.txt fjl, akkor fellrja azt, vagyis az elz tartalma
elvsz s bele rja az $adatok vltoz rtkt. Ha nem ezt szeretnnk, hanem a
fjlhoz hozzfzni j adatokat, akkor a ">>" jelet kell hasznunk. Hozzunk ltre egy
"ujadat" nev vltozt, tltsk azt fel s fzessk hozz a uj-adat.txt fjlhoz, majd
ellenrizzk le meg az eredmnyt.
$ ujadat="Andrs Budapest andras@freemail.hu"
$ echo $ujadat >> uj-adat.txt
$ cat uj-adat.txt
Glindorf Kecskemt nagylevel.nekem@fibermail.hu
Andrs Budapest andras@freemail.hu
grep
De nem csak fjlba lehet irnytani egy program kimenett, hanem egy msik
program bemenetre is. Erre a "|" jel szolgl. Ezt hvjk adatfolyam
szerkesztsnek. Ismerjnk meg itt egy j programot, a grep-et. Ez a bemenetre
rkez sorokbl, kiszri azokat, amelyek tartalmazzk a megadott kifejezst s
tovbb kldi azt a szoksos kimenetn keresztl. De elbb vegynk fel mg egy
szemly adatait az uj-adat.txt fjlba, ellenrizzk le sikerlt-e, majd a cat
programmal irnytsuk a fjl tartalmt a grep program bemenetre, azzal szrjk
meg a budapesti lakosokat s az eredmnyt jelentsk meg a less programmal.

Bash Shell Programozs

19. oldal

$ echo "Pter Baja peter@mailbox.hu" >> uj-adat.txt


$ cat uj-adat.txt
$ cat uj-adat.txt | grep Budapest | less
A cat program kimenett a grep bemenetre kldtk, majd annak a kimenett a
less program bemenetre. A less pedig az eredmnyt a szoksos kimenetn, a
kpernyn jelentette meg. A less egy szveges-fjl nzeget. A megtekints
llapotbl, a "q" billentyvel lphetnk ki belle (quit).
Egy program bemenetre, a "<" jellel is irnythat egy fjl tartalma. A fenti
eredmny a kvetkez mdon is elrhet.
$ grep Budapest < uj-adat.txt | less
Amivel mg nem foglalkoztunk, az a szoksos hiba kimenet s annak
tirnytsa. A programok hibakimenete alaphelyzetben ugyanaz, mint a
szoksos kimenet, azaz a kperny. Tegyk fel, hogy nemltez fjlt akarunk
megnyitni a cat paranccsal.
$ cat szemlyes-adatok
cat: szemlyes-adatok: Nem ltez

fjl vagy knyvtr

Elfordulhat olyan, hogy a hiba zeneteket, egy fjlba szeretnnk irnytani. A


hiba kimenetre ebben az esetben, a "2>" mdon hivatkozhatunk. A norml
kimenetre ez alapjn gy is lehet hivatkozni "1>". De ez azonos a ">"
hivatkozssal. gy is nevezhetjk ket, hogy egyes s kettes kimenet. Vagy
norml kimenet s hiba kimenet. A szoksos bemenetet pedig egyszeren csak
bemenetnek. Lssunk egy pldt arra, ha a hibazeneteket egy "hibk" nev
fjlba szeretnnk gyjteni. Ekkor a meglv "hibk" nev fjl, fellrdik. Ha ezt el
akarjuk kerlni s mintegy gyjteni bele a hibazeneteket, akkor a mr ismert
mdon tehetjk meg azt.
$ cat szemlyes-adatok 2>> hibk
Ha a hibakimenetet a /dev/null -ba irnytjuk, ezzel nem rdik ki sehov sem.
$ cat szemlyes-adatok 2> /dev/null
Lehetsg van arra is, hogy a norml kimenetet s a hiba kimenetet egyszerre
kezeljk. Az els plda a norml kimenetet egy fjlba a hiba kimenetet pedig egy
msik fjlba irnytja. A msodik pldnl, pedig a hibkat egy fjlba a norml
kimenetet pedig egy kvetkez, az esetnkben a less program bemenetre adja
tovbb.
$ cat szemlyes-adatok > norml 2>> hibk
$ cat szemlyes-adatok 2>> hibk | less

Bash Shell Programozs

20. oldal

Az is elfordulhat, hogy egy kimenetet fjlba is szeretnnk irnytani s egy msik


helyre is tirnytani. Erre a tee program hasznlhat. A kvetkez sor az
"eredmeny" nev fjlba rja a norml kimenetet, de a less programmal is
megjelenti.
$ cat uj-adat.txt | grep Budapest | tee eredmeny | less
Ha a tee utni rszt szabadon hagyjuk, akkor a fjlba is r s a kpernyn is
megjelent.
$ cat uj-adat.txt | grep Budapest | tee eredmeny
Lehet kt fjlba is ratni a kimenetet s a hibakimenetet pedig eltte egy
harmadik fjlhoz hozzfzetni. Illetve ezeket lehet kombinlni.
$ cat uj-adat.txt

2>> hibafile | tee eredmeny > eredmeny2

Nha pedig arra lehet szksgnk, hogy a hiba zenet is a norml kimenetre
menjen. Erre az esetre van lehetsg, hogy az adott kimenetet a msik kimenetre
irnytsuk.
Az ltalunk rt scriptek esetn ugyangy hasznlhatak a szoksos ki s
bemenetek tirnytsai. Csupn kt dologgal kell tisztba lennnk. Egyik, hogy
az echo parancs mindig a norml kimenetre r, vagyis, ha a scriptnk
futtatsakor annak norml kimenett tirnytjuk, akkor a scripten belli sszes
echo parancs arra a helyre r. az albbi esetben a script sszes echoja a fjlba
rdik.
$ sajatscript > fajl
A msik pedig, hogy a read parancs ehhez hasonlan mindig a szoksos
bemenetrl olvas. Ami alaphelyzetben a billentyzet. Ezrt tudunk vele adatot
bevinni. De ha a scriptnk bemenetre irnytunk valamit, akkor a scripten belli
sszes read parancs onnan olvas. Ha nincs ott tbb adat, akkor res, 0
hosszsg stringet olvas be. A lenti esetben a script beli read-ok mind a
adatfile-t tovbbt cat parancs kimenetrl vrja az adatot.
$ cat adatfile | sajatscript
Termszetesen ezek a szablyok elgg megktik a keznket egy interaktv script
be s kimenetnek kezelse tern. Erre is nagyszer gygymdot knl az Xdialog
program, ha a dialgust az echo s a read parancsok helyett ezzel vezreljk le.
Ebben az esetben a kimenet-tirnytsok szabadon hasznlhatak.
A scriptnkbl a hibakimenetre is tudunk rni. A norml kimenetet "1>", a
hibakimenetre "&2" irnytjuk.Az ilyen echo, a hibakimenetre r.
echo "Hiba szveg" 1>&2

Bash Shell Programozs

21. oldal

Valamint mint minden programnak, a scriptnknek is van egy visszatrsi rtke,


ami a $? vltozban rhet el, kzvetlenl az utn, hogy a script befejezte a
futst. Hogy ennek az rtke mennyi legyen, a scripten bell az exit <rtk> vagy
exit $x utastssal hatrozhatunk meg. De ez az rtk, csak egy 0 s 255 kztti
szm lehet.
Regulris kifejezsek, metakarakterek.
Most ismerkedjnk meg a windowsbl br ismert, de itt mgis mskppen
mkd dologgal, a shell ltal ismert regulris kifejezsekkel. Emlthetjk ket
metakaraktereknek is, vagy egyszeren helyettest karaktereknek.
Windows-ban s DOS-ban a "*" s a "?" karakterek ismertek. Linuxban tbb
lehetsg is rendelkezsnkre ll.
A "$" jellel a sor elejre,
a "^" jellel pedig a sor vgre hivatkozunk.
A "." jellel, egy darab tetszleges karakterre, (mint dos s windows alatt a "?" jel,)
A "*" jellel pedig a megszokott mdon, tetszleges szm, tetszleges karakterre
hivatkozunk.
A "[" s "]" jellel, a karakterek egy csoportjra tudunk hivatkozni.
[0-9] : Brmilyen szm karaktert jelent.
[A-Z] : Brmilyen nagybets karaktert jelent.
[skZ4o] : Brmelyik karaktert jelenti a felsoroltak kzl.
rdemes mg meg emltennk, hogy kifejezseken bell a TAB-ra a "\t" a
sorvgre pedig a "\n" mdon hivatkozhatunk
Fontos megjegyezni, hogy egykt program egy-egy regulris kifejezst mskppen
hasznl, vagy mskppen jell. Ezrt ha valami nem jl mkdik, akkor nzzk t
az adott program man-jt. Ilyen pl. a grep program "*" metakarakter rtelmezse,
mely jelentse a shellben, "brmennyi szm, brmilyen karakter". A grep-ben
pedig, "brmennyi szm, a "*" jel eltt ll karakter". Azaz a "a*" jelentse a
shell-ben: egy "a" karakterel kezdd brmilyen string. Mig ugyanennek a
jelentse grep-ben: Az "a" karakter brmennyiszer-i ismtldse. Pl. "a" "aaa" vagy
"aaaaaaa". Mivel a grep a "." meatakaraktert ugyangy rtelmezi mint a shell,
azaz egy darab brmilyen karakter, ezrt a shell beli "*" regulris kifejezs,
grep-es megfelelje a ".*", azaz a "brmilyen karakter brmennyiszer-i
ismtldse".
A kd formzsa
Mivel rvidesen mr valdi scripteket fogunk rni, ezrt ismerkedjnk meg
azokkal a lehetsgekkel, amikkel olvashatbb s t tekinthetbb tehetek a
scriptjeink.
Az egyik alapvet dolog, hogy a logikailag sszetartoz rszeket megfelel szm
res sorral vlasztjuk el egymstl. Ez a fggleges tagols. A msik, a vzszintes
tagols, ahol az program vgrehajts sorni ms-ms mlysgben lv sorokat,
bentebb kezdjk mint az elzt. Ezzel az elgazsok s ciklusok tehetk t
tekinthetbb.

Bash Shell Programozs

22. oldal

A harmadik dolog a kommentek hasznlata. A sorban a "#" jel utni rsz, mr


nem hajtdik vgre. Ha ez az els karakter, akkor rtelem szeren az egsz sor
kimarad a vgrehajtsbl.
read a; echo $a
# a tovbbi szvegrsz nem hajtdik vgre.
# read a; echo "$a" ez a sor egyltaln nem hajtdik vgre.
Mr ismerjk a "\" jelet s hatst. Ezzel a sor vgn lv sorvgjel is
hatstalanthat, vagyis ha a sor vgn egy "\" szerepel, akkor a shell gy veszi,
hogy nem trtnt uj sor kezdse, vagyis a kvetkez sort is az elz folytatsaknt
hajtja vgre. Ebben az esetben fontos, hogy a "\" jel utn mr nem llhatnak
karakterek, mg szkzk sem, illetve abbl egy igen. Ebbl ered, hogy ha az ilyen
eltrt sorokban kommenteket akarunk elhelyezni, akkor a "\" s a "#" kztt,
maximum egy space lehet.
A sorvgjel \-el trtn levdse, akkor is hasznos lehet, ha olyan hossz
parancssorokat hasznlunk, amik esetleg nem frnek ki egy sorba. (Mr mint
nem a terminlba, mert ott ez nem okoz gondot, hanem a dokumentumba, ahol a
pldk szerepelnek.)
Az albbi parancssor,
$ cat file.txt | grep Budapest | cut -d\; -f 2-4 | tr '[A-Z]'
'[a-z]' > ujfile.txt
albbi mdon trtn lersa ugyan azt jelenti.
$ cat file.txt |\
grep Budapest |\
cut -d\; -f 2-4 |\
tr '[A-Z]' '[a-z]'\
> ujfile.txt
A megtrt parancssort a kdban TAB-okkal is bentebb helyezhetjk, a futst ez
nem zavarja. De ha egy ilyen szakaszt kimsolunk a dokumentumbl a vglapon
keresztl, egy terminl parancssorba, ott hibsan fog lefutni.
$ cat file.txt | grep Budapest | \
cut -d\; -f 2-4 | tr '[A-Z]' '[a-z]' \
> ujfile.txt
A parancssor-trs ellenkezje is megoldhat, azaz tbb parancsot is rhatunk
eggyetlen sorba. Tbb parancs is rhat egyetlen sorba, a ";" jellel elvlasztva.
$ echo -n "Mi a neve ?"
$ read nev
$ echo "dvzlm $nev."
Ezt rhatjuk egyetlen sorba is.
$ echo -n "Mi a neve ?"; read nev; echo "dvzlm $nev."

Bash Shell Programozs

23. oldal

4. Adatfolyam szrk s szerkesztk


Ebbe a rszben nhny egyszerbb szveg s szveges fjlt manipull lehetsget
ismernk meg. Ezekre mint szrkre is szoktak hivatkozni. Mivel a programok
egybknt csak a legszksgesebb mrtkben vannak ismertetve, rdemes az
lesben trtn hasznlatuk eltt a man-t elolvasni, br ez nem felttele annak,
hogy az itt lertak megrthetek legyenek.
Hozzunk ltre egy fjlt az albbi adatsorokat belerva, adatok.dat nven. Az egyes
adatsorokat, rjuk egyetlen sorba s ne hagyjunk kzttk res sorokat.
Sorszm;Nv;Szletsi hely;Szletsi id ;Anyja neve;Gyermekkori
lenyneve;Lakhely;Nem;Csaldi llapot;Gyermekek szma
1;Kovcs Gbor;Budapest;1973 Janur 14;Mardin
va;;Budapest;frfi;hzas;2
2;Brdos Pter;Szombathely;1965 Mrcius 24;Kele
Katalin;;Pcs;frfi;fggetlen;0
3;Szeghalmin va;Budapest;1957 Februr 05;Pteri Eszter;Konkoly
va;Cegld;n ;hzas;1
4;Almosn Szab Renta;Kecskemt;1976 December 20;Ostoros
Sra;Szab Renta;Budapest;n ;fggetlen;1
5;Izs Pter;Znka;1953 November 09;K vri
Piroska;;Budapest;frfi;elvlt;3
Itt csak a legegyszerbb szrsi s karakter cserlsi lehetsgekkel fogunk
megismerkedni.
grep , cut
A grep programot mr ismerjk. Ez is egy szr, amely a bemenetre rkez sorok
kzl csak azokat kldi tovbb, amelyek a megadott felttelnek megfelel.
Listzzuk ki a "Budapest" szt tartalmaz sorokat.
$ cat adatok.dat | grep Budapest
1;Kovcs Gbor;1973 Janur 14;Mardin va;;Budapest;frfi;hzas;2
3;Szeghalmin va;1957 Februr 05;Pteri Eszter;Konkoly
va;Cegld;n ;hzas;1
4;Almosn Szab Renta;1976 December 20;Ostoros Sra;Szab
Renta;Budapest;n ;fggetlen;1
5;Izs Pter;1953 N
A grep -v kapcsoljval, megfordthatjuk a felttelt, azaz azok a sorok listzdnak,
amelyek nem felelnek meg a felttelnek.

Bash Shell Programozs

24. oldal

$ cat adatok.dat | grep -v Budapest


0;Nv;Szletsi id ;Anyja neve;Gyermekkori
lenyneve;Lakhely;Nem;Csaldi llapot;Gyermekek szma
2;Brdos Pter;1965 Mrcius 24;Kele
Katalin;;Pcs;frfi;fggetlen;0
3;Szeghalmin va;1957 Februr 05;Pteri Eszter;Konkoly
va;Cegld;n ;hzas;1
A grep alaphelyzetben mint a linux is, kis s nagybet rzkeny. Ezt a grep-nl az
-i kapcsolval felfggeszthetjk.
$ cat adatok.dat | grep pter
gy nincs tallat.
$ cat adatok.dat | grep -i pter
2;Brdos Pter;1965 Mrcius 24;Kele
Katalin;;Pcs;frfi;fggetlen;0
5;Izs Pter;1953 November 09;K vri
Piroska;;Budapest;frfi;elvlt;3
gy viszont azonosnak veszi a kis s a nagy betket.
A -w kapcsolval, csak a teljes szavakra trtn illeszkedst veszi megfelelsnek.
Az -x kapcsolval lehetsg van egsz sort is megfeleltetni.
Tegyk fel, hogy az egy gyermekes nk nevre van szksgnk. Ekkor az
eredmnyt tovbb kell kldennk tbb szrsen is.
$ cat adatok.dat | grep ';n ;' | grep 1
3;Szeghalmin va;1957 Februr 05;Pteri Eszter;Konkoly
va;Cegld;n ;hzas;1
4;Almosn Szab Renta;1976 December 20;Ostoros Sra;Szab
Renta;Budapest;n ;fggetlen;1
Az adatokat, akrmennyi szrsen tkldhetjk. De mint emltettk, neknk
csak az rintettek nevre van szksgnk. Erre a cut programot fogjuk hasznlni.
Ebben az adat fjlban, az adatmezk szepartoraknt a ";" karakter szerepel. Ezt
kzlnnk kell a cut-al a -d kapcsoljval. Ezutn meg kell adnunk, hogy az
adatmezk kzl, hnyadikra van szksgnk. Ezt az -f kapcsoljval tehetjk
meg. Ne felejtsk levdeni a ";" karaktert, mert klnben nem tudja majd a shell
rtelmezni a parancssort, ugyan is az ez a jel utn kvetkez rszt, jabb
parancssornak rtelmezi.
$ cat adatok.dat | grep ';n ;' | grep "\;1$" | cut -d\; -f2
Szeghalmin va
Almosn Szab Renta

Bash Shell Programozs

25. oldal

Ttelezzk fel, csak az egyik egyn adataira lenne szksg. Hogyan lehetne
egyszeren megcsinlni, hogy itt vlasztani lehessen a felsoroltak kzl s annak
az egynek megjelenteni az sszes adatt ? Ehhez ne csak a nevet, hanem az els
adatoszlopot, az index mezt, ami a mi egyszer esetnkben egyben az adatsor
sorszmt is jelli. Ezutn krjnk egy vlasztst a felhasznltl s annak
alapjn az adott szemly sszes adatt jelentsk meg. Ez nem is olyan bonyolult,
mint gondolnnk.
$ cat adatok.dat | grep ';n ;' | grep "\;1$" | cut -d\; -f 1-2
3;Szeghalmin va
4;Almosn Szab Renta
$ echo -n "Hnyas sorszm szemly adatai kellenek ?"
$ read v
$ cat adatok.dat | grep "^$v\;"
3;Szeghalmin va;1957 Februr 05;Pteri Eszter;Konkoly
va;Cegld;n ;hzas;1
Amennyiben a bement nem egy, hanem tbb sorbl ll, akkor minden sor adott
mezje tovbb addik. gy egy adatfjlbl egsz mezk vihetk t egy msik fjlba.
Tegynk is egy prbt, br ne kldjk az eredmnyt fjlba.
$ cat adatok.dat | cut -d\; -f 2-4
Nv;Szletsi id ;Anyja neve
Kovcs Gbor;1973 Janur 14;Mardin va
Brdos Pter;1965 Mrcius 24;Kele Katalin
Szeghalmin va;1957 Februr 05;Pteri Eszter
Almosn Szab Renta;1976 December 20;Ostoros Sra
Izs Pter;1953 November 09;K vri Piroska
Nem csak egy mezt, hanem tbb mezt is lekrhetnk. Az "-f 1,3,4" vagy az "-f
2-4" mdon. Az elbbi esetben az 1-es, 3-as s 4-es mezk, az utbbi esetben
pedig a 2-tl a 4. mezk kerlnek tovbb adsra.
A cut programmal nem csak adatmezket vlaszthatunk ki, hanem megadott
pozcij karaktereket is. Br ennek ebben a pldban nincs rtelme, de ha az
eredmnybl, tegyk fel, csak a 6-8-dik karakterekre lenne szksgnk, ez is
megoldhat.
$ cat adatok.dat | grep ';n ;' | grep \;1$ | \
cut -d\; -f2 | cut -c 3-7
eghal
mosn
Mivel kt soros volt az utols cut bemenete, ezrt mindkt soron vgrehajtotta. A
tbb soros bemenet sztbontsa is megoldhat ksbb bemutatand
technikkkal.
A "-c 2,4,7" mdszerrel nem egyms melletti karakterek is megadhatk.

Bash Shell Programozs

26. oldal

sort, join
Ezeket az adat fjlokat idnknt rdemes karbantartani. Esetleg egy msik
adatbzisfjlt szeretnnk mr egy meglvbl kszteni, de ms elrendezssel.
Ezekhez alkalmas lehetsgeket fogunk most megvizsglni.
Egy szveges adatbzis fjl rendezshez a sort parancs hasznlhat. Tegyk fel,
hogy a adatok.dat fjlunkat szeretnnk rendezni a nevek szerint abc sorrendbe.
Ezt az albbi mdon tehetjk meg.
$ cat adatok.dat | sort -t ';' +1 > adatok-rendezett.dat
A -t kapcsol utn kell megadni a fjlban a mezhatrol karaktert. a "+" utn
van megadva, hogy hnyadik mez szerint rendezzen. Az els mez, a nulladik
mez. Vagyis, ha a 3. mez szerint akarunk rendezni, akkor "+2"-t kell rni. Ezt a
-k kapcsolval lehet elkerlni. (Ez az els adatsort is, ami a mez neveket
tartalmazza, belekeveri a valdi adatsorok kz. A problma orvosolhat, de most
nem trnk ki r.)
Tovbbi lehetsgek a finomtsra kvetkez kapcsolk:
-k szm Ha ezzel, nem pedig a +szm kapcsolval hivatkozunk a mezre, akkor az
els mez sorszma nem 0, hanem 1.
-d Rendezsnl figyelmen kvl hagyja a klnleges karaktereket s rs jeleket.
-f Klnbsget tesz a kis s nagybetk kztt. (Teht alaphelyzetben nem tesz
klnbsget.)
-n Numerikus adatok szerint rendez. Ez a tbbjegy szmoknl lnyeges.
-M Az els hrom karaktert, hnapok neveiknt rtelmezi s rendezi.
-r Fordtott rendezsi sorrendet eredmnyez.
-u Trli a teljesen megegyez sorokat.
Lttuk, miknt lehet a cut programmal. egy adatfjlbl, teljes mezket kinyerni,
vagy msik fjlba helyezni. Most nzzk, mikppen lehet kt adatfjlt egyesteni.
Erre a join parancs alkalmas. Fontos, hogy a kt adatbzisnak azonos kulcs
szerint rendezettnek kell lennie. Eltte mindkt adatbzist az egyik mez szerint
rendezzk. Ha az egyik adatbzis a neveket s cmeket tartalmaz, a msik pedig
neveket s telefonszmokat, akkor rendezzk mindkettt a neveket tartalmaz
mez szerint. Az egyests sorn, a mindkt fjl lltal tartalmazott neveknl, a sor
mr hrom mezbl fog llni. nv, cm, telefonszm.
$ join -t ';' nev-cm.txt nev-tel.txt > egyeslt.txt
A -t kapcsolval a mezhatrol karaktert adjuk meg. Ha nem az els mez
alapjn trtnt a rendezs s trtnik az egyests, azt a -j kapcsolnl adhatjuk
meg. A -j kapcsol utn kzvetlenl 1-es vagy 2-es szm kell szerepeljen. Ebbl a
kvnt mkds rdekben 1-est rjunk. Ez utn kell megadni, hnyadik mez
szerint trtnjen az egyests. Felttelezve, hogy a fenti kt fjl hrom mezbl ll
s a msodik a nv mez akkor gy kell vgrehajtani.
$ join -t ';' -j1 2 nev-cm.txt nev-tel.txt > egyeslt.txt

Bash Shell Programozs

27. oldal

tr, sed
Most nzznk olyan szrket, amikkel karakterek cserlhetk fel, vagy
tvolthatk el.
A legegyszerbb a tr program. Elbb hasznlati mdjt, majd nhny egyszer
pldt mutatok.
$ b=`echo "$a" | tr "cdk" "rht"`
Ez a sor, az $a vltoz rtkben, a "c" karaktert "r"-re, a "d"-t "h"-ra, a "k"-t pedig
"t"-re cserli, majd az j karaktersort a $b vltozba rja.
A -d kapcsolval trli a szvegbl a megadott, ebben az esetben a "c" s "d"
karaktereket.
$ b=`echo "$a" | tr -d "cd"`
Az albbi mdon a nagybetket lehet kisbetkre cserlni.
$ b=`echo $a | tr '[:upper:]' '[:lower:]'`
gy pedig egy fjlban lehet a tab s sorvg karaktereket talaktani.
Ez az egyik fjlt a msikba msolja, de kzben a TAB-okat ";" karakterre cserli. (
ltalban a szveges adatbzisok, az adatmezk elvlasztsra, e kett kzl
valamelyiket szoktk hasznlni.)
$ cat fajl | tr '\t' ';' > masikfajl
gy pedig a sorvg jelek tvolthatk el egy fjlbl.
$ cat fajl | tr -d '\n' > masikfajl
Ez pedig a ";" mezhatrol karaktereket cserli sorvgjelre, gy a mezket
kln-kln sorba helyezi. Ksbb szksgnk lessz erre a megoldsra.
$ cat fajl | tr ';' '\n' > masikfajl
Az -s kapcsolval az ismtldsek tvolthatk el. Az albbi sor a felesleges
space-ket tvoltja el
$ echo "Kovcs
Bla
Budapest." | tr -s ' '
Kovcs Bla Budapest.
De ugyan ezt az eredmnyt adja a tr -s '[:space:]' is.
Az -s kapcsol, az egyms utn kvetkez, az argumentumban megadott tpus
karaktert von ssze, egyetlen egybe.
A tr 1-1 karaktert tud kezelni. Amennyiben tbb karakterbl ll karakter
sorozatot szeretnnk egy msik, akr a lecserlendvel nem is azonos hosszsg
karaktersorozatra cserlni, ehhez a sed program hasznlhat. Ehhez gy
hasznljuk. A regulris kifejezsek termszetesen a sed-nl is hasznlhatk. A
sed egy komoly program, rengeteg lehetsggel. Kln knyvet is lehetne rla rni,
ezrt n most nem is mennk nagyon bele, csupn nhny pldt mutatok.

Bash Shell Programozs

28. oldal

Ez a bemenetre rkez adatsorban, az ssze kif1 karaktersort, a kif2


karaktersorra cserli.
sed s/kif1/kif2/g
Csak a sor elejn szerepl kifejezseket cserli ki.
sed s/^kif1/kif2/g
Csak a sorvgi kifejezseket cserli ki. A $ jel mint regulris kifejezs rsze, mint
metakarakter, nem tvesztend ssze a vltozk elejn szerepl jellssel.
sed s/kif1$/kif2/g
Ez pedig minden sor elejre az adott kifejezst szrja be.
sed s/"^"/"kif"/g
Hogyan lehet egy fjl, vagy egy bemeneten rkez adatfolyam kvnt sorszm
sort megkapni.
sed -n "$sorszam p"`
Termszetesen az adatbzis kezels sokkal sszetettebb problmkat vet fel s a
megoldsukhoz is sszetettebb megoldsok szksgesek. Az itt bemutatott pldk
csak azt a clt szolgljk, hogy az alapvet lehetsgek bemutatsra kerljenek.
Xdialog plda:
Ill mdon fejezzk be ezt a rszt is egy Xdialog-os pldval.
Erre vlasszuk a timebox-ot, mely hrom spin-t, azaz olyan kis beviteli
lehetsget tartalmaz, amiben numerikus rtkek llthatk be. Kezdeti rtke az
aktulis id, ra, perc s msodperc rtke. Nyugodtan lltgathatjuk, ez nem
vltoztatja meg a gpnk idbelltst. Arra kln kellene a kdban root
jogosultsggal utastani. A doboz visszatrsi rtke a belltott id, ":"-al
elvlasztva az ra a perc s a msodperc. Ezt cut-al kln-kln vltozkba
tesszk s egy infobox-al kiratjuk, amit 5 msodpercre jelentnk meg s letiltjuk
az OK nyomgomb megjelenst, valamint az ablak bezrhatsgt is. A
kvetkez kdot helyezzk egy futsi joggal rendelkez, #!/bin/bash kezdet
fjlba.

Bash Shell Programozs

29. oldal

-------------------------------------------------------------------------#!/bin/bash
# 4. fejezet 1. script
ido=`Xdialog --stdout --title "Shell Programozs" \
--timebox "n szerint mennyi a pontos id ?" 0 0`
ora=`echo $ido | cut -d: -f 1`
perc=`echo $ido | cut -d: -f 2`
mp=`echo $ido | cut -d: -f 3`
Xdialog --no-buttons --no-close \
--title "Shell Programozs " \
--infobox "n szerint, $ora ra,\n$perc perc, \
s $mp msodperc van ." 0 0 5000
-----------------------------------------------------------------------------------A timebox esetben az --stdout biztostja, hogy az eredmnye ne a hiba
kimenetre, hanem a norml kimenetre menjen. Az infobox esetben pedig a
--no-buttons kapcsol letiltja a gombok megjelenst, a --no-close pedig
lehetetlenn teszi az ablak bezrst. Az infobox lltal megjelentett szvegben a
"\n" karakterek utastjk sortrsre a szveg megjelentsekor. A legvgn
tallhat, harmadik szm pedig azt hatrozza meg, mennyi id mlva zrdjon be
magtl az ablak, ezredmsodpercben kifejezve.

Bash Shell Programozs

30. oldal

5. Felttel vizsglat, feltteles vezrlsi szerkezetek


Ebben a rszben az egsz scriptnk struktrjt s mkdt leginkbb
maghatroz technikkkal, az elgazsokkal s ciklusokkal ismerkednk meg.
Ezek, nagy rsze, klnfle felttelvizsglatokra pl.
test
Egy felttel vizsglatra hogy az igaz-e, a test parancsot hasznljuk. Ezt nem
nmagban, hanem egy elgazs vagy ciklus szerves rszeknt hasznljuk.
Nhny egyszerbb vizsglat kvetkezik.
Fjlok, knyvtrak vizsglata.
test -d file
Igaz ha a file ltezik s
test -e file
Igaz ha a file ltezik.
test -f file
Igaz ha a file ltezik s
test -r file
Igaz ha a file ltezik s
test -w file
Igaz ha a file ltezik s
test -x file
Igaz ha a file ltezik s

knyvtr.

szablyos fjl.
olvashat.
rhat.
vgrehajthat.

Szveges kifejezsek vizsglata.


test -z string
Igaz ha a string 0 hosszsg.
test -n string
string Igaz ha a string nem 0 hosszsg.
test string1 = string2
Igaz ha a stringek megegyeznek.
test string1 != string2
Igaz ha a stringek nem egyeznek meg.
Numerikus rtkek vizsglata.
test numkif1 OP numkif2
A kvetkez opertorokat (OP) ismeri.
-eq egyenl
-ne nem egyenl
-lt kisebb mint
-le kisebb vagy egyenl
-gt nagyobb mint
-ge nagyobb, vagy egyenl
A numerikus kifejezs negatv is lehet, de egsz szmnak kell lennie.

Bash Shell Programozs

31. oldal

A test ismer egy specilis numerikus kifejezst, mely a string hosszt jelenti.
-l szveg
Egy 5 karakteres szvegrsz esetn az albbi vizsglat igazknt
rtkeldik ki.
test 5 -eq -l kif
A vizsglt felttel eredmnyt neglja az el rt "!" jel. Azaz, ha igaz, akkor
hamiss, ha pedig hamis, akkor igazz fordtja.
Teht hamis lesz a
test ! 5 -eq 5
s igaz a
test ! 2 -eq 5
Tbb felttel vizsglata is sszekapcsolhat az -a (and) "s" illetve a -o (or) "vagy"
logikai opertorokkal.
test $nev = "Gbor" -a $kor -eq 30
Ez akkor bizonyul igaznak, ha a $nev rtke "Gbor" s a $kor rtke pedig 30
test $kor -le 17 -o $kor -ge 61
Ez akkor igaz, ha a $kor rtke, a 18 s 60 kztti intervallumon kvl esik.
If; then ;else; fi
Az elgazsokat, feltteles vezrlsi szerkezetknt is szoktk emlteni. Ebbl kettt
vizsglunk meg.
Az if elgazs szerkezete a kvetkezkppen nz ki.
if test <felttel>
then
<utastsok>
else
<utastsok>
fi
A then s az else kztti utastsok akkor hajtdnak vgre, ha iga a kifejezs, az
else utniak pedig akkor, ha hamis.

Bash Shell Programozs

32. oldal

Az if elgazsok egymsba is gyazhatk.


if test <felttel1>
then
<utastsok1>
if test <felttel2>
then
<utastsok2>
else
<utastsok3>
fi
else
<utastsok4>
if test <felttel3>
then
<utastsok5>
else
<utastsok6>
fi
fi
Ez a szerkezet, ha a felttel1 igaz, akkor vgrehajtja az utastsok1-et, majd
megvizsglja a felttel2-t s ha az is igaz, akkor vgrehajtja az utastsok2-t, ha
nem igaz akkor az utasts3-at. Ha a felttel1 nem igaz, akkor vgre hajtja az else
utni rszt, azaz az utastsok4-et, majd megvizsglja a felttel3-at, ha az igaz,
akkor vgrehajtja az utastsok5-t, ha nem igaz akkor az utastsok6-ot.
Az utastssor TAB-okkal trtn rendezse, nem vletlen a knnyebb
tlthatsgot szolglja. A struktrlisan egy szintbe, mlysgbe tartoz
szakaszok eltt, azonos szm TAB van.
Vizsgljunk meg nhny konkrt pldt is. Hozzunk ltre egy #!/bin/bash
kezdet fjlt s adjunk neki futsi jogot. A tovbbi pldkat ebbe rjuk s az
eredmnyt a script futsakor tekinthetjk meg. Tltsk fel az albbi, kt vonal
kztti tartalommal.
Itt mr a magyarzatok egy rszt kommentekben adom meg.

Bash Shell Programozs

33. oldal

------------------------------------------------------#!/bin/bash
# 5.fej. 1.script
clear

# kperny

trls

# Megszmolom, hny adatsor van az adatbzisomban,


# trlm az eredmnyb l a szmolst bezavar space-ket,
# kivonok bel le egyet, mert az els , a 0-dik,
# ami a mez k neveit tartalmazza.
let db=`cat adatok.dat | wc -l | tr -d ' ' `-1
# Bekrem, hanyas sorszm szemly legyen feldolgozva.
echo -n "Adja meg a feldolgozand szemly \
sorszmt (1-$db) : "; read a
# Le ellen rizzk megfelel -e a sorszm amit a felhasznl adott.
# test akkor igaz, ha a felhasznl ltal adott szm,
# kisebb 1-nl, vagy nagyobb az adatbzisban lv
# szemlyek szmnl.A then s a fi kztti rsz
# csak ekkor hajtdik vgre.
if test $a -lt 1 -o $a -gt $db
then
# A script tjkoztatja, a felhasznlt,
# hogy rossz szmot adott meg,
# vr egy enter letsig, majd kilp a scriptb l.
echo "n rvnytelen adatot adott meg ! "
echo "A script a futst befejezi. Krem nyomjon entert."
read x
# az enter letsig felfggeszti
#a script futst
exit
# azonnal kilp a scriptb l
fi
# A megadott sorszm szemly teljes adatsornak bekrse.
# "^$a\;" jelentse: ha a sor elejn tallhat az $a rtke,
# utna pedig egy ";" jel kvetkezik.
# Azaz ha az els mez rtke azonos $a-val.
szem=`cat adatok.dat | grep "^$a\;"`
# Adatmez inek kln-kln vltozba helyezse.
nev=`echo $szem | cut -d\; -f2`
szulido=`echo $szem | cut -d\; -f3`
anyneve=`echo $szem | cut -d\; -f4`
leanyneve=`echo $szem | cut -d\; -f5`
lakhely=`echo $szem | cut -d\; -f6`
nem=`echo $szem | cut -d\; -f7`
csalall=`echo $szem | cut -d\; -f8`
gyermsz=`echo $szem | cut -d\; -f9`

Bash Shell Programozs

34. oldal

# a date megadja a mai dtumot s id t,


# a cut-al kinyerjk bel le az vszmot.
datum=`date | cut -d'.' -f1`
# a $szulido-bol kivesszk a szletsi vet.
szulev=`echo $szulido | cut -d' ' -f1`
let kor=$datum-$szulido
# kiszmoljuk az alany letkort.
# Meg vizsgljuk, az alany hzas-e,
# ha igen akkor a then s az else,
# ha nem, akkor az else s a fi kztti rsz hajtdik vgre.
if test $csalall="hzas"
then
# Ez mindenkppen kirdik:
echo -n "$nev, $kor ves, \
$lakhely-i lakos, hzassgban l , "
# Ha a gyermekek szma 0 akkor a then,
# egybknt az else utni rsz hajtdik vgre.
if test $gyermsz -eq 0
then
echo "gyermektelen $nem."
else
echo "$gyermsz gyermekes $nem."
fi
else
# Ez mindenkppen kirdik:
echo -n "$nev, $kor ves, $lakhely-i $nem."
# Ha a gyermekek szma 0 akkor a then,
# egybknt az else utni rsz hajtdik vgre.
if test $gyemek -eq 0
then
echo "Csaldi llapota $csalall, nincs gyermeke."
else
echo "Csaldi llapota $csalall, $gyersz gyermeke van."
fi
fi
------------------------------------------------------jdonsgok:
clear
Trli a kpernyt.
tr -d ' '
A tr -d kapcsolja esetn elg csak egy kifejezst meg adni, mert az abban
megadott rszeket trli. Az esetnkben a szkzket.

Bash Shell Programozs

35. oldal

read x
Felfggesztjk a script futst, amg a felhasznl knyelmesen el nem olvassa
az informcit, majd le nem nyomja az enter billentyt. A read x -et hasznljuk,
vagyis krjk egy vltoz feltltst a felhasznltl, de ennek nincs clja, csak
az, hogy az enter megnyomsig felfggesszk a futst.
exit: Hatsra azonnal befejezi a futst a script.
Case; esac
Most egy jabb elgazs tpussal fogunk meg emlkezni a case-el.
A szerkezete a kvetkez.
case $vltoz in
rtk1)
<utastsok1>
;;
rtk2)
<utastsok2>
;;
rtk3)
<utastsok3>
;;
rtk4)
<utastsok4>
;;
*)
<utastsok5>
;;
esac
Br a fenti feltteles vgrehajtsok, if elgazsokkal is megoldhatk lennnek,
mint lthat, ez sokkal ttekinthetbb s elegnsabb. Fontos hogy az
utastsokat kt ";" jellel, azaz ";;" mdon zrni. Ez egy break-et vlt ki, azaz a
tovbbi vizsglatokon nem megy vgig a program, hanem kilp a case-bl. Ez
gyorstja a vizsglatot. Ha csak nem ppen az a clunk, hogy a tovbbi eset is ki
rtkeldjn. Az utols, *) meghatrozs utni <utastsok5> akkor hajtdik
vgre, ha egyik eltte lv felttel sem teljeslt. Tulajdonkppen hasonlt a if else
ghoz.
A case segtsgvel, knnyen ltrehozhatunk men szer mkdst is a scriptben.
Nzzk meg a case mkdst egy ilyen pldn keresztl. Hozzunk ltre egy fjlt,
msoljuk az kt szaggatott vonal kztti rszt bele, majd adjunk r futsi jogot.

Bash Shell Programozs

36. oldal

-------------------------------------------------------#!/bin/bash
# 5.fej. 2.script
clear
# Kirom a f ment.
echo
echo "Krem vlasszon a menpontok el tti szm bevitelvel."
echo "--------------------"
echo "1.Fjl"
echo "2.Szerkeszts"
echo "3.Eszkzk"
echo "4.Belltsok"
echo "5.Kilps"
read v

# Bekrem az els

vlasztst.

# Az els vlasz vizsglata:


case $v in
# a kls case eleje. (f men)
1)
# Amennyiben a f men 1. pontjt vlasztotta.
clear
# Kirom, az els alment.
echo "Krem vlasszon a menpontok eltti szm bevitelvel."
echo "--------------------"
echo "1.Megnyits"
echo "2.Ments"
read v
# Bekrem a msodik vlasztst.
# Az els almen vlasznak vizsglata.
case $v in
# Az els , bels case. (1.almen)
1)
# Amennyiben a f men 1. pontjnak,
# 1. almenjt vlasztotta.
echo "n egy mr meglv dokumentumot akar kinyitni."
;;
2)
# Amennyiben a f men 1. pontjnak,
# 2. almenjt vlasztotta.
echo "n menteni szeretn a dokumentumot."
;;
esac
;;

Bash Shell Programozs

37. oldal

2)
# Amennyiben a f men 2. pontjt vlasztotta.
clear
# Kirom, a msodik alment.
echo "Krem vlasszon a menpontok eltti szm bevitelvel."
echo "--------------------"
echo "1.Msols"
echo "2.Kivgs"
echo "3.Beilleszts"
read v
# Bekrem a msodik vlasztst.
# Az msodik almen vlasznak vizsglata.
case $v in
# A msodik, bels case. (2.almen)
1)
# Amennyiben a f men 2. pontjnak,
#1. almenjt vlasztotta.
echo "n kivgott egy rszt."
;;
2)
# Amennyiben a f men 2. pontjnak,
# 2. almenjt vlasztotta.
echo "n kimsolt egy rszt."
;;
3)
# Amennyiben a f men 2. pontjnak,
#3. almenjt vlasztotta.
echo "n egy rszt illesztett be."
;;
esac
;;
3)
# Amennyiben a f men 3. pontjt vlasztotta.
echo "n az eszkzket vlasztotta."
;;
4)
# Amennyiben a f men 4. pontjt vlasztotta.
echo "n a belltsokat vlasztotta."
;;
5)
# Amennyiben a f men 5. pontjt vlasztotta.
echo "Most kilpek."
sleep 3
exit
;;
esac
# a kls case vge. (f men)
--------------------------------------------------------

Bash Shell Programozs

38. oldal

A pldbl hinyzik, a felhasznli vlaszok helyessgnek vizsglata, de most


csak a case megismerse a cl. Br a vlaszok, csak egy karakteresek, azrt a
case elgazsok jl kvethetk. Az els kt case elgazsnl, tovbbi
menpontokat adtunk meg s az azokra trtn vlasz alapjn egy jabb bels
case vizsglat indult, mindkt esetben. Ezzel a mdszerrel, illetve ennek a
finomtsval egyszer menvel lthatjuk el a scriptnket.
Nzzk meg az Xdialog-al, hogyan lehet ment csinlni. Ugyanezt a fenti ment
ksztsk el. Az elzekhez kpest csak annyi a klnbsg, hogy echo s read
helyett hasznljuk a dialgus-ablakokat. Az Xdialog jegyzetbl nzzk t a
--yesno a --fselect s a --menubox dialgus-ablakok lerst.
-----------------------------------------------------#!/bin/bash
# 5.fej. 3.script
clear
until test
do
valasz=`Xdialog --stdout --title "Shell Programozs 5/3 script" \
--backtitle "Men Prba" --no-cancel --no-tags \
--item-help --menubox "Vlasszon a menb l." 0 0 6 \
"1" "Fjl" "Ez a Fjl menpont Help-je." \
"2" "Szerkeszts" "Ez a Szerkeszts menpont Help-je." \
"3" "Eszkzk" "Ez az Eszkzk menpont Help-je." \
"4" "Belltsok" "Ez a Belltsok menpont Help-je." \
"5" "Kilps" "Vigyzat, kilps ! "`
case $valasz in
1)
until test
do
valasz=`Xdialog --stdout \
--title "Shell Programozs 5/3 script" \
--backtitle "Men Prba" \
--no-cancel --no-tags --item-help \
--menubox "Vlasszon a menb l." 0 0 5 \
"1" "Megnyits" "Ez a Megnyits menpont Help-je." \
"2" "Ments" "Ez a Ments menpont Help-je." \
"3" "Vissza..." "Visszalps egy menvel fentebb."`
case $valasz in

Bash Shell Programozs

39. oldal

1)
fajl=`Xdialog --stdout \
--title "Shell Programozs 5/3 script" \
--backtitle "n egy mr meglv dokumentumot \
akar kinyitni." --no-buttons \
--help "Kr brmit is megnyitni\nez csak egy test script."\
--fselect "" 0 0`
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "Most a $fajl fjl megnyitsa trtnne, \
ha ez egy les program lenne." 0 0
;;
2)
fajl=`Xdialog --title "Shell Programozs 5/3 script"\
--backtitle "n dokumentumot akar elmenteni\nAdja meg \
hov s milyen nven." --help "Ez csak egy test \
script\nValjban nem ment semmit." --fselect "" 0 0`
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "Most a fjl, $fajl nven trtn mentse \
kvetkezne, ha ez egy les program lenne." 0 0
;;
3)
break
;;
esac
done
;;
2)
until test
do
valasz=`Xdialog --stdout \
--title "Shell Programozs 5/3 script" \
--backtitle "Men Prba" --no-cancel --no-tags \
--item-help --menubox "Vlasszon a menb l." 0 0 5 \
"1" "Kivgs" "Ez a Kivgs menpont Help-je." \
"2" "Msols" "Ez a Msols menpont Help-je." \
"3" "Beilleszts" "Ez a Beilleszts menpont Help-je." \
"4" "Vissza..." "Visszalps egy menvel fentebb."`
case $valasz in
1)
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "n kivgott egy rszt." 0 0
;;

Bash Shell Programozs

40. oldal

2)
# Amennyiben a f men 2. pontjnak,
#2. almenjt vlasztotta.
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "n kimsolt egy rszt." 0 0
;;
3)
# Amennyiben a f men 2. pontjnak,
#3. almenjt vlasztotta.
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "n egy rszt illesztett be." 0 0
;;
4)
break
;;
esac
done
;;
3)
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "n az Eszkzk Menpontot vlasztotta." 0 0
;;
4)
Xdialog --title "Shell Programozs 5/3 script" \
--msgbox "n az Belltsok Menpontot vlasztotta." 0 0
;;
5)
Xdialog --title "Shell Programozs 5/3 script" \
--yesno "Kilp ?" 0 0
v=$?
if test $v -eq 0
then
exit
fi
;;
esac
done
-------------------------------------------------------Itt a tnyleges mveleteket vgz sorokat, a case-ken bell kellene elhelyezni. Ha
ezek sok sorbl llnak az egsz kd nehezen tlthat vlik. Erre, de nem csak
erre hasznlhat a scripten belli sajt fggvnyek lehetsge, melyet a 7.
rszben trgyalunk.

Bash Shell Programozs

41. oldal

6. Ciklusok
while/until; test; do; done
Kvetkez lehetsgnk amivel a scriptunk struktrjt, hatkonny tehetjk, a
ciklusok hasznlata. Sokszor van, hogy ugyan azt a mveletet, sokszor kell
vgrehajtani, vagy tbb vltozn, illetve fjlon. Erre a while/until s a for
ciklusokkal lehet megoldst tallni.
Szintaxisa:
while test <felttel>
do
<utastsok>
done
A felttel vizsglatra kerl, ha igaz akkor a do s a done kztti utastsok
vgrehajtdnak, majd a shell visszatr a felttelvizsglathoz, ha igaz ismt
vgrehajtja az utasts sort, mindezt egszen addig, amg a felttel igaz. Ha
hamiss vlik, akkor a done utn folytatdik a script.
Msik vltozata az until, addig folytatja a ciklust, mg a felttel hamis s amikor
igazz vlik, akkor lp ki a ciklusbl.
until test <felttel>
do
<utastsok>
done
A kt megolds ugyanazt eredmnyezi.
while test <felttel>
until test ! <felttel>
Gyakran van, hogy egy adott szakaszt, megadott alkalommal akarjuk egyms
utn futtatni, gy, hogy kzben nyomon kvethet legyen ppen hanyadik
alkalommal fut le. Ms nyelvek, erre a for cilust hasznljk, de az a shell-ben,
mint albb majd ltjuk egszen mskppen mkdik. Helyette, egy while vagy
until ciklust hasznlhatunk, egy vltozval, aminek az rtkt minden cilusban
1-el nveljk, gy az tlti be a ciklusszmll szerept, a ciklusfuts
megszaktsnak felttelben pedig maghattozhatjuk, hogy ha ez a szmll elr
egy rtket, a ciklus akkor fejezze be a futst. Erre n lltalban az $i vltozt
hasznlom, tbb egymsba gyazott ciklus esetn pedig $i1 $i2 stb.
Pldakppen nzznk egy egyszer esettet amely a begpelt szveget megfordtja
s gy rja azt ki.

Bash Shell Programozs

42. oldal

------------------------------------------------------------------------#!/bin/bash
# 6.fejezet. 1.script
clear
read szoveg

# Megfordtand szveg bekrse

hosz=`echo $szoveg | wc -c`

# A szveg hossznak lekrdezse.

# Annyiszor ismtl dik a ciklus, ahny karakterb l a szveg ll.


i="0"
# ciklusszmll nullzsa.
until test $hosz -eq $i
do
let i=$i+1
# ciklusszmll 1-el nvelse.
# A ciklus el re haladtval sorba kiveszi
#1-1 karaktert a szvegb l.
k=`echo $szoveg | cut -c $i`
# A fordtott szveget sszeilleszti
# karakterenknt a ciklusok sorn.
fordszov="$k$fordszov"
done
echo $fordszov
# A fordtott szveg kirsa.
------------------------------------------------------------------------for; do; done
A for cilus a shell-ben egszen mskppen mkdik, mint a basic-ben s egyb
programnyelvekben az szoksos. ltalban a for ciklus megadott szmszor
hajtdik vgre.
A while/until ciklus esetn a megszaktst egy megadott felttelhez ktdik.
A shell for ciklus, a ciklusnak tadott rtkeken egyenknt vgig megy, majd kilp
a ciklusbl.
Szintaxisa:
for in <kifejezs>
do
<utastsok>
done
Figyeljk meg a mkds beli klnbsgeket.
$ atadott="Ez meg az s mg ez is."
$
$
$
$

for
for
for
for

atvett
atvett
atvett
atvett

in
in
in
in

Ez meg az s mg ez is.; do echo $atvett; done


"Ez meg az s mg ez is."; do echo $atvett; done
$atadott; do echo $atvett; done
"$atadott"; do echo $atvett; done

Bash Shell Programozs

43. oldal

A fenti utasts sor, scripten bell gy nzne ki:


for atvett in "$atadott"
do echo $atadott
done
Vagy:
for atvett in "$atadott"
do
echo $atadott
done
rdekes, hogy scriptben a "do" utn a parancs lehet j sorban, mg ha egy sorban
rom le az egszet, akkor a "do" s a kvetkez parancs kztt, nem lehet jsor
karakter, vagyis egysoros parancs esetn ";" jel. Ez igaz a tbbi parancsra is,
amikben a "do" utasts szerepel, valamint az if;then;fi esetn is. (if; then ...),
(while; do ...), stb.
Miutn a fenti ngy varicit vgig prbltuk, a for ciklusra, a kvetkezket
figyelhettk meg.
Az 1. esetben, az "in" utn adott rtkek, a szkznknt elvlasztva kln-kln
rtkknt vannak rtelmezve s egyenknt vgrehajtdik velk a ciklus. A
cikluson bell a "for" s az "in" okozott megadott, ebben az esetben $atvett nev
vltozban lehet az tadott rtkre hivatkozni.
A 2. esetben az tadott rtk, egyetlen rtkknt lett rtelmezve az idzjelek
miatt. A 3. s 4. esetben lthatjuk, hogy a fenti kt megllapts, akkor is igaznak
bizonyul, ha az rtkeket vltozban adjuk t a ciklusnak.
A for ciklus nagy elnye, hogy file neveket is t tud venni. Az albbi plda
kilistzza az aktulis knyvtr fjljait.
$ for fajl in *; do echo $fajl; done
A regurlis kifejezsek is hasznlhatk. Az albbi sor csak az mp3 fjlokat
listzza.
$ for fajl in *.mp3; do echo $fajl; done
A for mkdsre egy gyakorlatias pldn keresztl mutatok r. A mkdse
sorn, mr megismert utastsokat alkalmazunk.
Az albbi script, az indtsnak knyvtrtl, rekurzvan megkeresi az mp3
fjlokat, majd az adatait egy adatbzisba menti.
Mkdse a kvetkez: beolvassa az knyvtrbl s az alknyvtrakbl is az mp3
fjlokat, az mp3info programmal kiveszi bellk az idtag adatokat, majd ezeket
egy szveges adatbzisba menti, a fjl teljes elrsi tjval egytt. A mkdshez
viszont egykt dolgot rendbe kell tenni. Ugyan is az mp3info nem minden idtag
adatot ad ki kln sorba. A Title s Track, az Album s Year, valamint a
Comment s Genre adatokat egy sorba adja ki. Ezrt ezek kz a scriptben egy
jsor karaktert helyeznk, hogy minden idtag adat, kln sorba helyezkedjen el.

Bash Shell Programozs

44. oldal

A script felptse a kvetkez:


until test
do
for in
do
if
then
else
fi
done
done
Az until egy vgtelen ciklus, amibl akkor lpnk ki egy exit utastssal, amikor
az if else ga vgrehajtdik. Ekkor a script is befejezi a futst. A for ciklusban
sorba bekrjk az adott mlysgben tallhat mp3 fjlokat. A for, ha nem tall a
regulris kifejezsnek megfelel fjlt, akkor a vltozba magt a regulris
kifejezst helyezi el. Ezt hasznljuk arra, hogy megllaptsuk, tallt-e az adott
mlysgben mp3 fjlt. Ha igen, akkor az if, then ga hajtdik vgre, ha nem akkor
az else g. A then gban az idtag adatokat vltozkba helyezi s hozzadja az
adatbzishoz ket. Az else gban szmolja, hnyadik mlysgben nem tallt mr
mp3 fjlt. Ha 5 egyms utni mlysgben nem tallt, akkor az exit-el befejezi a
script a futst. a for cilus utn, mikor az az adott mlysg mp3 fjlait
tvizsglta, egy mlysggel lentebb lp, a $keres vltoz rtknek
megvltoztatsval.
Nzzk konkrtan a scriptet.
--------------------------------------------------#!/bin/bash
# 6.fejezet. 2.script
#
#
#
#

a vltozk megfelel kezdeti rtknek belltsa.


a numerikus adatknt hasznlt vltozk kezdeti rtknek
a 0-t be kell lltani,
csak gy lehet velk az els pillanattl szmolni.

keres='*.mp3'
melyseg="0"
sorszam="0"
nincs="0"

# az els

mlysg


keressi kifejezs

# az indul knyvtr kivlasztsa.


dir=`Xdialog --title "Shell Programozs 6/2 script" \
--no-buttons --dselect "Vlassza ki a knyvtrat,\nahonnan\
kezdve listba akarja gyjteni az mp3 fjlokat." 0 0`

Bash Shell Programozs


#

Ltrehozzuk az res adatbzist, a megfelel

45. oldal

mez informcikkal.

echo '0;El ad;Album;v;Szmsorszm;Szmcm;Jegyzet;\


Stlus;Elrsi t' > zenetr.dat
# mivel a felttel megadsa nlkli test parancs sosem lesz "igaz"
ezrt ez az until esetn vgtelen ciklust okoz.
until test
do
for mp3fajl in $keres
do
# Megvizsgljuk, adott mlysgben tallt-e mp3 fjlt.
# Ha a for, $mp3fajl vltozban a keresett ($keres)
# regulris kifejezst adja vissza, akkor nem tallt.
# A test "!" opcijval megfordtjuk a jelentst,
# gy ez akkor vlik igazz,
# ha tallt mp3 fjlt, azaz ha a $keres
# s a $mp3fjl rtkek nem egyenl ek.
if test ! "$keres" = "$mp3fajl"
then
# a $sorszam valtozban, szmoljuk
#a tallt mp3 fjlokat, az adatbzisban
# ezzel sorszmozzuk ket, ezt berjuk az index mez be
let sorszam=$sorszam+1
echo $mp3fajl
# kirjuk a megtallt mp3 fjlt,
# hogy rzkelhessk a script futst.
#
#
#
#
#
#
#
#

Az albbi rszben trtnik az mp3info lltal


adott idtag-ok mindegyiknek kln-kln sorba
helyezse. Erre azrt van szksg, hogy a klnfle
idtag-okat, pontossan tudjuk kinyerni.
Az azonos sorban lv idtag-ok esetn a msodik tag
el egy jsor karaktert szrunk. Ne felejtsk el,
az albbi 5 sor, tulajdonkppen egyetlen parancssor,
"\" jelekkel trdelve.

idtag=`mp3info "$mp3fajl" |\
sed s/'Track:'/'\nTrack:'/g |\
sed s/'Year:'/'\nYear:'/g |\
sed s/'Genre:'/'\nGenre:'/g |\
tr ';' ',' | tr '\n' '\;'`
# A vgn az sszes jsor karaktert egy ";"
# mez elvlasztra cserljk gy mint egy tbb mez b l
# ll egyetlen adatsort tudjuk kezelni.
# De eltte az idtag adatokban a ";" karaktereket
# ","-re cserljk, hogy ha vletlen ";" karaktert is
# tartalmaznak az idtag-ek, az ne tvessze meg
# a mez elvlasztst.

Bash Shell Programozs


#
#
#
#
#
#

46. oldal

Az idtag-okat tartalmaz adatsorbl a klnfle


idtag-eket, kln vltozkba helyezzk. Az els cut
az adott igtag-et veszi ki, de ez mg tartalmazza
az idtag nevt is. pl.: "Title: Ez a szm cme"
A msodik cut-al sztvlasszuk az idtag nevt l
az idtag tartalmat.

szamcim=`echo $idtag | cut -d';' -f 2 | cut -d: -f2-`


szamsorszam=`echo $idtag | cut -d';' -f 3 | \
cut -d: -f2-`
eloado=`echo $idtag | cut -d';' -f 4 | cut -d: -f2-`
album=`echo $idtag | cut -d';' -f 5 | cut -d: -f2-`
ev=`echo $idtag | cut -d';' -f 6 | cut -d: -f2-`
jegyzet=`echo $idtag | cut -d';' -f 7 | cut -d: -f2-`
stilus=`echo $idtag | cut -d';' -f 8 | cut -d: -f2-`
#
#
#
#
#

az "-f 2-" jelentse a "-" miatt,:


"a 2.mez t l kezdve, az sszes utna jv is."
Azrt kell, mert elvileg az idtag is tartalmazhat
":" karaktert. s "-f 2" esetn,
az utna jv rszt levgn.

# Ltre hozzuk a berand adatsort, vagy rekordot.


# A $dir/$mp3fajl a teljes elrsi utat adja meg.
sor="$sorszam;$eloado;$album;$ev;$szamsorszam;\
$szamcim;$jegyzet;$stilus;$dir/$mp3fajl"
# Majd hozzf zzk a adatbzis vghez.
echo "$sor" >> zenetr.dat


nincs="0"
# Ez nullzza az mp3 fjlokat nem tartalmaz mlysg
# szmolst, ha mg is tallt egyet.

Bash Shell Programozs

47. oldal

else
let nincs=$nincs+1
# mp3 fjlokat nem tartalmaz mlysg szmolsa.
# Ha mr egymsutn 5 mlysgben nem tallt.
if test $nincs -eq 5
then
exit
# kilps a scriptb l
fi
fi
done
#
#
#
#
#

Ha az adott mlysget a for-al tvizsglta,


a keresst eggyel mlyebbre irnytjuk.
0. mlysg: *.mp3
1. mlysg: */*.mp3
2. mlysg: */*/*.mp3 stb.

keres='*/'"$keres"
done
---------------------------------------------------

Bash Shell Programozs

48. oldal

7. Sajt fggvnyek ksztse


Ebben a rszben, a scripten belli sajt fggvnyekkel fogunk foglalkozni.
Hosszabb scriptek megfelel struktrltsghoz, illetve a gazdasgos
mkdshez, elengedhetetlen ez a technika. Szintaxisa a kvetkez:
function sajatfugveny ()
{
<utastsok>
return
}
A fggvnyeket a script elejre helyezzk. A fggvny futst azon bell brmikor
megszakthatjuk a return paranccsal.
A fggvny pont gy viselkedik, mintha egy kls program lenne. Azaz lehet neki
rtkeket tadni a szoksos bemenetre, illetve fogadni is lehet a szoksos
kimenetrl. Ennek fnyben a kvetkez megoldsok is alkalmazhatk:
echo $valtozo | sajatfugveny | less
echo $valtozo | sajatfugveny > fajl
valtozo2=`echo $valtozo | sajatfugveny`
Mivel ezeknl a pldknl a szoksos kimenetet a kpernyrl t irnytottuk
mshov, ezrt a scripten belli egyetlen echo sem jelenik meg a kpernyn,
hanem tovbbtdik a megjellt kimenetre. Illetve mivel a szoksos bemenetet is
tirnytottuk, ezrt a fggvnyen belli read parancs is a megadott bemenetrl
olvas.
Lehet argumentumokat is tadni neki, amikre fggvnyen bell a $1, $2 $3 stb
mdon lehet hivatkozni. Ekkor ha a read parancsot hasznljuk, akkor a
felhasznltl vrja az adatbevitelt. De a fggvnyen belli echo-k mg mindig
nem a kpernyre, hanem az tirnytott kimenetre, a lenti esetben a "valtozo"
nev vltozba rdnak.
valtozo=`sajatfugveny $arg1 $arg2 $arg3`
Ha a fggvnyen bell, szeretnnk a kpernyre rni akkor a szoksos kimenetet
ne irnytsuk t, azaz a fggvnyt csak a nevre hivatkozva hvjuk meg, ha pedig
a felhasznltl is akarunk adatot bekrni, akkor a bemenetet se irnytsuk t,
hanem a fggvnynek argumentumok formjban adjunk t rtkeket.
sajatfugveny $arg1 $arg2 $arg3
Ebben az esetben viszont rtket a fggvnytl csak a visszatrsi rtk, azaz a $?
vltozn keresztl kaphatunk tle, de ezen keresztl az rtk csak egy 0 s 255
kztti szmrtk lehet. Ennek az rtkt a fggvnyen bell a return parancs
utn adhatjuk meg. A retutn hatsra a fggvny befejezi a futst s a $?
visszatrsi rtkbe a return utn megadott rtk kerl.

Bash Shell Programozs

49. oldal

Ennek a korltot gy kerlhetjk ki, hogy a scripten bell meghatrozunk egy


vltozt, amelyet arra hasznlunk, hogy az ppen fut fggvny ezen keresztl
tudjon brmilyen rtket tadni. Termszetessen nem csak egy, hanem tbb is
felhasznlhat. Lssunk erre egy pldt. Ez a fggvny a felhasznltl krdez
valamit, majd a vlaszt adja vissza. Amit a $fe (fggvny eredmny) vltozban
kapunk vissza a fggvnytl .
--------------------------------------------------#!/bin/bash
# 7.fejezet. 1.script
function dialogus ()
{
local valasz=""
local visszateres""
clear
echo -n "$1 "
read valasz
fe=$valasz
visszateres="10"
return $visszateres
}
kerdes="Mi a neved ?"
dialogus "$kerdes"
vissza=$?
b=$fe
echo "dvzlm, $b"
echo "A fggvny a $vissza rtkkel trt vissza."
--------------------------------------------------Felmerlhet a krds, hogy a fggvnyen kvl mirt nem eleve a $valasz
vltozval jutunk hozz a vlaszhoz. Azrt, mert akkor a fggvnynk eleve egy
komoly hibalehetsggel rendelkezne. Mgpedig, hogy ha a fggvnyen bell is s
a script trzsben is azonos, globlis vltozkat hasznlnnk, ez veszlyes eljrs,
lenne, ugyanis tbb fggvny egymsbl trtn hvsa esetn ezek az rtkek
sszekeveredhetnek, illetve a fggvny knnyen fellrhatna egy a script
trzsben szerepl vltozt. Ezrt rdemes a fggvnyen belli vltozkat
elklnteni a script tbbi rszben szerepltl. Ezt gy tehetjk meg, hogy a
fggvny elejn a local kulcsszval deklarljuk a vltozt. Meghatrozs kzben
mr rtket is kaphat.
local valasz=""
local a="rtk"

Bash Shell Programozs

50. oldal

Ebben az esetben lehet a fggvnyen kvl is, vagy ms fggvnyekben is egy


"valasz" nev vltoznk, ezek mind kln-kln rtkkel rendelkezhetnek s gy
az rtkek egy hosszabb, vagy bonyolultabb script esetn sem keverednek ssze.
Ezrt a fggvnyen bell hasznlatos vltozkat rdemes a fggvny elejn
loklisnak meghatrozni. Ez all az kpez kivtelt, ha tudatosan hasznlunk
globlisan, pl a fggvny s a script trzse kztti rtkmozgats cljbl. A fenti
pldban ppen ezt hasznljuk fel az $fe vltoz esetn, mikzben viszont a
$valasz vltozt loklisnak hatrozzuk meg benne.
Lthatjuk a pldban, hogy a return utn adtunk meg egy visszatrsi rtket is
a fggvnyben. Most csak azrt, hogy lthassuk, ezt a lehetsg is.
Most tegyk a fenti dialgus fggvnynket kicsit ltvnyosabb. De ehhez
ismerkedjnk meg egy jabb paranccsal, a tput -al. A tput, bellt egy terminlt
vagy lekrdezi a terminfo-t. De mi most azt a lehetsgt hasznljuk ki, hogy
segtsgvel, pozicionlni lehet a kurzort a kpernyn illetve le lehet krdezni az
adott terminl hny sorbl s hny oszlopbl ll.
tput cols
Vissza adja, hny karakter szles a terminlunk.
tput lines
Vissza adja, hny karakter magas a terminlunk.
tput cup <$x> <$y>
A kurzor pozcit, a megadott koordinra helyezi.
Ksztnk egy fggvnyt, amely egy dialgus "ablakot" jelent meg a terminlon.
Ehhez tbb segd fggvnyt is ksztnk. Lesz egy keret() nev amely egy keretet
rajzol a kpernyre. Lesz egy box-torol() amely trli a megadott ngyzetben a
kpernyt. Lesz egy inputbox() nev, amely a krdst tehetnk fel a
felhasznlnak s vlaszt kaphatunk tlle, vgl pedig egy msgbox () fggvny,
amellyel egy zenetet tudunk megjelenteni megadott msodpercig.
Termszetesen ezeken a fggvnyeken rengeteget lehetne finomtani. Pldul a
dialgus fggvnyek csak a terminl kzepn helyezkednek majd el,
termszetesen meg lehetne adni, hogy egynileg lehessen ket pozicionlni.
Ezenkvl csak rvid, egy soros zeneteket kezel. Ezen is lehetne finomtani, hogy
ha tl hossz az zenet, akkor feldarabolja s tbb sorba jelentse meg azt, a
dialogusbox mrett pedig ehhez igaztsa. De most a clunk csak az, hogy
bemutassuk a fggvnyek hasznlatt.
Most rviden ismertetem a fggvnyek mkdst.
keret()
Meghvsa a kvetkez mdon trtnik:
keret <sor-pozici> <oszlop-pozici> <magassg> <szlessg>

Bash Shell Programozs

51. oldal

Ahol a <sor-pozici> s az <oszlop-pozici>, a megjelentend keret balfels


sarknak koordintjt hatrozza meg. A <magassg> a keret magassgt, azaz,
hogy hny sor magas legyen, a <szlessg> pedig a szlessgt, azaz, hogy hny
karakter szles legyen, hatrozza meg.
A fggvny elszr elllt kt stringet, amik a a keret megrajzolshoz fog
hasznlni. Egyik a keret fels s als szle lesz, a msik a kztes rszek. Pldul:
boxszel="################"
boxkozep="#
#"
"################"
"#
#"
"#
#"
"#
#"
"################"
Ezeket a szlessgbl alapjn meghatrozott hosszra kszti el. A kirajzolst a
sor-pozici s az oszlop-pozici alapjn kezdi el. Hogy hny darab kztes rszt
rajzoljon, azt pedig a magassg alapjn hatrozza meg. A kirajzolst egyszer
echo parancsak vgzi, de eltte egy tput cup x y -al pozicionlja a kurzort.
Visszatrsi rtke nincs.
box-torol()
Meghvsa a kvetkez mdon trtnik:
box-torol <sor-pozici> <oszlop-pozici> <magassg> <szlessg>
Mkdse hasonl a keret() fggvnnyel, annyi klnbsggel, hogy itt egy
megfelel hosszsg space-eket tartalmaz string kerl kinyomtatsra,
megfelelen pozicionlva s gy trli az adott ngyzet terletet a kpernyn.
Visszatrsi rtke nincs.
msgbox()
Meghvsa a kvetkez mdon trtnik:
msgbox <szveg> <msodperc>
tput lines s tput cols parancsokkal lekrdezi, az aktulis terminl mrett. A
krds hossza alapjn meghatrozza a szksges keret szlessgt, majd az ablak
koordintit, ez s a terminl mret alapjn meghatrozza, hogy az kzpre
kerljn. A kiszmolt rtkekkel meghvja a keret() fggvnyt. Miutn az
kirajzolta a keretet, a megfelel pozciba kirja a megadott szveg-et, majd sleep
paranccsal felfggeszti a meghatrozott msodpercig a script futst, ezltal idt
adva az zenet elolvassra. Ezutn pedig meghvja a box-torol() fggvnyt a
szksges argumentumokkal az msgbox trlshez.
inputbox ()
Meghvsa a kvetkez mdon trtnik:
inputbox <kerdes>
Hasonl az msgbox() fggvnyhez, annyi klnbsggel, hogy a keretmret
kiszmolsakor, hagy helyet a vlasz beolvasshoz is, azaz magasabbra
formlja. Meghvja a keret() fggvnyt, kirja a krdst, majd egy read-al vlaszt
vr r a felhasznltl. Amikor az, enter-el elkldi a vlaszt, akkor a $fe
script-globlis vltozba helyezi a vlaszt, hogy azt a fggvnyen kvl is el
lehessen rni, majd a box-torol() fggvnnyel trli a dialgusbox-ot.

Bash Shell Programozs

52. oldal

Nos lssuk a scriptet kikommentezve:


------------------------------------------------------#!/bin/bash
# 7.fejezet. 2.script
#======================================
# ITT KEZD DNEK A SAJT FGGVNYEK
#-----------------------------------------------------------------# ITT KEZD DIK INPUTBOX FGGVNY
function inputbox ()
{
# A fggvnyben hasznlt vltozk,
#loklisknt trtn meghatrozsa.
local boxsor=""
local boxoszlop=""
local boxmagas=""
local boxszeles=""
local kerdes=$1
local valasz=""
local kerdhosz=""


# A terminl mretnek lekrdezse.


termmagas=`tput lines`
termszeles=`tput cols`
7
kerdhosz=`echo "$kerdes" | wc -c | tr -d ' '`
# A box szlessgnek s magassgnak meghatrozsa.
let boxszeles=$kerdhosz+4
boxmagas="7"
# A keret balfels sarka koordintinak kiszmolsa,
# hogy a box kzpre kerljn.
let boxsor=$termmagas/2-$boxmagas/2
let boxoszlop=$termszeles/2-$boxszeles/2


# A keret() fggvny meghvsa


keret $boxsor $boxoszlop $boxmagas $boxszeles
# A krds kirats kezd
let sor=$boxsor+2
let oszlop=$boxoszlop+3


poziciinak kiszmolsa.

# Kurzor megfelel helyre lltsa s a krds kirsa.


tput cup $sor $oszlop
echo "$kerdes"


Bash Shell Programozs


# A vlasz bekrs kezd
let sor=$sor+2
let oszlop=$oszlop+2

53. oldal

pozciinak kiszmolsa.

# Kurzor megfelel helyre lltsa s a vlasz beolvassa.


tput cup $sor $oszlop
read valasz
# A vlasz $fe script-globlis vltozba rsa.
fe=$valasz
# Az inputbox trlse.
box-torol $boxsor $boxoszlop $boxmagas $boxszeles
}
# ITT VGZ DIK AZ INPUTBOX FGGVNY
#---------------------------------------------------------------

#---------------------------------------------------------------# ITT KEZD DIK MSGBOX FGGVNY


function msgbox ()
{
# A fggvnyben hasznlt vltozk,
# loklisknt trtn meghatrozsa.
local boxsor=""
local boxoszlop=""
local boxmagas=""
local boxszeles=""
local szoveg=$1
local szoveghosz=""
local mp=$2


# A terminl mretnek lekrdezse.


termmagas=`tput lines`
termszeles=`tput cols`
# A krds hossznak lekrdezse
# s az eredmnyb l a space-ek trlse.
szoveghosz=`echo "$szoveg" | wc -c | tr -d ' '`
let boxszeles=$szoveghosz+4
boxmagas="5"
# A keret bal-fels sarka koordintinak kiszmolsa,
# hogy a box kzpre kerljn.
let boxsor=$termmagas/2-$boxmagas/2
let boxoszlop=$termszeles/2-$boxszeles/2
# A keret() fggvny meghhvsa
keret $boxsor $boxoszlop $boxmagas $boxszeles

Bash Shell Programozs


# A szveg kirats kezd
let sor=$boxsor+2
let oszlop=$boxoszlop+3

54. oldal

pozciinak kiszmolsa.

# Kurzor megfelel helyre lltsa s a szveg kirsa.


tput cup $sor $oszlop
echo "$szoveg"
# A meghatrozott ideig trtn vrakozs,
# hogy a felhasznl elolvashassa az zenetet.
sleep $mp
# Az msgbox trlse.
box-torol $boxsor $boxoszlop $boxmagas $boxszeles
}
# ITT VGZ DIK AZ MSGBOX FGGVNY
#--------------------------------------------------------------

#--------------------------------------------------------------# ITT KEZD DIK A KERET FGGVNY


function keret ()
{
# A fggvnyben hasznlt vltozk,
# loklisknt trtn meghatrozsa.
local boxsor=$1
local boxoszlop=$2
local boxmagas=$3
local boxszeles=$4
local k="#"
local boxsor2=""
local boxoszlop2=""
local sor="0"
local boxszel=""
local boxkozep=""
local i=""
local spacehossz=""


# A jobbals sarok koordintinak kiszmtsa.


let boxsor2=$boxsor+$boxmagas-1
let boxoszlop2=boxoszlop+$boxszeles-1
#
#
#
#
#

A keret als s fels rszt alkot string el lltsa.


A ciklus boksz-szlgszer fut le, minden ciklusban egy darab,
a keretet kirajzolshoz meghatrozott
karakterrel nvelve a stringet.
Az $i vltozval szmolva a ciklusfutst.

Bash Shell Programozs

55. oldal

let i="0"
until test $i -eq $boxszeles
do
let i=$i+1
boxszel="$boxszel$k"
done
# A keret kzps rszeit alkot string el lltsa.
# A string els karakternek a keretet
# kirajzolshoz meghatrozott karaktert teszi meg,
boxkozep=$k
# majd a ciklus boxszlg-2 alkalommal,
# egy-egy space-el nveli a stringet,
let i="0"
let spacehossz=$boxszeles-2
until test $i -eq $spacehossz
do
let i=$i+1
boxkozep="$boxkozep "
done
# vgl a vgre is helyez egy kirajzol karaktert.
boxkozep="$boxkozep$k"
# A kurzor, a keret fels szlnek kirajzolsnak
# pozcijba lltsa, s a szl kirajzolsa.
tput cup $boxsor $boxoszlop
echo $boxszel
# A box belseje, fels
let sor=$boxsor
let also=$boxsor2-1

s als sornak meghatrozsa.

# A box kzept alkot string kirsa a megfelel sorokba.


# Kezdve a $sor sorba s folytatva egyenknt az alatta
# kvetkez kbe,amg el nem ri a szksges als sort.
until test $sor -eq $also
do
let sor=$sor+1
tput cup $sor $boxoszlop
echo "$boxkozep"
done
# A kurzor, a keret als szlnek kirajzolsnak
# pozcijba lltsa, s a szl kirajzolsa.
tput cup $boxsor2 $boxoszlop
echo $boxszel
}
# ITT VGZ DIK A KERET FGGVNY
#----------------------------------------------------------------

Bash Shell Programozs

56. oldal

#----------------------------------------------------------------# ITT KEZD DIK A BOX-TOROL FGGVNY


function box-torol ()
{
# A fggvnyben hasznlt vltozk, loklisknt
# trtn meghatrozsa.
local boxsor=$1
local boxoszlop=$2
local boxmagas=$3
local boxszeles=$4
local sor="0"
local kozep=""
local i="0"


# A jobbals sarok koordintinak kiszmtsa.


let boxsor2=$boxsor+$boxmagas-1
let boxoszlop2=$boxoszlop+$boxszeles-1
# A megfelel hosszsg, space-et tartalmaz string el lltsa.
until test $i -eq $boxszeles
do
let i=$i+1
kozep="$kozep "
done


# A kirajzolt box, bal-fels sarka pozcijtl kezdve,


# a space-et tartalmaz stringel, a box trlse, annyi soron t,
# amilyen magas a box volt.
let sor=$boxsor-1
until test $sor -eq $boxsor2
do
let sor=$sor+1
tput cup $sor $boxoszlop
echo "$kozep"
done


}
# ITT VGZ DIK A BOX-TOROL FGGVNY
#----------------------------------------------------------------# ITT VGZ DNEK A SAJT FGGVNYEK
#======================================

Bash Shell Programozs

57. oldal

#======================================
# ITT KEZD DIK A SCRIPT TRZSE
# A VGREHAJTS ITT KEZD DIK EL.
# Kperny
clear


trls

# A krds meghatrozsa.
kerdes="
Mi az n neve ?

"

# Az inputbox meghvsa a krdssel.


inputbox "$kerdes"
# Az inputbox() fggvnyben a vlasszal feltlttt
# $fe script-globlis vltozbl,a vlasz msik vltozba rsa.
nev=$fe
# A s visszajelz szveg meghatrozsa.
szoveg="
dvzlm kedves $nev !
"


# A szveg msgbox() fggvnnyel trtn kiratsa,


# a meghatrozott msodpercig fent tartott msgboxban.
msgbox "$szoveg" 3


# A kurzor, a kperny
tput cup 0 0


bal-fels


sarkba lltsa.

# ITT VGZ DIK A SCRIPT TRZSE


#======================================
A script els pillantsra hossz. De ezentl elg csak a mr meglv fogvnyeket
az j scriptnk elejre msolni s mr is hasznlhatjuk ket. Hiszen a fenti
sriptben is amit le kell programozni, ha mr rendelkeznk a fggvny rsszel,
csak 7 sor !!!
Ennl mr csak az lenne jobb, ha nem is kellene a scriptjeink elejre msolni,
hanem lenne egy kls fggvnyknyvtr, amibl elrhetjk azt. Ehhez elbb
ksztsk el a scriptet, amit meghva, hozzfrhetnk a fggvnyeinkhez.
Msoljuk a fenti scriptbl, a fggvnyeket egy msik res script fjlba. (Azaz
#!/bin/bash -al kezdd, futsi joggal rendelkez fjlba.) Mondjuk legyen a neve
"sfugv". Ezutn fzzk a script vgre az albbi rszt, majd a scriptet msoljuk az
/usr/bin/ knyvtrba, ami a $PATH rsze kell legyen. A kls fgvnyscriptet
tetszleges mennyisg sajtfdvnnyel vthetjk, csak ne felejtsk el a albbi
szakaszban is a r vonatkoz j case szakaszt ltrehozni.

Bash Shell Programozs

58. oldal

------------------------------------------------------case $1 in
keret) keret $2 $3 $4 $5 ;;
box-torol) box-torol $2 $3 $4 $5 ;;
inputbox) inputbox "$2" ;;
msgbox) msgbox "$2" $3 ;;
*) msgbox "Ismeretlen fggvnyhvs" 5
esac
echo $fe 1>&2
Az eredeti scriptnk helyett, pedig hozzunk ltre egy msikatt, aminek az albbi
legyen a tartalma:
------------------------------------------------------#!/bin/bash
# 7.fejezet. 3.script
clear
kerdes="
Mi az n neve ?
"
sfugv inputbox "$kerdes" 2> /tmp/$0.$$
nev=`cat /tmp/$0.$$`
szoveg="
dvzlm kedves $nev !
"
sfugv msgbox "$szoveg" 3
tput cup 0 0
------------------------------------------------------A kvetkez kpen mkdik a dolog. Az sfugv scriptnket meghvjuk, els
argumentumknt megadva neki, hogy melyik fggvnyt szeretnnk hasznlni,
utna pedig a tbbi argumentumban, ami adatokat a fggvnynek akarunk
tadni. Az sfugv script, az els argumentumban kapott rtk alapjn, case-vel
megnzi melyik fggvnyt kell futtatnia, annak tadja a tbbi argumentumot amit
kapott s lefuttatja a fggvnyt, majd ami rtket, (ha van ilyen,) vissza adott a
fggvny, a sfugv scripten belli globlis $fe vltozba, azt a stderr azaz a
szoksos hiba kimenetre kldi. Az eredeti fggvnyben, amibl meg hvtuk a
sfugv scriptet, a fggvny hibakimenett t irnytjuk egy fjlba, majd a fjlbl
cat segtsgvel helyezzk vltozba. Termszetesen azoknl a fggvnyeknl
nincs erre szksg, amik nem adnak vissza rtket. Amik pedig vissza adnak,
azoknl viszont azrt van r szksg, mert ha a sfugv szoksos kimenett
tirnytjuk, pl egy vltozba, akkor a sfugv script sszes fggvnynek sszes
echo-jat oda rja, nem pedig a kpernyre, vagyis akkor a fggvnyek nem
tudnnak kommuniklni a felhasznlval. gy viszont amit a felhasznlnak
zen, azt a szoksos kimenetre rja, viszont a vissza adott rtket a
hibakimenetre. gy nem keveredik a kett ssze. Innen viszont egy tmeneti fjlon
keresztl tudjuk vltozba tenni.

Bash Shell Programozs

59. oldal

Mg szt ejtenk a $0.$$ nev ideiglenes fjlrl. Ez mindig egy egyni nev fjlt
hoz ltre, vagyis, ha egyszerre tbb process, hasznlja a scriptet, akkor sem
keverednek ssze az eredmnyek, mint akkor trtnne, ha fix nev fjlt
hasznlnnk. Ez a fjl elnevezs esetn a $0 vltoz, a fut script nevt, a .$$
rsz pedig a fut processz szmt adja a fjl nevbe. Azaz egy myscript nev
script futsa esetn, amely pl. a 6234-es pidszm alatt fut, myscript.6234 lesz az
ideiglenes fjl neve. De ezzel nem kell trdnnk, hiszen mikor ki olvassuk a ffl
tartalmt, akkor is elg a $0.$$ nven hivatkozni r.
A sajt inputbox() fggvny rsn keresztl, jobban megrthettk az Xdialog
mkdst is. Alap helyzetben az is a hibakimenetre r, de nla adva van egy
--stdout kapcsol, aminek a hatsra a norml kimenetre adja vissza az Xdialog
boxok lltal visszaadott rtkeket. Br ha belenznk az Xdialog-hoz kapott
samples, vagyis plda scriptekbe, (/usr/share/doc/Xdialog/samples vagy
/usr/local/share/doc/Xdialog/samples,) akkor lthatjuk, hogy a legtbb esetben
ott is egy ideiglenes fjlon keresztl oldjk meg az rtk visszaadsa.
Xdialog pldaknt itt arra lthatunk egy lehetsget, hogyan lehet tbb
dialgusablakot is nyitvatartani egyszerre. Tulajdonkppen kln fggvnyekbe
helyezzk a dialgusablakok indtst s a fggvnyt a httrben futtatjuk. Ezt
ugyangy kell tenni, mint brmilyen program esetben. "fugvenynev &".
Termszetesen pusztn a tbb ablak futtatsa gy is lehetsges, ha fgvny
nlkl, a dialogbox-ot indt parancs utn tesznk "&" jelet, de azrt a
fggvnyben val elhelyezs a j megolds, mert csak akkor van lehetsg, a
dialogbox visszatrsi rtknek feldolgozsra is.
---------------------------------------------------------------------#!/bin/bash
# 7.fejezet. 4.script
function ablak1 ()
{
Xdialog --stdout --title "Shell Programozs 7/4 script" \
--backtitle "Els ablak" \
--3rangesbox "Krem lltsa be az rtkeket" 0 0 \
"Biztonsg" "1" "10" "5" \
"Gyorsasg" "1" "1000" "300" \
"Stabilits" "1" "100" "80"
}
function ablak2 ()
{
Xdialog --stdout --title "Shell Programozs 7/4 script" \
--backtitle "Msodik ablak" --calendar "ID GP :-)" 0 0 \
"24" "07" "2381"
}


Bash Shell Programozs


function ablak3 ()
{
Xdialog --stdout --title "Shell Programozs 7/4 script" \
--backtitle "Harmadik ablak" --item-help \
--buildlist "Vlassza ki a megfelel neveket." 0 0 "10" \
"1" "Kovcs Bla" "on" "Kecskemt" \
"2" "Kormos Katalin" "off" "Baja" \
"3" "Spos Antal" "on" "Budapest" \
"4" "Baranyi Andrea" "on" "Zalaegerszeg" \
"5" "Nmeth Balzs" "off" "Pcs"
}
ablak1 &
ablak2 &
ablak3 &
Xdialog --stdout --backtitle "" \
--title "Shell Programozs 7/4 script" \
--msgbox "Befejezze a script a futst ?" 0 0
killall Xdialog
----------------------------------------------------------------------

60. oldal

Bash Shell Programozs

61. oldal

8. Tmbvltozk s tbbdimenzis tmbk modellezse


A bash shell ismeri a tmb tpus vltozkat. Nagy htrny, hogy csak
egydimenzisakat ismer. Azaz a tbbdimenzis tmbket nem ismeri. Nzzk a
tmb vltoz kezelst.
Meghatrozs, vagy deklarls:
$ declare -a valt[elemszam]
Dinamikus tmbkrl van sz, azaz a meghatrozott elemszm nem kt, hanem
tl lehet rajta lpni. Deklarlni sem szksges, hanem mint a norml vltoznl,
amikor a tmbnek vagy annak egy elemnek rtket adunk, akkor az ltrejn. A
tmb els eleme a 0 sorszm.
rtkads:
tomb[elemszm]="rtk"
$ tomb[3]="Szab Julianna"
rtk kinyerse:
echo ${tomb[elemsorszm]}
$ echo ${tomb[3]}
Szab Julianna
$ b=`echo ${tomb[3]}`
A tmb tpus vltozknak az is az elnye. hogy ciklusokban knnyen
kezelhetek. A ciklus szmllval hivatkozunk a tmb egyes elemeire.
i="0"
until test $i -eq 4
do
let i=$i+1
echo ${tomb[$i]}
done
Egy tmbt a nullzni, vagyis minden elemt ress tenni a kvetkezkppen
lehet:
$ tomb=()
A ktdimenzis tmbket, egy excel tblhoz hasonlthatjuk, aminek az egyik
dimenzijt a sorok, a msik dimenzijt az oszlopok adjk. Egy elemre, pedig
hasonlan hivatkozhatunk, mint a excel tbla egy celljra, azaz annl megadjuk
a sort s az oszlopot ami keresztezdsben a cella van, itt pedig megadjuk, az
els dimenzi elemsorszmot s a msodik dimenzi elemsorszmot.

Bash Shell Programozs

62. oldal

Kt dimenzis tmbt gy is, modellezhetjnk, ha az egydimenzis tmb elemeibe


egy-egy adatsort tesznk, aminek a mezi kpezik a msodik dimenzit. Ezeket, a
mr ismert mdon, mint mezkre bontott adatsorokat kezeljk. Az els dimenzi
irnyt, a tmb elemek alkotjk amik tulajdonkppen adatsorok, a msodikt az
egyes tmbelemekben trolt tovbbi elemek, vagyis az adatsorok mezi. A
nulladik elemben, trolhatjuk a mez neveket. Azaz a ktdimenzis tmbnk,
logikailag pontosan gy fog kinzni, mint a adatok.dat fjlunk. A 0. sorszm
tmbelem els mezjt, ami a adatok.dat fjl "Sorszm" mezoszlop 0. sornak
felel meg, felhasznlhatjuk a fjl nevnek trolsra, amibl az adatokat
betltttk.
Ez a technika a kt dimenzis tmbknl mg alkalmazhat, de a hrom, vagy
tbb dimenzisoknl mr nem. Br ezeket ritkn hasznljuk.
Az albbi script, az adatok.dat adatbzis fjl tartalmt listzza ki, adatsoronknt,
azon bell pedig mezkre bontva azt.
------------------------------------------------------------#!/bin/bash
# 8.fejezet. 1.script
i="-1"
let sorokszama=`cat adatok.dat | wc -l | tr -d ' '`-1
until test $i -eq $sorokszama
do
let i=$i+1
a[$i]=`cat adatok.dat | sed -n "$((i+1)) p"`
mezodb=`echo "${a[$i]}" | tr ';' '\n' | wc -l | tr -d ' '`
echo "##########################################"
echo "####### ${i}-dik adatsor feldolgozsa #######"
echo "##########################################"
i2="0"
until test $i2 -eq $mezodb
do
let i2=$i2+1
mezonev=`echo "${a[0]}" | cut -d';' -f $i2`
mezo=`echo "${a[$i]}" | cut -d';' -f $i2`
echo "$mezonev : $mezo"
done
done
------------------------------------------------------------Mivel ezzel a mdszerrel, hrom s tbb dimenzij tmbket nincs rtelme
modellezni, ezrt nzzk meg, hogyan modellezhetnk mskppen tbbdimenzis
tmbket. Elbb az egydimenzis, majd a tbbdimenzis tmb modellezst, de
mr elszakadva az adatbzis kezels pldjtl.

Bash Shell Programozs

63. oldal

Tudjuk, hogy a shell vltozi, alaphelyzetben string tpus vltozk. Ha


meghatrozom, hogy a tmb elemeit milyen karakterrel hatrolom el egymstl,
akkor egy szveges vltozban is trolhat egy teljes tmb. Ebbl pedig a cut
paranccsal kinyerhet a szksges tmb elem.
Nzznk egy pldt, egy neveket tartalmaz, egydimenzis tmbt. Legyen a
tmbelem elvlaszt karakter a megszokott ";".
$ tomb="els elem;msodik elem;harmadik elem;\
negyedik elem;tdik elem;hatodik elem"
$
$
$
$
$
$

elem1=`echo
elem2=`echo
elem3=`echo
elem4=`echo
elem5=`echo
elem6=`echo

$tomb
$tomb
$tomb
$tomb
$tomb
$tomb

|
|
|
|
|
|

cut
cut
cut
cut
cut
cut

-d';'
-d';'
-d';'
-d';'
-d';'
-d';'

-f1`
-f2`
-f3`
-f4`
-f5`
-f6`

Teht a tmb adott sorszm elemre gy tudunk hivatkozni.


$ elemsorszam="3"
$ elem=`echo $tomb | cut -d';' -f $elemsorszam`
$ echo $elem
harmadik elem
No de ha egy ciklusban szeretnnk felhasznlni a tmbelemeket, akkor tudnunk
kell, hny elembl is ll a tmb. Ehhez nzzk meg, hny alkalommal fordul el
benne, a tmbelem elvlaszt ";" karakter. Erre a wc programot hasznljuk -l
kapcsolval, ami vissza adja hny sorbl is ll a bemenetre kldtt adatsor. De
mivel a "wc -l" a sorokat szmolja meg, ezrt eljtte a ";" jeleket, sorvgjelekre "\n"
cserljk, majd utna a wc ltal adott szmrl levgjuk a felesleges szkzket.
$ tombelemdb=`echo $tomb | tr ';' '\n' | wc -l | tr -d ' '`
$ echo $tombelemdb
6
A tmb elemeinek feldolgozsa egy ciklusban:
tombelemdb=`echo $tomb | tr ';' '\n' | wc -l | tr -d ' '`
i="0"
until test $i -eq $tombelemdb
do
let i=$i+1
echo $tomb | cut -d';' -f $i
done
Mindez nem tl ismeretlen, hiszen az elz rszekben mr hasznltuk ezt a
technikt, ms rszt, ez a bash ltal is ismert egydimenzis tmbbel egyszerbben
megoldhat. De tovbb fejlesztve ezt, akr a lnyegesebb, tnyleges programozsi
nyelvekben ismert, tmbkezel fggvnyek is le modellezhetk.

Bash Shell Programozs

64. oldal

Ksztsnk egy fggvnyt, ami kirja a tmb ltalunk meghatrozott sorszm


elemt. A fggvnynek az els argumentumban a tmbt kell tadni, a
msodikban a kvnt elem sorszmt. A fggvny az elemet $fe script-globlis
vltozba adja vissza. Senkit ne zavarjon meg a sorok elejn lv "local"
deklarci. Csupn nem a fggvny elejn hatrozzuk meg a bels vltozk
loklis voltt, hanem akkor, amikor rtket kapnak.
function tomb1d_kiir ()
{
local tombtorzs=$1
local elemsorszam=$2
local elem=`echo $tombtorzs | cut -d';' -f $elemsorszam`
fe=$elem
}
Hasznlata:
index=3
tomb1d_kiir $tomb $index
elem=$fe
Aki a http://glindorf.fw.hu -rl tlttte le a sajt fgvnyek, "sfugv", vagy sfugv+
scriptet s azt msolta be a /bin knyvtrba, annak gy is elrhet:
sfugv "tomb1d_kiir" "$tomb" $index 2> /tmp/$0.$$
elem=`cat /tmp/$0.$$`
Most ksztsnk egy olyan fggvnyt, ami az adott tmbelemet rtkkel tlt fel. A
fggvnynek a tmb s a feltltend elem sorszma mellett, a feltltend
tartalmat is t kell adni. Ehhez a tmbbl kln kell vlasztani, az rtkkel
feltltend elem eltti szakaszt s az az utni szakaszt, majd sszeilleszteni ket,
de kzjk szrva az rtkkel feltlttt elemet. Az j tmbt a $fe script-globlis
vltozba adja vissza.
function tomb1d_feltolt ()
{
local tombtorzs=$1
local elemsorszam=$2
local tartalom="$3"
# A tmb elemszmnak megnzse.
local maxelem=`echo $tombtorzs | tr ';' '\n' | wc -l | tr -d ' '`
# Ha az els elem kell, akkor nem kell
# els levgott rsz, az az, az legyen res.
local ig=$((elemsorszam-1))
if test $ig -ge 1
then
local tombeleje=`echo $tombtorzs | cut -d';' -f 1-$ig`
else
local tombeleje=""
fi

Bash Shell Programozs

65. oldal

# Ha az utols elem kell, akkor nem kell


# utols levgott rsz, az az, az legyen res.
local tol=$((elemsorszam+1))
if test $tol -le $maxelem
then
local tombvege=`echo $tombtorzs | cut -d';' -f $tol-`
else
local tombvege=""
fi
# Ha kzbls elem, rtkt kellett vltoztatni
if test $elemsorszam -ne 1 -a $elemsorszam -ne $maxelem
then
local ujtomb="$tombeleje;$tartalom;$tombvege"
fi
# Ha az els elem, rtkt kellett vltoztatni
if test $elemsorszam -eq 1
then
local ujtomb="$tartalom;$tombvege"
fi
# Ha az utols elem, rtkt kellett vltoztatni
if test $elemsorszam -eq $maxelem
then
local ujtomb="$tombeleje;$tartalom"
fi
fe=$ujtomb
}
Hasznlata:
index=3
ujtartalom="j elem-tartalom"
tomb1d_feltolt $tomb $index "$ujtartalom"
tomb=$fe
sfugv "tomb1d_feltolt" "$tomb" $index "$ujtartalom" 2> /tmp/$0.$$
tomb=`cat /tmp/$0.$$`
Tekintsk meg az eredmnyt:
echo $tomb | tr ';' '\n'
Egy kis gyeskedssel, a tmbelemek sorba rendezse, tmbelem beszrsa,
kivgsa s a tbbi ltalnos tmbkezel fggvny is elkszthet.
Tbbdimenzis tmbk modellezse.

Bash Shell Programozs

66. oldal

A sajnos bash shell nem kpes tbb dimenzij tmb vltozk kezelsre. Holott
ez egy igen hatkony eszkz, a programozs sorn. Fknt, ha adatbzis szer
alkalmazsrl van sz, hiszen ott sok esetben az adattblt, egy 2 dimenzis
tmb vltozba olvassk be, ahol az egyik dimenzi elemei az adatsorok a msik
pedig az adatmezk. Most nzzk, hogyan modellezhetnk, kt, vagy
tbbdimenzis tmbt, a bash egydimenzis tmbjeinek felhasznlsa nlkl.
Ahny dimenzis a tmb, annyi fle elvlaszt karakterre van szksg, amiket
termszetesen a tmbelemek ltal tartalmazott adatokban nem szerepelhetnek.
Pldul egy kt dimenzis tmb esetn legyen a kt dimenzit, vagy gy is
mondhatnm, az adatsorokat elvlaszt jel a "#".
Ez alapjn hozzunk ltre egy ktdimenzis tmbt. Els dimenzija kt
indexelemmel a msodik hrom indexelemmel rendelkezzen. Az rtk amiket az
elemek tartalmaznak, legyenek az adott elem indexszmai betvel kirva.
tomb2d="egy-egy;egy-kett;egy-hrom#kett -egy;kett -kett ;\
kett -hrom#hrom-egy;hrom-kett ;hrom-hrom"
Ha a feltltskor hasznljuk a "\" parancssortrdels lehetsgt, mindjrt
jobban tlthat mit is csinlunk.
tomb2d="\
egy-egy;egy-kett;egy-hrom#\
kett -egy;kett -kett ;kett -hrom#\
hrom-egy;hrom-kett ;hrom-hrom"
Ksztsk el a fenti kt fggvny ktdimenzis tmbt kezel vltozatait.
function tomb2d_kiir ()
{
local tombtorzs=$1
local dim1elemsorszam=$2
local dim2elemsorszam=$3
local elem=`echo $tombtorzs | cut -d'#' -f $dim1elemsorszam |\
cut -d';' -f $dim2elemsorszam`
fe=$elem
}
Hasznlata:
index1=2
index2=3
tomb2d_kiir $tomb2d $index1 $index2
elem=$fe
sfugv "tomb2d_kiir" "$tomb2d" $index $index2 2> /tmp/$0.$$
elem=`cat /tmp/$0.$$`

Bash Shell Programozs

67. oldal

Most pedig a feltltst vgz:


function tomb2d_feltolt ()
{
local tombtorzs=$1
local dim1elemsorszam=$2
local dim2elemsorszam=$3
local tartalom="$4"
#===== AZ ELS DIMENZI FELDARABOLSA =====
# Az els dimenzi (adatsorok) elemszmnak megnzse.
local maxdim1=`echo $tombtorzs | tr '#' '\n' | wc -l | tr -d ' '`


# Ha az els elem (adatsor) kell, akkor nem kell


# els levgott rsz, az az, az legyen res.
local ig=$((dim1elemsorszam-1))
if test $ig -eq 0
then
local dim1tombeleje=""
else
local dim1tombeleje=`echo $tombtorzs | cut -d'#' -f 1-$ig`
fi


# Az elem, (adatsor).amely a vltoztatand elemet


# (adatmez t) tartalmazza
local adatsor=`echo $tombtorzs | cut -d'#' -f $dim1elemsorszam`


# Ha az utols elem (adatsor) kell, akkor nem kell


# utols levgott rsz, az az, az legyen res.
local tol=$((dim1elemsorszam+1))
if test $tol -le $maxdim1
then
local dim1tombvege=`echo $tombtorzs | cut -d'#' -f $tol-`
else
local dim1tombvege=""
fi
#===== AZ MSODIK DIMENZI FELDARABOLSA =====
# A msodik dimenzi (adatmez k) elemszmnak megnzse.
local maxdim2=`echo $adatsor | tr ';' '\n' | wc -l | tr -d ' '`


# Ha az els elem (adatmez ) kell, akkor nem kell


# els levgott rsz, az az, az legyen res.
local ig=$((dim2elemsorszam-1))
if test $ig -ge 1
then
local adatsoreleje=`echo $adatsor | cut -d';' -f 1-$ig`
else
local adatsoreleje=""
fi


Bash Shell Programozs

68. oldal

# Ha az utols elem (adatmez ) kell, akkor nem kell


# utols levgott rsz, az az, az legyen res.
local tol=$((dim2elemsorszam+1))
if test $tol -le $maxdim2
then
local adatsorvege=`echo $adatsor | cut -d';' -f $tol-`
else
local adatsorvege=""
fi
#===== AZ ELS DIMENZI ADATSORNAK SSZEILLESZTSE =====
# Ha kzbls elem, (adatmez ) rtkt kellett vltoztatni
if test $dim1elemsorszam -ne 1 -a $dim2elemsorszam -ne $maxdim2
then
local ujadatsor="$adatsoreleje;$tartalom;$adatsorvege"
fi


# Ha az els elem, (adatmez ) rtkt kellett vltoztatni


if test $dim2elemsorszam -eq 1
then
local ujadatsor="$tartalom;$adatsorvege"
fi
# Ha az utols elem, (adatmez ) rtkt kellett vltoztatni
if test $dim2elemsorszam -eq $maxdim2
then
local ujadatsor="$adatsoreleje;$tartalom"
fi
#===== A TELJES KTDIMENZIS TMB SSZEILLESZTSE =====
# Ha kzbls elem, (adatsor) egyik elemt,
# (adatmez jt) kellett vltoztatni
if test $dim1elemsorszam -ne 1 -a $dim1elemsorszam -ne $maxdim1
then
local ujtomb2d="$dim1tombeleje#$ujadatsor#$dim1tombvege"
fi
# Ha az els elem, (adatsor) egyik elemt,
# (adatmez jt) kellett vltoztatni
if test $dim1elemsorszam -eq 1
then
local ujtomb2d="$ujadatsor#$dim1tombvege"
fi
# Ha az utols elem, (adatsor) egyik elemt,
# (adatmez jt) kellett vltoztatni
if test $dim1elemsorszam -eq $maxdim1
then
local ujtomb2d="$dim1tombeleje#$ujadatsor"
fi

Bash Shell Programozs

69. oldal

#===== AZ J TMB TADSA A $fe GLOBLIS VLTOZBAN =====


fe=$ujtomb2d
}
-----------------------------------------------------------------Hasznlata:
index1=2
index2=3
ujtartalom="j elem-tartalom"
tomb2d_kiir $tomb2d $index1 $index2 $ujtartalom
tomb2d=$fe
sfugv "tomb2d_feltolt" "$tomb2d" $index $index2 \
"$ujtartalom" 2> /tmp/$0.$$
tomb2d=`cat /tmp/$0.$$`
Tekintsk meg az eredmnyt:
echo $tomb2d | tr '#' '\n'
Termszetesen ugyangy modellez hetnk s hasznlhatunk, hrom dimenzis
tmbket is. Br felmerlhet a krds, azoknak mikor is lthatjuk hasznt ?
Pldul, lehetsges vele tbb adattbls adatbzisok egyetlen vltozba val
olvassa s kezelse.
Mint a ktdimenzis tmbt egy excel tblhoz, gy a hrom dimenzisat, egy
tbb munkalapos excel tblzathoz hasonlthatjuk, ahol a els dimenzit, a
munkalapok alkotjk, a msodikat a munkalapok sorai, a harmadikat pedig a
munkalapok oszlopai alkotjk.
Az adattblk kln fjlokban is elhelyezkedhetnek s egy index fjl felsorolhatja
ket.
Az adattblk els mezoszlopa az adatsorok sorszmozst, az els adatsora
pedig az adatmezk neveit, illetve az els adatsor els adatmezje pedig az
adattbla nevt is tartalmazhatja.
A tbbtbls adatbzis, nem csak tbb fjlal, hanem egy tblahatrol karakter
hasznlatval, egyetlen fjlba is trolhat. Hozzunk ltre egy Kecskemti
bartokat, Budapesti rokonokat s Szegedi kollgkat trol tbb tbls
adatbzist eggyetlen hromdimenzis tmbben. A "\" karaktert hasznltam a
parancssor trdelsre, az tlthatsg kedvrt. Ezt nyugodtan gy ahogy van
bemsolhatjuk egy terminlba. A harmadik dimenzielemeit, azaz a
msodikdimenzi rtegeit, a & jellel szeparljuk el.

Bash Shell Programozs

70. oldal

$ tomb3d="\
bartok-tbla;bart-nv;bart-cm#\
1;Bart Bla;Kecskemt#\
2;Bart Gbor;Kecskemt\
&\
rokonok-tbla;rokon-nv;rokon-cm#\
1;Rokon Andrea;Budapest#\
2;Rokon Gerg ;Budapest\
&\
kollgk-tabla;kollga-nv;kollga-cm#\
1;Kollga Ferenc;Szeged#\
2;Kollga Katalin;Szeged\
"
Ezutn rassuk ki, az adattblkat egy res sorral elvlasztva, az adattbla
adatsorait pedig kln-kln sorokba helyezve:
$ echo $tomb3d | sed s/'&'/'\n\n'/g | tr '#' '\n'
bartok-tbla;bart-nv;bart-cm
1;Bart Bla;Kecskemt
2;Bart Gbor;Kecskemt
rokonok-tbla;rokon-nv;rokon-cm
1;Rokon Andrea;Budapest
2;Rokon Gerg ;Budapest
kollgk-tabla;kollga-nv;kollga-cm
1;Kollga Ferenc;Szeged
2;Kollga Katalin;Szeged
Erre a terletre mr nem szndkozom jobban kitrni, de azrt lssunk egy
hromdimenzis tmb meghatrozott elemt kir fggvnyt:
function tomb3d_kiir
{
local d3=$1
local d2=`echo $d3 |
local d1=`echo $d2 |
local d0=`echo $d1 |
fe=$d0
}

()

cut -d'' -f $2`


cut -d'#' -f $3`
cut -d';' -f $4`

Hasznlata:
tomb3d_kiir $tomb $index1 $index2 $index3
elem=$fe
sfugv "tomb3d_kiir" "$tomb2d" $index $index2 $index3 2> /tmp/$0.$$
elem=`cat /tmp/$0.$$`

Bash Shell Programozs

71. oldal

Jelenlegi ismereteinket alapul vve, akr egy dbase szer


adatbziskezelt-scriptet is rhatnnk.Mivel a mez s dimenzi hatrol
karakterek nem szerepelhetnek a tartalomban, ezrt rdemes olyanokat
vlasztani, amik nem igen hasznlatosak s az adatbzis beolvassakor s
adatbevitelkor le kell ellenrizni nincsenek-e benne olyanok.
Xdialog plda:
Most nzzk meg, hogy milyen hatkonyan lehet a tmbket s az Xdilaog
lehetsgeit hasznlni. Ezzel a scriptel egy az adatok.dat adatbzisunkhoz, vagy
azzal azonos felpts adatbzishoz lehet tovbbi adatsorokat hozzadni. A script
nem vgzi el a bevitt adatok formjnak helyessgt de termszetessen ez
megoldhat. Megolds lehetne, ha az adatbzisban a meznevek mellett azt is
trolnnk, milyen megszabott rtkek kerlhetnek bele. Majd a script ezeket
kiolvasn s az ilyen mezk esetben az adatbevitelt egy vlaszt listbl tenn
lehetv, az Xdialog --combobox -al.
------------------------------------------------------------#!/bin/bash
# 8.fejezet. 2.script
# Szerkesztend adatfjl kivlasztsa
datfile=`Xdialog --title "Shell Programozs 8/2 script" \
--backtitle "Vlaszd ki az adatbzist, \
ammihez tovbbi adatokat szeretnl hozzfzni ! " \
--stdout --no-buttons --fselect "" 0 0`
gomb=$?
# Ha nem igen gomb lett nyomva, akkor kilp a scriptb l,
# akkor is, ha az ablak be lett zrva.
if test ! $gomb -eq 0
then
exit
fi
# Az j adatsor sorszmnak lekrdezse.
ujadatsorszama=`cat $datfile | wc -l | tr -d ' '`
# A nulladik adatsor, azaz a fjl els sornak beolvassa
# Esetnkben ez tartalmazza az adatmez k neveit
mezosor=`cat $datfile | sed -n '1 p'`
# Mez k megszmolsa
mezodb=`echo $mezosor | tr ';' '\n' | wc -l | tr -d ' '`

Bash Shell Programozs

72. oldal

# Az egsz egy nagy ciklusban van, hogy tbb adatsort is


# fel lehessen vinni.A ciklusbl akkor lp ki, ha a felhasznl
# nem akar tbb adatsort hozzadni.
ki="0"
until test ! $ki -eq 0
do
# A cikluson belli tmbk tartalmnak trls
mezo=()
prev=()
# Ez a bels ciklus sorbaveszi a mez ket s
# beolvassa a mez neveket egy tombe
i="0"
until test $i -eq $mezodb
do
i=$((i+1))
# Aktulis mez nevnek lekrdezse
mezonev[$i]=`echo $mezosor | cut -d';' -f $i`
done
# Ezt a kt specilis sort a kt mez be bevihet rtkekr l
# tjkoztatja a felhasznlt. Ezzel elveszti a script az
# univerzitst s csak az ilyen mez kkel rendelkez
# adatbzisokhoz lesz j.
mezonev[7]="${mezonev[7]} ( frfi / n )"
mezonev[8]="${mezonev[8]} ( fggetlen / hzas / elvlt / zvegy )"
# Ez a ciklus jra sorba veszi a mez ket s bekri az jmez
# tartalmt a felhasznltl. Kzben a $bevittadat vltozbl
# tjkoztatja az addig bevitt adatokrl. Az $ujadatsor vltozba
# gyjtjk folyamatosan a mr felvitt mez adatokat.
i="1"
bevittadat=""
ujadatsor="$ujadatsorszama"
until test $i -eq $mezodb
do
# Ha az els mez nl lett "Vissza" gomb nyomva az $i 0 lenne.
# Ezt akadjozza meg.
if test $i -eq 0
then
i=1
fi

Bash Shell Programozs

73. oldal

# A ciklus szmllsa
i=$((i+1))
mezo[$i]=`Xdialog --stdout --title "Shell Programozs 8/2 script"\
-backtitle\ "Adatfelvitel\n-----------------------\nEddig\
felvitt adatok:\n$bevittadat\n" \
-wizard --inputbox "${mezonev[$i]}" 0 0`
gomb=$?
# A megnyomott gombok szerinti vgrehajts
case $gomb in
# Igen gomb
0)
# Az eddig bevitt mez adatokhoz az mostani ciklus adatnak
# hozzrsa. A $bevittadatok vltoznl a mez nevt is
# hozzrjuk s egy "\n" jellel az Xdialog szmra sortrst is
# tesznk bele, hogy a mez ket kln-kln sorokba rja ki.
bevittadat="$bevittadat\n${mezonev[$i]} : ${mezo[$i]}"
# Az adatsor esetben a ";" mez elvlaszt karaktert tesz kzjk.
ujadatsor="$ujadatsor;${mezo[$i]}"
# Elmenti az aktulis ciklus adatait
bevittadatprev[$i]=$bevittadat
ujadatsorprev[$i]=$ujadatsor
;;
# Mgse gomb
1)
# Az adatsor feltlt ciklus befejezst vltja ki mert a
# felttelt teljesti,de az adatbzis aktulisnak hagyva,
# rkrdez az j adatsor felvitelre.
i=$mezodb
;;
# Mgse gomb
3)
# A ciklus szmllt kett vel cskkenti.
# Ha csak eggyel cskkenten, akkor ugyanez a ciklus futna jra,
# mert a ciklus a szmll,eggyel val nvelsvel kezd dik.
# De neknk az ezt megel z kell.
i=$((i-2))

Bash Shell Programozs

74. oldal

# Vissza lltja az el z ciklus, kezd , adatait, amik a kett vel


# ezeltti ciklus befejez adatai.Ezeket teszi aktuliss.
bevittadat=${bevittadatprev[$i]}
ujadatsor=${ujadatsorprev[$i]}
;;
# Az ablak be lett zrva. A scriptb l kilps
255)
exit
;;
esac
done
if test ! $gomb -eq 1
then
# A bevitt adatok helyessgt ellen riztetjk a felhasznlval.
Xdialog --title "Shell Programozs 8/2 script" \
--backtitle "Helyessek az adatok ?" --default-no \
--yesno "$bevittadat\n" 0 0
v=$?
# Ha igennel vlaszolt, akkor hozzrja a fjlhoz.
# Ha "nem" gombot nyomott, vagy bezrta az ablakot, akkor ez
# kimarad, az adatokat eldobja.
if test $v -eq 0
then
echo $ujadatsor >> $datfile
else
Xdialog --title "Shell Programozs 8/2 script" \
--msgbox "Az adatokat eldobtam ! " 0 0
fi
fi
# Ha nem-et vlaszol, 1-re vltoztatja a $ki rtkt,
# ami hatsra a kls ciklus abbahagyja a futst.
Xdialog --title "Shell Programozs 8/2 script" \
--yesno "Kvn jabb adatsort felvenni ?" 0 0
ki=$?
# Ha az ablak be lett zrva, akkor 255,
# de a $ki akkorsem 0, vagyis a ciklus ugyangy befejez dik,
# mintha 1 lenne, azaz a "nem" gomb lett volna megnyomva.
done
exit
-------------------------------------------------------------

Bash Shell Programozs

75. oldal

9. Scriptnk tesztelse, hibajavtsa


Azt mondja nhny programoz, hogy a program megtervezse az sszid 1/3-ed
rsze, a megrsa msik 1/3-ed rsze, a hibakeress s tesztels pedig a maradk
1/3-ed rsz.
Mit tehetnk, ha a scriptnk, egyszeren nem akar mkdni s nem tudjuk mi a
hiba.
Indtsuk a scriptet a -v vagy az -x kapcsolval
$ bash -v scriptnk
$ bash -x scriptnk
Ezek futs kzben rtkes informcikat adnak a szmunkra.
Msik lehetsg, hogy a scripben echo-kat helyeznk el, amik informlnak
minket.
if test
then
echo "IF then ga fut"
else
echo "IF else ga fut"
fi
Vagy kzben, a klnfle vltozk rtkeit kiratjuk s ezzel is vizsgljuk mit is
csinl a scriptnk.
echo "\$neve valtoz : $neve"
Esetleg ha futs kzben a kirs trldne, pldul clear vagy ms parancs miatt,
akkor felfggesztjk a futst, egy read-al. Fontos, hogy a read utn olyan vltozt
adjunk meg, amit egybknt nem hasznlunk a scriptben.
echo "\$neve valtoz : $neve"; read tmp
Erre is hasznlhat az Xdialog:
Xdialog --msgbox "$neve" 0 0

Bash Shell Programozs

76. oldal

10. Nhny tlet


Nhny dolog nem igazn kvnkozott egyik rszhez sem. Ezrt itt felsorolom
ezeket.
Klnsebb magyarzat nlkl teszem kzz ket.
Nhny esetben szksgnk lehet vletlenszm generlsra:
$ tol=10
$ ig=15
$ int=$((ig+$tol))
veletlenszam=`echo $((RANDOM%$((intervallum+1))+$tol))`
Milyen hossz egy adott string:
$ a="pirosalma napraforg"
$ hossz`echo $a | wc -c | tr -d ' '`
$ echo $hossz
21
Hnyszor fordul el egy egysoros stringben, egy adott bet.
$ betu="a"
$ db=`echo $((`echo $a | tr "$betu" '\n' | wc -l | tr -d ' '`-1))`
$ echo $db
4
Hnyszor fordul el egy hosszabb kifejezs egy tbb soros szvegben.
$ kif="ter"
$ db=`cat adatok.dat | tr -d '\n' | sed s/"$kif"/'\n'/g | \
wc -l | tr -d ' '`
$ echo $db
4
Hogyan lehet egy karakter ascii kdjt megtudni.
$ char=""
$ kod=`echo $char | od -t u1 | grep 0000000 | cut -c 9,10,11 | sed
s/\ //g`
$ echo $kod
233
Egy ascii Kdot, hogyan lehet karakterr formlni.
$ kod=233
$ char=`echo -e "\\\\$(printf %03o $kod)"`
$ echo $char

Bash Shell Programozs

77. oldal

Utsz
Befejezskppen csak annyit szeretnk mondani, hogy rmmre szolglt, ha
valakinek segthettem s script rs elsajttsban, vagy a linuxhoz val kzelebb
kerlshez. Hiszen n mr annyi segtsget kaptam, klnfle frumokon,
levelezlistkon, st szemlyesen is, hogy ppen ideje volt megprblni nekem is
viszonozni belle valamit.
Aki ezen a dokumentumon tverekedte magt, az ha eddig nem is foglalkozott
programozssal, nyugodtan neki llhat egy valdi programozsi nyelvet
megismerni. Br itt csak a programozs legalapvetbb nhny fogst ismerhette
meg, de ez j alapot nyjt ahhoz, hogy egy nagy llegzetvtel utn, belevesse
magt a programozs rejtelmeibe. n szemly szerint a PHP-t, vagy a java nyelvet
javasolom, mert platformfggetlenek s mert elssorban webes alkalmazsok
ksztsre alkalmasak. Mrpedig az internet fejldse mg messze nem rt a
vgre. Haznk, pedig mg csak most ll az ltalnos felhasznlok krbeni,
"internet-robbans" eltt, ami az EU csatlakozssal nagyon rvid id alatt be fog
kvetkezni. A java mr kilpett a webes fejleszteszkzk krbl is. A jv
programnyelvnek tartott, teljesen modern, objektum orientlt nyelv vlt. De a
megfelel szerverek s programok teleptse utn, a PHP is hasznlhat helyi
gpen trtn feladatmegoldsokra s a PHP4-tl szintn nagyot lpett az
objektumorientltsg fel, ami ma mr alapvet elvrs egy modern nyelvtl. A
PHP a shell utn, mgis igen ismersnek fog tnni. Mind emellett, teljesen fel van
ksztve a klnfle adatbzis kezelsekre is. Akr a Microsoftos vagy akr egy
skvletnek szmt dbase, clipper esetleg szksg esetn szveges alap
adatbzisokat is knnyedn tud kezelni.
Arra biztatok, minden rdekldt, hogy senki ne hagyja, hogy a kezdeti
nehzsgek letrjk az rdekldst. rdemes a linuxal foglalkozni, mert egyre
tbbszr s tbb helyen fogunk vele tallkozni s egyre "felhasznlbartabb"
formban. Nem beszlve rla, hogy jelenleg az UHU Linux nevezhet a leginkbb
magyar opercis rendszernek. Mint linux disztribci, pedig teljesen magyar
fejleszts.
Tisztelettel,
Raffai gbor Istvn alias Glindorf

Bash Shell Programozs

78. oldal

Xdialog jegyzet.
Xdialog 2.0.6
A lerst, Raffai Gbor Istvn alias Glindorf ksztette.
---------------------------------------------------------------NV
Xdialog - grafikus dialgus ablakokat jelent meg scriptekben. (A
tovbbiakban ablakok helyett, dialgus dobozokrl beszlnk.)
SZINTAXIS
...

Xdialog [< ltalnos opcik >] [< ideiglenes opcik >] < dialogusdoboz opcik >

LERS
Az Xdialg segtsgvel, knnyen kezelhetv,
felhasznlbartt s ltvnyosabb tehetjk scriptjeinket.
Programozsi ismeretek nlkl kszthetnk grafikus fellet
segdprogramokat. Brmit, amit a shell lehetv tesz. Az Xdialog,
grafikus dialgus dobozokban kommunikl a felhasznlval. A
shellbl informcikat kzlhetnk s krdseket tehetnk fel vele
a felhasznlnak, majd a dialgus-doboz, a vlaszokat t adja a
scriptnek.
OPCIK
Az ltalnos, az ideiglenes s a dialgus
opcikkal hatrozhatjuk meg a doboz mkdst s adhatunk t a
shellbl a dialgus ablaknak. Minta "[ ]" zrjelek is mutatjk,
az ltalnos s az ideiglenes opcik megadsa nem ktelez, ekkor
az alaprtelmezs szerint trtnik a vgrehajts.
---------------------------------------------------------------ltalnos opcik:
Az < ltalnos opcik > -al, a dialgus-dobozok, (a
kvetkezkben csak "dobozok",) ltalnos mkdst, stlust s
kinzett szabhatjuk meg. Az itt belltott tulajdonsgok,
rkldnek a kvetkez dobozokra s csak a bellts
ellenkezjnek megadsval trlhetek.

Bash Shell Programozs


Lehetsges ltalnos opcik:
--wmclass <nv>
--rc-file <gtkrc fjlnv>
A kinzetet meghatroz ms gtkrc fjl adhat meg.
--backtitle <msodlagos felirat>
Ez a szveg az ablakfejlc al kerl. Ettl egy vonallal
elvlasztva kezddik a valdid szveg.
--title <ablakfelirat>
Az ablak fejlc-feliratt hatrozza meg.
--allow-close | --no-close
Bezrhatv ill. nem-bezrhatv teszi az ablakot. --no-close
esetn, csak szablyosan, OK, Cancel, stb mdon zrhat be az
ablak.
--screen-center | --under-mouse | --auto-placement
Az ablak a kperny kzepn, vagy az egrkurzor felett, illetve
a automatikusan kivlasztott helyen jelenik meg.
--center | --right | --left | --fill
Az ablakban megjelen szveg igaztsa llthat be.
--no-wrap | --wrap
--cr-wrap | --no-cr-wrap
--stderr | --stdout
Azt hatrozza meg, hogy a felhasznl vlaszt, melyik
kimenetre kldje. alaprtelmezett a hiba-kimenet. A legtbb
esetben rdemes a norml kimenetre lltani (--stdout), mert az
alaprtelmezett a 2-es, hibakimenet.

79. oldal

Bash Shell Programozs

80. oldal

--separator <karakter> | --separate-output


Mivel a dialgus doboz csak 1 soros formban adja visza a
vlaszokat, azon dobozok esetn, ahonnan tbb felhasznli adat
rkezik a scripthez, belltja, hogy a ms-ms mezk, milyen
karakterrel legyenek elvlasztva. Alaprtelmezsben "/" jel.
Ha azt szeretnnk, hogy sorokba rendezve kapjuk meg a
vlaszokat, akkor a "\n"-t kell belltani. --separator ";"
esetn pl. a kvetkezkppen tehetjk kln-kln vltozba a
visszakapott rtkeket:
valasz1resz=`echo "$valasz" | cut -d\; -f1`
valasz2resz=`echo "$valasz" | cut -d\; -f2`
valasz3resz=`echo "$valasz" | cut -d\; -f3`
Az alaprtelmezett "/" szepartor esetn s olyan
szepartoroknl,amiknek nincs klnleges jelentsge a shell
rszre, cut-nl nem kell "\". Azaz elg:
valasz1resz=`echo "$valasz" | cut -d/ -f1`
--buttons-style default|icon|text.
A nyomgombok stlust hatrozza meg.
---------------------------------------------------------------Ideiglenes opcik:
The <transient options> only apply to the next <box option>
into the Xdialog command line.
These options are
used to tune the widgets (number and type of buttons, menu
icon) or to trigger some of the widgets specific features.
--fixed-font
Fixed font hasznlata. --tailbox, --textbox s --editbox esetn.
--password
A dialgus doboz utols 1 vagy 2 mezjt, jelszmeznek
lltja be. Ekkor a begpels sorn ezekben csak "*" karakter
ltszik. alkalmas jelsz megadsra, belltsra,
megvltoztatsra. --2inputsbox vagy --3inputsbox esetn.

Bash Shell Programozs


--editable
Vlasztlista esetn engedi az egyni adatberst is, nem pedig
csak a felknlt vlaszthatsgokat. Csak --combobox esetn.
--time-stamp | --date-stamp
--logbox esetn az idblyeget hatrozza meg.
--reverse
Fordtott idrendben naplz a --logbox -ban.
--keep-colors
A log sznezse --logbox esetn.
--interval <timeout>
This option may be used with input(s) boxes, combo box,
range(s) boxes, spin(s) boxes, list boxes, menu box, treeview,
calendar and timebox widgets.
--no-tags
A tagok sorszmozst kapcsolja ki --menubox, --checklist
s --radiolist dobozokban.
--item-help
A --menubox, --checklist, --radiolist, --buildlist s
--treeview dobozok esetn hasznlhatak. Ekkor egy-egy tag
esetben, nem csak 2 paramter, (a tag s a szveg,) hanem egy
harmadik "help" is. Ez a doboz als rszben megjelen szveg
lesz, amely annak megfelelen vltozik, hogy ppen melyik tag
van kijellve.
--default-item <tag>
Belltja a --menbox -ban az alaprtelmezett vlasztst.
--icon <xpm filename>
A belltott kpet mint ikont, kihelyezi a megadott szveg el.
--no-ok
Megsznteti az OK gombot. --tailbox s --logox esetn.

81. oldal

Bash Shell Programozs


--no-cancel
Megsznteti a Cancel, vagy Mmgsem gombot. --infobox,
--gauge s --progress esetn hatstalan.
--no-buttons
Minden gombot megszntet. --textbox, --tailbox, --logbox,
--infobox esetn a Help s a Print gombokat, --fselect s
--dselect esetn pedig az "j knyvtr", a "Fjl trlse" s a
"Fjl tnevezse" gombok nem jelennek meg.
--default-no
Az alaprtelmezett gomb, legyen a "Mgsem" vagy "Nem" gomb.
--wizard opci hasznlata esetn nem lehetsges.
--wizard
"Varzsl" stlusu mdon jelenik meg hrom gomb. (Elz ,
Mgse , Kvetkez.) --msgbox, --infobox, --gauge s --progress
esetn hatstalan.
--help <help>
Egy sg gombot jelent meg a dobozon, amit ha
megnyomunk, akkor egy msgbox-ban a --help paramter utn
megadott szveg jelenik meg. Majd OK utn visszatr az eredeti
doboz. --infobox, --gauge s --progress esetn hatstalan.
--print <printer>
--tailbox, --textbox s --editbox esetn hatrozhat meg vele
a nyomtat.
--check <cmke>
Egy ellenkrz jellngyzetet jelent meg a dobozon. A
doboz visszaadja, hogy kipiplta-e a felhasznl. A doboz ltal
visszaadott rtktl egy "\n" azaz enterrel elvlasztva kerl
tadsra. De ha a vlasz a scriptben egy vltozba van
irnytva, ott mr csak egy szkz jelenik meg kztk. Itt
ktfle rtk jelenhet meg, "checked" vagy "unchecked".
--infobox, --gauge s --progress esetn hatstalan.
--ok-label <cimke>
Az OK gombon az itt megadott szveg jelenik meg.

82. oldal

Bash Shell Programozs


--cancel-label <cmke>
Az Cancel/Mgsem s a No/Nem gombon az itt megadott szveg
jelenik meg. --wizard opci esetn hatstalan.
--beep
Csipog egyet, a doboz megjelensekor.
--beep-after
Csipog egyet, a doboz becsukdsakor.
--begin <Yorg> <Xorg>
This option may be used with all widgets.
--ignore-eof
--infobox s --gauge esetn, nem vesz tudomst a fjlvgi
EOF-rl. Ugyanis az megszaktan a mkdst.
--smooth
--tailbox s --logbox esetn a teljes llomnyt beolvasva
a memriba, gy smbb a lapozst, scrollozst,
de tbb menrit is foglal le.
---------------------------------------------------------------A dialgus doboz:
Ezek a dialgus doboz tpust s pozcijt, ill. mrett
hatrozzk meg. Itt trtnik a f paramterek tadsa is.
A doboz ltal feldolgozand karaktersorozat, vagy filenv.
A doboz pozcijnak, mreteinek meghatrozsa.
A karakter mrettel trtn mret meghatrozsa:
< Szlessg > < Magassg > (pl. 10 20)
Kpernypont mrettel trtn meghatrozs:
< Szlessg >x< Magassg > (pl. 160x300).
A <0> <0> esetn automatikusan, a doboz tartalma alapjn
trtnik a szksges mret meghatrozsa. A <-1> <-1> esetn,
a doboz, a teljes kpernyt kitltve jelenik meg.
It is possible to give the widget an absolute
origin on the screen (provided your window manager lets you do
so), either by using the --begin transient option (when the size

83. oldal

Bash Shell Programozs

84. oldal

is given in characters) or by using a -geometry"-like origin (e.g.


400x200+20-30).
Paramterek tadsa.
Sajnos azt vettem szre, hogy nem hasznlhat a felkilt
jel "!". Ugyanis a bash azt klnleges jelknt rtelmezi. Ez nem
is lenne baj, hiszen a shell szmra klnleges jelentsg
karakterek ilyetn voltt meg lehet szntetni, ha el egy "\"
jelet gpelnk. Sajnos a "\!" esetn viszont, a "\" jel is
megjelenik a szvegben. :-(
A bevitt szvegben a sortrst a "\n" karakterek bersval
rhetjk el. "Ez a bevitt\nszveg, amit\n megtrdeltem." Ez gy
fog megjelenni:
Ez a bevitt
szveg, amit
megtrdeltem.
Hrom fle kimenetre kaphat vlaszt a script a doboztl:
1. A hibakimenet: 2> vagy >&2
2. A norml kimenetre: > vagy 1> vagy >&1
3. A shell visszatrsi vltozjban: $?
A vlaszt ltalban, vagy egy fjlba, vagy egy vltozba szeretnnk
tenni. A kvetkezkppen tehetjk meg ezeket:
1. Fjlba:
Xdialog --inputbox "ez a krds" 0 0 > fjl
2. Vltozba:
1. valasz=`Xdialog --inputbox "ez a krds" 0 0 2>&1`
2. valasz=`Xdialog --stdout --inputbox "ez a krds" 0 0`
3. A samples pldascriptekben legtbbszr, a kvetkez megoldst mutatjk
be:
Xdialog --inputbox "ez a krds" 0 0 2> /tmp/ideiglenesfile.$$
valasz='cat /tmp/ideiglenesfile.$$'
Az arra vonatkoz adatot pedig, hogy a doboz mi mdon lett
bezrva, a $? program-visszatrsi vltozbl tudhatjuk meg.
Ennek rtke, 0, 1, 2, 3, vagy 255 lehet.
Jelentseik:
0 : OK, Yes/Igen vagy Next/Tovbb gomb megnyomsa trtnt.
1 : Cancel/Mgsem vagy No/Nem gomb megnyomsa trtnt.
2 : Help gomb megnyomsa trtnt
3 : Previous/Elz gomb megnyomsa trtnt. (csak --wizard opci
esetn).
255 : Hibval zrult be, nem pedig norml mdon. Ha a dialgus doboz,

Bash Shell Programozs

85. oldal

"doboz-bezrs"-al let bezrva, akkor is ezzel az rtkkel tr


vissza.
---------------------------------------------------------------Lehetsges dialgus dobozok s a megadhat paramterek:
--yesno <karaktersor> <magassg> <szlessg>
Megjelenti a szveget s egy "Igen" meg egy "Nem" gombot.
A vlasz a $? vltozbl tudhat meg:
Xdialog --yesno "Indulhat az akci ?" 0 0
valasz=$?
if test $valasz = 0; then
<igent nyomott>
fi
if test $valasz = 1; then
<nemet nyomott>
fi
if test $valasz = 255; then
<bezrta az ablakot>
fi
--msgbox <karaktersor> <magassg> <szlessg>
Egy zenetet jelent meg, egy "OK" gombbal.
Xdialog --title "zenet !!!" --msgbox "zenem hogy,... ?" 0 0
--infobox <karaktersor> <magassg> <szlessg> [<idmeghatrozs>]
Szintn egy zenetet jelent meg, de meghatrozhat, hogy
a doboz egy adott id elteltvel, magtl bezrdjon. Az
idmeghatrozs egy szm, mely ezredmsodpercben hatrozza meg
az idt. Amint a "[ ]" zrjel is jelzi, megadsa nem ktelez.
Ha nem adunk meg semmit, akkor az alaprtelmezett 1000 , azaz 1
mp lp rvnybe.

Bash Shell Programozs

86. oldal

--gauge <karaktersor> <magassg> <szlessg> [<szzalkszm>]


Egy folyamat elrehaladst brzolja mrtksvon jelezve. A
grafikus sv jelzi a szzalkot, ahol a folyamat tart. A
folyamat elrehaladottsgnak szzalkrtkekt a szabvnyos
bemenetrl kapja meg. Amennyiben jabb szzalkrtket kap,
frissti a svot, gy jelezi az j szzalkrtket. Ha a
bemeneten az "XXX" karaktersort kapja meg, akkor az ez utn a
szabvnyos bemenetrl jv karaktereket, a sv felett, mint
szveget jelenti meg, fell rva az elz, itt helyet foglal
szveget. Ez a kvetkez "XXX" karaktersorig trtnik. Onnan
jra mint szzalkrtkknt rtelmezi a bemeneten kapott
szmot. A bemeneten rkez els EOF jelre befejezdik a
mkdse. Ezt az --ignore-eof kapcsolval lehet elkerlni. Ha a
folyamat tl gyors lenne s szeretnnk kvethetv
tenni,hasznljuk kzben a sleep <mp> parancsot, ahol a megadott
msodpercre felfggeszti a shell a futst.
(

sleep 3
echo "25"
echo "XXX"; echo "huszont szzalk"; echo "XXX"
sleep 3
echo "50"
echo "XXX"; echo "tven szzalk"; echo "XXX"
sleep 3
echo "75"
echo "XXX"; echo "hetvent szzalk"; echo "XXX"
sleep 3
echo "100"
echo "XXX"; echo "szz szzalk"; echo "XXX"
sleep 3
) | Xdialog --gauge "nulla szzalk" 0 0

--progress <karaktersor> <magassg> <szlessg> [<maxdots> [[-]<msglen>]]


Ez szintn egy folyamat elrehaladst jelzi ki mrtksvon. De
nem kell, hogy a szzalkrtkeket szm formjban megkapja,
hanem a bemenetre helyezett folyamatot jelzi ki.
find "$HOME" *.mp3 | Xdialog --progress "mp3 keress" 0 0

Bash Shell Programozs

87. oldal

--inputbox <karaktersor> <magassg> <szlessg> [<alaprtk>]


valasz=`Xdialog --stdout --title "Adatbevitel" --backtitle "Nv bevitel."
--inputbox "rd be a teljes nevedet." 0 0 "Mr. "`
Egy egymezs adatbeviteli dobozt jelent meg. A <karaktersor>
lesz a krds. Az <alaprtk> jelenik meg a beviteli mezben.
--2inputsbox <karaktersor> <magassg> <szlessg> <cimke1> <alaprtk1>
<cimke2> <alaprtk2>
Kt darab beviteli mezt jelent meg. Mivel itt elvileg kt
rtkkel tr vissza a doboz, (kereszt s vezetknv,) csakhogy
a visszatrs egyetlen sorban trtnik, ekkor alaprtelmezsben
egy "/" jel vlassza el a kt rtket. Pl Kovcs Gbor esetben
a $valasz vltozba ez kerl: "Kovcs/Gbor" A "/" helyett ms
szepartor jel is meghatrozhat a --separatot <x> kapcsolval.
pl --separator ";" vagy a --separator "\n" esetn egy enterrel
vlasztja el a kt mez rtkt. Felhasznlhat jelsz
bekrsre is.
valasz=`Xdialog --stdout --separator ";" --title "Adatbevitel" --backtitle
"Nv bevitel." --2inputsbox "rd be a teljes nevedet." 0 0 "Keresztnv:" ""
"Vezetknv:" "Mr. "`
--3inputsbox <karaktersor> <magassg> <szlessg> <cimke1> <alaprtk1>
<cimke2> <alaprtk2> <cimke3> <alaprtk3>
Ugyanaz mint a --2inputsbox, de 3 mezvel. Hasznlhat pl.
jelsz mdostsra, vagy j jelsz krsre. Mint a --2inputsbox
esetben, itt is bellthat, hogy mely mezkbe trtn
adatbevitelnl, legyenek lthatk, csak "*" karakterek. Ezt a
--password kapcsolval lehet elrni. Egyszeri bersakor, az
utols mez, ktszeres bersakor az utols kt mez, hromszori
esetn mindhrom mezben csak "*" karakterek lesznek lthatak.
A --password esetn, alul lthat egy jell ngyzet, "A gpelt
szveg elrejtse" felirattal. Ha ez ell kivesszk a pipt,
akkor "*" helyett, lthatv vlnak a betk.
valasz=`Xdialog --stdout --separator ";" --password --password --title
"Belltsok" --backtitle "Jelszbellts" --3inputsbox "Krem adja meg a kvnt
jelszt" 0 0 "User nv:" "" "Jelsz:" "" "Jelsz megerstse:" ""`
valasz=`Xdialog --stdout --separator ";" --password --password
--password --title "Belltsok" --backtitle "Jelsz mdosts" --3inputsbox "Krem
mdostsa a jelszavt" 0 0 "Rgi jelsz:" "" "j jelsz:" "" "Az j jelsz
megerstse:" ""`

Bash Shell Programozs

88. oldal

--combobox <karaktersor> <magassg> <szlessg> <vlaszts1> <vlaszts2> ...


<vlasztsN>
Lenyl vlasztlista mezt hoz ltre. A <vlasztsN> -ben
megadott szvegek lesznek kivlaszthatak. A kivlasztott
szveggel tr vissza a scripthez, nem pedig annak sorszmval.
valasz=`Xdialog --stdout --combobox "Vlasszon ki egy elemet." 0 0
"Els tag" "Msodik tag" "Harmadik tag"`
--rangebox <karaktersor> <magassg> <szlessg> <minimum rtk> <maximum
rtk> [<alaprtelmezett rtk>]
Ez egy csszkt jelent meg, amelyen egy numerikus rtk adhat
meg. Megadhat neki a legkisebb, a legnagyobb s az
alaprtelmezett rtk.
valasz=`Xdialog --stdout --rangebox "Hny ves n ?" 0 0 "18" "90" "30"`
--2rangesbox <karaktersor> <magassg> <szlessg> <cimke1> <minimum1>
<maximum1> <alap1> <cimke2> <minimum2> <maximum2> <alap2>
Mint a --rangebox esetben, de kt csszkt jelent meg egy
dobozban. Mindegyikhez kln felirat, maximum s minimum,
valamint alaprtk rendelhet, a scripthez a szoksos
--separator -al elvlasztva egy sorban tr vissza az rtk.
--3rangesbox <karaktersor> <magassg> <szlessg> <cimke1> <minimum1>
<maximum1> <alap1> <cimke2> <minimum2> <maximum2> <alap2>
<cimke3> <minimum3> <maximum3> <alap3>
Mint a --rangebox esetben, de hrom csszkt jelent meg egy
dobozban. Mindegyikhez kln felirat, maximum s minimum,
valamint alaprtk rendelhet, a scripthez a szoksos
--separator -al elvlasztva egy sorban tr vissza az rtk.
--spinbox <karaktersor> <magassg> <szlessg> <minimum> <maximum>
<alap> <cmke>
Mint a --rangebox -nl, de itt az egyesnl is megadhat cmke.
Itt viszont nem egy csszkn, hanem egy kicsi rtkbellt
spin-el adhat az meg. Itt nagyobb rtk is berhat mint
a maximumban meghatrozott, viszont a scriptnek akkor is csak a
maximumban meghatrozott rtket adja vissza.

Bash Shell Programozs

89. oldal

--2spinsbox <karaktersor> <magassg> <szlessg> <minimum1> <maximum1>


<alap1> <cimke1> <minimum2> <maximum2> <alap2> <cimke2>
Mint a --rangebox, de kt spin dobozzal.
--3spinsbox <karaktersor> <magassg> <szlessg> <minimum1> <maximum1>
<alap1> <cimke1> <minimum2> <maximum2> <alap2> <cimke2>
<minimum3> <maximum3> <alap3> <cimke3>
Mint a --rangebox, de hrom spin dobozzal.
valasz=`Xdialog --stdout --spinbox "Krem mdostsa a jelszavt" 0 0
"1900" "2003" "1970" "Szletsi v" "1" "12" "6" "A szlets hnapja" "1" "31" "15"
"A szlets napja"`
--textbox <file> <magassg> <szlessg>
Egy szveges fjl tartalma jelenthet meg vele. Egy ideiglenes
fjlon keresztl a szabvnyos kimenet is megjelenthet vele. A
--no-buttons kapcsol nem hasznlhat nla. Ha a fjlnv
helyett a "-" adjuk meg, akkor a szabvnyos bemenetrl olvas,
aza pipeline-al ms programoktl, parancsok szabvnyos
kimenetrl tudja tvenni a megjelentend szveget. (Lsd.:
--editbox plda.)
mplayer --help > /tmp/boxtmp.$$
Xdialog --textbox "/tmp/boxtmp.$$" 0 0
--editbox <file> <magassg> <szlessg>
Hasonl mint a textbox, de szerkeszteni is lehet a fjlt vele.
az albbi mdon a felhasznl ltali vltoztatsok
elmentsre kerlnek a fjlba.
cat file.txt | Xdialog --stdout --editbox "-" 0 0 > file.txt
--tailbox <file> <magassg> <szlessg>
Majdnem ugyan olyan mint a --textbox de jelentsen gyorsabb
scrollozst, megjelentst tesz lehetv. Ugyanakkor itt mr
hasznlhat a --no-buttons kapcsol is. A "-" fjlnvknt val
megadsval ugyangy kpes a szabvnyos bemenetrl olvasni
(pipeline). --textbox helyett inkbb ez tnik jobb
vlasztsnak.

Bash Shell Programozs

90. oldal

--logbox <file> <magassg> <szlessg>


A logbox leginkbb annyiban klnbzik a tailbox-tl, hogy a
--time-stamp kapcsolval id bejegyzst szrhatunk minden sor
el, a --date-stamp -al pedig a dtumot is. Illetve a
--keep-colors kapcsolval sznezhet a megjelents.
--menubox <karaktersor> <magassg> <szlessg> <men magassg>
<azonosito1> <menupont1> {<help1>}
Egy fggleges ment jelent meg. A men magassg egy szm ami
azt jelenti, hogy egyszerre csak az itt megadott szm menpont
ltszik, a tbbit grgetssel lehet elrni. Egy menponthoz kt
adat adhat meg, de ha az --item-help kapcsol hasznlva van,
akkor egy harmadik is. De csak akkor. (Ezt jelli a {} zrjel)
A hrom adat:
1. a men azonostja. (sszernek tnik itt
sorszmokat hasznlni.) Ezt az rtket fogja az ablak
tadni a scriptnek.
2. A menpont szvege.
3. A menpont help-je, vagy tbbletinformci rla. Ez a
doboz als rszben, de a gombok felett jelenik meg. A
--no-tags kapcsolval, elrejthet a menpontok
azonosti.
valasz=`Xdialog --no-tags --item-help --menubox "Vlasszon a
menbl." 0 0 3 "1" "Els pont" "els pont segtsge" "2" "Msodik pont" "msodik
pont segtsge" "3" "harmadik pont" "harmadik pont segtsge" "4" "negyedik pont"
"negyedik pont segtsge" "5" "tdik" "tdik pont segtsge"`
--checklist <karaktersor> <magassg> <szlessg> <lista magassg> <azonosit1>
<elem szveg1> <sttusz1> {<help1>}
Egy jellngyzet listt ad. Itt a szveg eltti rsz piplhat
ki, vagy vehet ki a pipa elle. A mkdse hasonl mint a
--menubox -, annyi klnbsggel, hogy mivel itt tbb elem is
kivlaszthat, kipiplhat, ezrt a doboz a visszatrsi
rtkben a --separator s a --2inputsbox -nl ismertetett mdon
adja vissza a kijellt elemek azonostjnak, a szepartor
karakterrel elvlasztott listjt. A --menubox -hoz kpest,
viszont listaelemenknt bvl eggyel a megadand paramterek
szma.
1.
2.
3.
4.

jellngyzet listaelem azonostja.


Az elem szvege.
Az elem sttusza (ez a plusz)
A jellngyzet elem helpje. (Csak --item-help
esetn.)

Bash Shell Programozs

91. oldal

A 3. paramter, az elem sttusznl, hromfle rtk adhat


meg.
1. "off": az elem a doboz megnylsakor nincs kijellve.
2. "on": az elem a doboz megnylsakor kivan jellve.
3. "unavailable" Ez azt jelenti, hogy az elem megjelenik,
de nem-kivlaszthat.
( --item-help esetn a help szvegeket nem a doboz aljn, hanem
ha az egrrel 0.5mp-re megllunk az elem felett, akkor jelenti
meg, egy kis cmkn az egr mellett.)
valasz=`Xdialog --stdout --no-tags --item-help --checklist "Piplja ki a
megfelelket." 0 0 3 "1" "Els pont" "off" "els pont segtsge" "2" "Msodik pont"
"on" "msodik pont segtsge" "3" "harmadik pont" "on" "harmadik pont segtsge"
"4" "negyedik pont" "unavailable" "negyedikpont segtsge" "5" "tdik" "off"
"tdik pont segtsge"`
--radiolist <karaktersor> <magassg> <szlessg> <lista magassg> <azonost1>
<elem1> <sttusz1> {<help1>}
A rdigomb listt ad ki. Minden gy mkdik mint a --checklist
esetben, azzal a klnbsggel, hogy mivel itt egyszerre csak
egy elem jellhet meg, ezrt a sttusz megadsakor is csak egy
lehet "on". ( Az --item-help itt is egr melletti cmke. )
--buildlist <karaktersor> <magassg> <szlessg> <lista magassg> <azonost1>
<elem1> <sttusz1> {<help1>}
Ez egy olyan dobozt jelent meg, amiben kt lista lthat s az
egyik listbl a msikba helyezhetnk t elemeket. Vgl is egy
listbl lehet tbb elemet kivlasztani vele. Az "on"
sttuszak, rgtn a kivlasztottak kztt vannak. A doboz a
kivlasztottak listjban lv elemek azonostit adja vissza,
a szepartorral elvlasztva.( Az --item-help itt is egr
melletti cmke. )
--treeview <karaktersor> <magassg> <szlessg> <lista magassg> <azonost1>
<elem1> <sttusz1> <elem1 mlysg> {<help1>}
Ez egy fastruktra szeren jelenti meg az elemeket, amik gy
egymsba gyazhatak. Ezrt egy tdik a paramter lp be, az
elem mlysg. Itt oda kell figyelni, hogy az elemek s a mlysg
rtkek, helyesen kvessk egymst. gy kell a listnak olyan
sorrendben kell kvetkeznie, mintha minden szl kibontott llapotban
lenne a fastruktrban.

Bash Shell Programozs

92. oldal

--fselect <file> <magassg> <szlessg>


Ez egy jl ismert fjl kivlaszt doboz. A file paramter, az
egy szr. Csak az ennek a szrnek megfelel fjlokat fogja
mutatni. Ha azt akarjuk, hogy mindent mutasson, "*"-ot kell
neki megadni. Lehetsg van knyvtr ltrehozsra, fjl
trlsre s fjl tnevezsre is. A --no-buttons kapcsol,
csak ezeket a lehetsgeket veszi el. A --check is hasznlhat.
A fjl teljes elrsi tjval s nevvel tr vissza a scripthez.
A --check egy "\n", azaz enterrel elvlasztva a fjlnvtl,
kerl a kimenetre.
fajl=`Xdialog --help "legyl gyes s vlassz ki egy fjlt." --check "Meg
gyzdtl a helyes kivlasztsrl ?" --fselect "*.gz" 0 0`
--dselect <directory> <magassg> <szlessg>
Mint az --fselect, de knyvtr jellhet ki vele.
--calendar <karaktersor> <magassg> <szlessg> <nap> <hnap> <v>
Egy naptrat jelent meg. Megadhat, hogy milyen dtummal
induljon. Az vnek minimum 1970-nek kell lennie. "nap/hnap/v"
formban adja vissza a belltott dtumot.
--timebox <karaktersor> <magassg> <szlessg>
Egy idpont bevitelre alkalmas doboz. Hrom spin elem jelenik
meg rajta, ra, perc, msodperc. Alaprtke az aktulis id.
Visszatrni, "ra:perc:mp" formban tr vissza.
---------------------------------------------------------------Plda scriptek a kvetkez elrsi ton tallhatak:
/usr/local/share/doc/Xdialog-2.0.6/samples/*
MAN angol:
/usr/local/man/man1/Xdialog.1*
Dokumentumok angol nyelven:
/usr/local/share/doc/Xdialog-2.0.6/*
----------------------------------------------------------------

You might also like