Professional Documents
Culture Documents
Bash
Bash
1. oldal
Hiba bejelents:
Mail: rgi@vipmail.hu glindorf@mailbox.hu
Mobil: 70/259-0425
ICQ: 108767553
2. oldal
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
4. oldal
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
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
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 !
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.
9. oldal
10. oldal
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.
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.
13. oldal
14. oldal
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.
16. oldal
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.
18. oldal
19. oldal
20. oldal
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
21. oldal
22. oldal
23. oldal
24. oldal
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.
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
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.
28. oldal
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.
30. oldal
knyvtr.
szablyos fjl.
olvashat.
rhat.
vgrehajthat.
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.
32. oldal
33. oldal
------------------------------------------------------#!/bin/bash
# 5.fej. 1.script
clear
# kperny
trls
34. oldal
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.
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.
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)
--------------------------------------------------------
38. oldal
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
;;
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.
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.
42. oldal
------------------------------------------------------------------------#!/bin/bash
# 6.fejezet. 1.script
clear
read szoveg
for
for
for
for
atvett
atvett
atvett
atvett
in
in
in
in
43. oldal
44. oldal
keres='*.mp3'
melyseg="0"
sorszam="0"
nincs="0"
# az els
mlysg
keressi kifejezs
45. oldal
mez informcikkal.
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.
46. oldal
nincs="0"
# Ez nullzza az mp3 fjlokat nem tartalmaz mlysg
# szmolst, ha mg is tallt egyet.
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
#
#
#
#
#
keres='*/'"$keres"
done
---------------------------------------------------
48. oldal
49. oldal
50. oldal
51. oldal
52. oldal
poziciinak kiszmolsa.
53. oldal
pozciinak kiszmolsa.
54. oldal
pozciinak kiszmolsa.
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
56. oldal
}
# ITT VGZ DIK A BOX-TOROL FGGVNY
#----------------------------------------------------------------# ITT VGZ DNEK A SAJT FGGVNYEK
#======================================
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 ?
"
# A kurzor, a kperny
tput cup 0 0
bal-fels
sarkba lltsa.
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.
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"
}
60. oldal
61. oldal
62. oldal
63. oldal
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`
64. oldal
65. oldal
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.$$`
67. oldal
68. oldal
69. oldal
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
}
()
Hasznlata:
tomb3d_kiir $tomb $index1 $index2 $index3
elem=$fe
sfugv "tomb3d_kiir" "$tomb2d" $index $index2 $index3 2> /tmp/$0.$$
elem=`cat /tmp/$0.$$`
71. oldal
72. oldal
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))
74. oldal
75. oldal
76. oldal
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
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.
79. oldal
80. oldal
81. oldal
82. oldal
83. oldal
84. oldal
85. oldal
86. oldal
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
87. oldal
88. oldal
89. oldal
90. oldal
91. oldal
92. oldal