Richard Petersen
OSNOVE •
Inux PROGRAMI RANJA
I/lkompjuter � biblioteka OSBORNE
Izdavač: "Kompjuter biblioteka"
19, 32000 Čačak tel: 032/320-140, 232-322, 011/646-613 fax: 0321232-322,
linux Programming: Richard Petersen
A
Beginner's Guide
Vladana Šićevića
''A.uthorized translation from English language edition published by Osborne McGraw-Hill",
Copyright 2001.
All right re se rved . No p art of this b oo k may be reprod,uced or transmitted in any form or by means, electronic or mechanical, including photocopying, recording or by any
žiro-račun: 41300-603-4-4002603 E-mail:
information storage retrieval sys tem , without permission from the Publisher.
[email protected] Internet: www.kombib.co.yu Urednik: Mihailo J. Š olajić
Autorizovani prevod sa engleskog jezika edicije u izdanju Osborne McGraw-Hill,
Copyright 2001
Sva prava zadržana. Nije dozvoljeno d a ni jedan
deo ove knjige bude reprodukovan ili sniml jen na bilo koji način ili bilo kojim sredstvom, elektronskim ili mehaničkim, uključujući fotokopiranje, sn im anje ili drugi sis tem presnimavanja informacija, bez dozvole izdavača.
Za izdavača, direktor: Mihailo J. Šolajić Prevod: Dijan a Ivanišević
Recenzent: Aleksandar
Kostić
lektor:
Ljiljana Babić
Dizajn: Zo ran Pavlović Slog: Zora Radojević Ana Pešić Ivana Petronijević
Znak Kompjuter bibliot�k�: Miloš Milosavljević
Štcmpc: "Svetlost"
Godine
Čačak
izdenje:
2002.
Izdanje; p rugo ISBN 86-7310-198-0
Kratak sadrža·
Poglavlje 1: Uvod u Linux programiranje Poglavlje 2: BASH shell skriptovi
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
.
.
.
.
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
.
.
.
.
.
.
•
.
.
.
•
.
.
.
.
.
Poglavlje 3: BASH shell upravljačke strukture Poglavlje 4: TCSH shell programiranje
.
.
.
.
.
.
.
.
•
.
.
.
.
•
.
.
.
.
•
.
.
.
3
23 43 67
��ifli,I·· ·JEl�;i�im�il'ig Poglavlje 5: GAWK Poglavlje 6: Perl
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
.
.
.
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
Poglavlje 7: Tool Command Language (Tel) Poglavlje 8: Tk
.
.
.
.
.
Poglavlje 9: GNOME Poglavlje 10: KOE
.
•
.
.
.
.
.
.
.
•
.
_ .
.
.
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
.
.
.
.
.
.
.
101 137 181 215
245 277
iv
Linux
programiranje
.
Dodatak A:Odgovori na pitanja iz glavne provere Indeks
.
�
I
.
.
.
.
.
.
.
.
.
.
.
.
.
311
•
•
•
•
•
•
•
•
•
•
•
o
•
319
. .
.
.
.
.
o
•
•
•
•
"
0
•
o
.
.
.
.
.
o
•
•
•
•
•
•
•
o
•
•
Poglavlje 1: Uvod u linux programiranje Linux programiranje
o
•
•
•
o
•
BASH shell programiranje TCSH Shell programiranje GAWK
Pe rl
.
.
.
.
o
o
o
o
o
.
•
•
.
•
o
.
.
.
o
o
o
.
.
.
.
o
o
o
o
.
.
o
o
o
.
.
.
o
o
o
.
o
.
.
.
o
o
o
.
•
.
.
•
•
•
•
•
•
•
•
o
o
•
o
o
o
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
.
.
.
.
.
.
.
.
.
.
o
o
o
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
0
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Langu age {Tel) •
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
0
•
•
•
•
•
•
•
•
•
•
•
•
•
.
o
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
,
o
Oo
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
o
o
•
•
o
o
•
o
•
•
o
•
•
o
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
o
o
•
•
o
•
•
o
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
o
•
o
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
o
Ulazak Linuxa
.
.
.
Anatomija Linuxa: Distribucije Linuxa Red H at
.
.
Openlinux
.
.
.
.
shellovi, direktorijumi i desktopovi .
.
.
.
.
.
.
.
.
.
.
.
0 0
.
•
•
•
•
•
•
•
•
•
•
•
•
.
.
o
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
•
•
o
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
o
o
•
o
o
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
o
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
.'
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
o
.
.
.
o
•
•
•
•
•
•
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Sla kware c
Infomagic LinuxPPC
.
o
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
o
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
.
o
o
•
•
•
•
o
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
.
Turbolinux Mandrake
o
o
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
o
•
•
•
•
•
•
•
o
•
•
•
o
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
o
•
•
•
•
•
•
o
o
Resursi za Linux
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
.
o
•
•
•
•
•
•
•
o
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
3
04
.
Linuxa je bio UNIX
.
o
.
KDE programiranje ..
Debian
o
.
Nešto više o Linuxu
SuSE
o
.
GNOME programiranj e
Pre
o
•
.
Tool Command
Tk
o
5 6 6 7 7 7 8 8
10 11
14
IS 17 17 17 18 18 18 18 18 19 19 19
vi
Linux programiranje
Poglavlje 2: BASH shell skriptovi
... .. ......... ... .. .... 23 .. . .. . . .. . . .. 24 Postavljanje dozvola: Simboli za dozvole ................... � . 25 Promenljive i skriptovi . . . .. . .. .. . ... ... . .. ... 27 Odre đivanje vrednosti promenljivih: i $ . .. ..... . . 28 Vre dno sti prome nljive : Stringovi .. . . . . .. . . . . 29 Ulaz i izlaz skripta: echo, read i < < . . . ..... . ... . 32 Argumenti skripta u komandnoj liniji .......................... 35 Eksportavanje promenljivih i shellovi skripta ... . ... .. .. . ... . . 37 Promenljive okruženj a (environment va ri ables) ................. 39 .. .. .. . . .. .. . . ... 41 Aritmetičke shell operacije: let .
.
.
Shell skriptovi: Komande i komentari
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
=
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Poglavlje 3: BASH
sh ell upravljačke strukture ................. 43 Komanda test 44 Uslovne strukture: if, if-else, el i f i case . ....... .. ... . . 46 if-then struktura . . .. . .. ... .. . .... .. .. . . . 46 Logičke komande: && i dd .. . . ... .... . .. . .. . . . 49 Struktura case . . ... .... .. . ... . .. . .. 50 Petlje: while, u ntil , for-in i for . ... .. .. . .. . ...... . . .... Sl Petlja whi le ........................................... 52 Struktura until ...... . . . . .. . .... ........ ..... 54 Struktura for-in . . . .. ..... .. . .. .. . .. . .... . . .. . 54 Struktura for . ..... . . .. .. .. ... . ....... .. . 55 Komanda continue . .. . .. . . . ... .. .. ...... .. .. 57 Komande true, false i break ... . .. ........ . . . .. . . 57 Korišćenje preusmeravanja i pipe o p era c ij a sa .. . . .. . . .. ... ..... ... ... .. 60 upravljačkim strukturama Trap strukture: trap ............ . . . . . ... ......... . . 63 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Poglavlje 4: TCSH shell programiranje
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.. ... . . . . . . . . ..... . 67 TCSH shell promenljive, skriptovi i argumenti .... .... . . ... . .... 67 TCSH shell promenljive . ... ............ . .......... 68 TCSH shell skriptovi: Ulaz i izlaz .... . ... ... .. ..... 69 Nizovi: O i tt ... . ... . .. . ... . .. . . . . ........... 70 Niz argumenata: argv . 72 Numeričke promenljive: @ 75 Promenijive okruženja: sete nv . n Upravljačke st ruklure i operatori: while, if, switch i foreach . .. 80 Test izrazi . ...... . ........ ... . ......... .. . 81 TCSH shell uslovIle strukture: if-then, if-then-else i swi1da - - .. 83 . 83 . .... struktura if-then . .. . . . Struktura switch ...... .. .. .. ...... . .. 86 Strukture petlji: while, foreach irepeat . ... . . 89 Struktura while . . ..... .... ... . - ... 90 Struktura foreach ,:.:� ... . 91 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
.
.
.
.
.
.
_
_
_
_
.
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
_
_
_
.
.
.
.
.
_
_
_
_
_ _
_
_
_
_
_
_ _ _ _
_
_______
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
•
_
.
.
.
_
_
_
_
_
_________ .
_
_ __________ _
_
_
_
_ _ ___________
_
-
• _______________
_ _________
_____
_
_
_
Sadržaj
Struktura repeat
.
.
Komanda cont in ue
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
•
•
o
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
o
•
•
•
•
•
o
o
•
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
o
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
o
o
•
•
•
•
•
Beskona čne petlje i komanda break
...... ..........
Poglavlje 5: GAWK Komanda gawk
.
.
.
.
.
.
.
.
. .. .. .
.
.
.
.
.
.
.
.
.
.
.
Traženje š ablona i specijalni karakteri Promenljive, konstante i funkcije . .
.
Promenljive polja i graničnici polja S pecija l n e GAWK
promenlj i ve koje definiše korisnik
Promenljive
.
.
.
.
.
.
.
o
•
.
.
.
..
.
.
.
.
. ..
.
.
.
.
.
o
o
o
. ...
.
.
.
.
..
...
.
.
.
•
.
•
.
.
•
.
.
.
.
o
.
.
•
•
•
.....
.
.
•
•
.
.
.
o
o
o
•
•
•
•
.
o
o
•
.
.
•
.
o
.
.
•
.
•
•
•
•
•
o
o
•
•
•
•
•
•
101 102 103 105
. ..... 105
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
.
o
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
107 108 109 109
Konstante . F unkcije .. . . . : S egment šablona kao uslov ................................. Oper a tori jedn ako s ti i rela cion i operatori . . . . . . .
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
•
•
•
.
.
•
•
•
•
•
•
•
.
.
.
.
.
.
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
93 93 94
.
•
•
114 115
116 Operatori za traženje šablona ............................. 1 1 7 . . .. . . 117 Specijalni š ablo ni BEGIN i END Šabloni opsega . . .. .. . .. 118 .. . .. .... . Aritme ti čke ope ra cij e i o peracij a dodele 118 Logički operatori ...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
.
.
.
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
•
.
o
.
.
.
•
•
•
.
.
.
.
.
.
.
.
.
•
•
•
•
.
.
.
•
•
.
•
•
.
.
.
Nizovi i asocij ativni nizovi .................................. 121 Fajlovi sa GAWK instrukcijama .. . . . ... .. ... 122 .
Upravlj ačke strukture .
.
.
.
.
.
.
..... . .
.
.
.
.
.
.
.
.
.
.
.
...
..
.
.
.
.
.
.
. . .. ..
.
.
.
.
.
.
.
.
.
. . 123
124 127 Petlja for-in . ... . . . . . . . . . . . . .. . . . . 128 Upravljačka struktura if . . .. .. . . . ... .. . 129 Iskazi next i exit 130 Iskaz getline . . . . . . . . .. 130 Korišćenje fajlova sa GAWK-om . . , ........................... l31 Korak po korak .. . .... .. . 134 Petlja while
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Petlja for ... .. . . .
.
.
.
.... . ..
.
. . ...
.
.
.
.
. . ... .. .
.
.
o
o
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.0
•
.
•
•
.
.
•
.
.
.
o
•
.
.
.
.
.
.
.
•
•
•
•
•
.
.
.
.
.
Poglavlje 6: Perl
.
•
o
.
.
.
.
.
.
•
•
•
o
.
o
•
•
o
•
.
.
.
•
•
.
.
.
.
.
.
.
.
•
o
•
•
o
•
•
•
•
•
.
.
.
•
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
.
.
.
.
•
•
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
o
•
•
•
•
•
•
137
•
Perl operacije u k omand noj linij i ............................. 137 Perl skriptovi .. . . 138 Ulaz i izl a z 140 140 Kor išć enje standardnog ulaza . . "
.
.
.
.
.
o
•
•
•
•
.
•
•
•
•
.
.
•
•
•
'
.
o
o
•
•
•
o
•
o
•
•
•
•
•
•
•
•
•
•
•
o
o
•
o
•
•
•
•
•
•
•
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
.
Korišćenje standardnog iz laza
.
.
142
File handie . .. .. . .... 1 43 Tekst opera tor : < < .. ... . .. . .. . . .. . . .. . . 145 Pr omenljive i i zrazi ....................................... 147 Nizovi i liste ... ... 151 .
.
.
.
.
.
.
.
.
.
.
o
o
Podskupovi niza: Po rci j e
o
.
•
•
•
.
•
•
•
•
•
•
.
o
•
.
.
•
•
•
•
o
.
.
.
•
•
•
.
•
•
.
.
•
•
•
o
.
•
•
.
•
•
.
.
o
o
o
o
o
o
•
o
•
•
o
•
•
o
o
o
•
•
o
o
o
o
•
•
•
o
•
•
•
•
o
•
•
.
.
o
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
153
vii
viii
Linux programiranje
Funkcije za upravljanje skalarnim nizovima: Operacije nad listama . .. ... . . . 154 t Asocijativni nizovi ...................................... 156 Upravljačke strukture .. . ... .. .. . . 158 Test izrazi .. . . . .'.............. ..... ..... ... ... 158 Logičk e komande: &&, II,! ... . ... . . .. .... . 158 Petlje . . .. . .. ........ .... . . 160 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Uslovi:
if, elseif,
Direktorijumi
Funk
c
ij
e
.
.
.
.
.
.
.
switch
unless i
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
.
.
.
.
.
...
.
.
.
. . .
.
.
.
Definisanje područja važnosti
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
tc1sh shell
iskriptovi
Tcl komande Izrazi
.
.
.
.
Promenljive Nizovi
Liste Tel
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.. 169
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.. .
.... ... .
.
.
.
.
.
. .. .
. . .
.
. . .
.
.
.
.
.
.
. .
.
.
.
.
181
.
.
.
.
.
.. .
.. .
.
175
.
182
183 184 . 184 . 186 187 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 194
.
.
.
.
.
.
. 194
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 178
.
.
.
.
.
.
...
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
165
.
.
.
.
.
.
.
.
.
165
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
....
.
.
.
.
.
.
.
.
.
.
.
Upravljačke strukture ................... Upravljačke strukture if i else ... . .. . elscif struktura . ...... . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
.
.
.
.
.
. . .
.
.
.
.
.
.
.
...
.
.
.
. . .......... 172
.
.
.
.
.
.
.
.
.
.
.
... .
..
.
.
.
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..................... 174
-
.
.
.
.
.
.
. .
.
.
ulaz i izlaz: gets i puts
Cevovodi (Pipes)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
.
.
.
.
.
.
.
.
.
.
.
...
.
.
.
.
.
.
.
.
.
.
.
.
.
... . .
...
.
.
.
.
.
.
.
.
.
.
Poglavlje7: Tool Command Language (Tel) Tcl/Tk proširenja i aplikacije
.
.
.
=
...
.
.
.' ....................... 173
šablona na promenljivima:
Poređenje
Funkcije: sub
.
.
.
.
.
.
.
.
.
.
.. . .
.
.
.. ..
za rad sa stringovima
Poređenje šablona
.
.
.
Upravljanje petljom i blokom
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.. . .
.
.
.
..
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
.
.
.
.
.
.
.
.
189
192
195 197
Struktura switch .. . . .. 198 Petlja for . .. . . . 202 Struktura foreach ...................................... 203 Komande break i co ntin ue ............................... 204 Tel file handie . . . .. . . .. ..... . . 205 Tel procedure: proc . .. . .. . . . .. . . . 208 Tel string komanda .. .. . . . . . 209 . .. .. .. .. . . . 213 Expect .
.
.
.
.
.
.
.
.
.
_
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
_
.
.
.
_
.
.
.
.
_
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Sodržoj
Poglavlje 8: Tk ......... .... . Skriptovi i wish shell . .. o
.
.
.
Tk mehanizmi ... . ... . Događaji i povezivači (bindings) .
Prozori . .. .
o
Okviri i tagovi
o
.
o
•
•
•
.
•
o
... . ..
Poglavlje 9: GNOME
.
o
.
.
o
o
.
..
o
o
.
.
o
.
.
o
o
o
•
•
•
•
•
•
•
•
o
•
•
•
•
•
215
•
.
.
o
o
•
•
•
•
•
•
•
•
o
o
•
•
o
•
•
•
•
.
•
•
•
•
•
•
•
•
•
o
o
•
•
•
•
•
•
•
•
•
o
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
.
o
•
•
•
•
o
o
•
•
o
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
..
o
... .
GNOME biblioteke
.
o
. ... .. ... .... ....... 216 .. . . ... ...... .... 216
.
o
o
.
.
o
•
.
.
o
•
o
•
•
o
•
•
•
•
•
. . ..... ..... ... .
.
.
•
o
•
•
•
•
•
•
•
o
•
•
•
o
•
o
•
•
GTK+ . ... . . Signali i događaj i ........................................ GNOME funkcije . Kompaj1iranje GNOME programa . ... . . . . ... .. . GNOMEApp, toolbar i menu mehanizmi . . . GNOME ikonice .. . . Okviri za dij alog .
.
.
o
•
•
•
•
o
o
•
•
•
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
o
•
•
•
•
•
•
•
•
.
o
•
•
•
o
•
•
•
•
•
•
•
•
•
o
o
•
•
•
•
•
•
o
•
o
•
•
•
•
•
o
•
•
•
•
•
•
•
•
o
•
•
o
•
•
•
•
•
o
•
•
•
o
•
•
o
•
•
•
•
o
.
.
Ulazi
.
.
o
•
•
•
•
•
GNOME podloga
.
.
.
.
.
.
.
.
.
.
.
o
•
•
o
.
.
.
.
o
•
•
•
•
•
o
.
.
.
•
•
•
•
•
•
•
•
•
•
o
o
•
•
•
•
o
•
•
o
•
•
•
•
•
•
•
o
•
•
•
o
o
o
•
o
•
•
•
o
•
•
o
•
•
•
o
•
•
•
o
•
o
o
o
•
o
•
•
o
•
o
o
•
•
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
o
o
o
o
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
o
o
•
•
•
o
o
•
o
o
o
•
•
•
•
o
o
•
•
.. .
•
•
•
o
•
o
o
•
o
•
•
•
o
•
o
o
•
o
•
•
•
•
•
•
•
o
•
•
•
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
o
o
•
•
o
•
•
•
•
•
•
o
•
•
•
o
•
•
•
•
o
o
•
•
•
o
•
•
•
•
•
•
o
o
o
•
•
•
•
o
•
•
o
o
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
•
o
o
.
•
•
•
•
•
•
•
o
.
.
.
.
.
...........
.
o
•
•
•
•
•
•
•
•
•
o
:
o
o
•
•
•
•
•
•
•
•
•
o
o
o
•
o
o
o
•
•
•
•
•
•
•
o
•
•
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
......
.
.
o
o
o
•
•
•
•
•
•
o
•
o
o
o
o
o
o
•
•
•
•
•
•
•
•
•
•
•
o
•
•
•
o
•
•
•
•
O bj ekti roditelj-dete Layout mehanizmi . o
o
o
•
•
•
o
•
o
•
•
.
.
•
•
•
o
•
•
o
•
o
•
.
o
.
.
.
.
.
.
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
•
•
o
•
•
•
•
•
•
o
•
•
•
o
o
•
•
•
•
o
•
•
•
•
•
•
•
o
o
'
•
•
•
•
•
•
•
•
•
•
o
•
•
•
•
•
o
o
•
•
•
•
•
•
•
•
o
•
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
o
o
•
•
o
•
•
o
•
•
•
o
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
o
o
o
•
•
o
o
o
o
o
o
o
•
•
•
•
o
o
o
•
•
o
•
o
o
o
.
.
o
o
•
•
•
•
•
•
•
•
.
.
.
.
.
.
.
o
o
•
.. •
•
•
•
o
•
o
•
•
•
•
o
o
o
•
•
o
•
•
o
•
•
•
•
o
•
•
•
•
o
•
o
•
•
•
•
•
•
o
•
•
•
•
•
•
•
o
o
•
•
•
o
•
257 258 261
269 271 273 275
.
o
.
•
•
•
•
.
•
o
•
•
•
•
•
•
.
.
•
•
•
.
•
•
•
•
.
.
•
•
.
•
253
•
.
.
245 247 251
o
•
•
•
.
•
•
•
•
. .
•
•
•
.
229 233
277 278 280 283 . . . 284 289 290 291 297 300 301 302 303 303 304 •
•
•
oO o
Kreiranj e sops tve nih mehanizama Okviri za dijalog .. .. .
.
. ..
•
.
Prozori .
•
.
o
o
.
•
•
•
o
•
•
o
Statusna linija i toolbar Qt programiranje '" Qt signali islotovi . .
•
•
•
Meta-objektni kompajIer: MOC . .
o
.
KDE biblioteke KDE aplikacije i mehanizmi Sign ali i slotovi Men ij i
.
•
Poglavlje 10: KOE .
.
224
306
ix
x
Linux
programiranje
Odgo i na pitanja iz glavne provere 311 Poglavlje 1: Uvod u Linux programiranje ... . . . 311 Poglavlje 2: BASH shell skriptovi ............................. 311 Poglavlje 3: BASH shell upravljačke strukture . ... ... . . . . 312 Poglavlje 4: TCSH shell programiranje . . . . 313 Poglavlje 5: GAWK . . . . .... .. 314 Poglavlje 6: Perl . .... . . 314 Poglavlje 7: Tool Command Language (Tel) . . . 315 Poglavlje 8: Tk . . . 315 Poglavlje 9: GNOME .. . . 316 Poglavlje 10: KDE . . 317 vor
.
.
.
.
.
.
.
.
.
.
.
.
.
Indeks
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
319
Uvod
OPERATIVNI SISTEM LINUX JE POSTAO JEDAN OD NAJVAŽNIJIH OPERATIVNIH
sistem a , kada je PC-u d ao svu snagu i fleksibilnost UNIX radne stani ce , z aje d n o sa kompletnim sku po m I nte rnet aplik ac ij a i kompletnim funkcionalnim desktop in ter fej som . Ono što možda još mnogi nisu sh va ti l i je to da svi standardni Linux sistemi podrž avaj u široki opseg programskih j e z ik a koji korisnicima o mogućavaju lako kre i ranje njihovih programa. Imajte n a umu da je Linux zasnovan na UNIX-u, koji je projektovan kao istraživačka platforma na kojoj su i s t raž ivači m o gli brzo da razvijaju svoje aplikacije. U tom duhu, sve distribucije Unuxa uključuju ve li ki izbor programskih platformi , različite jezike višeg nivoa, kao što su Perl i Td/Tk, i pro š ireno Gur p ro gram i ra n j e za de sktopove poput GNOME i KDE. Kada instalirate Linux, možete da p o č ne te sa kreiranjem so ps tvenih p r o gra m a . Ova knjiga je napis an a u "vidu vodiča Z3 po č et nike u programiranju na Linuxu. Obuhvata brojne programske platforme i jezike koji su trenutno raspoloživi na Linuxu. Sa većinom možete da počnete da radite bez prethodn o g isku stva tl pro gramiranj u , osim za G UI platforme koje su obuhvaće ne u poslednjem delu knjige. Gur programiranje pretpostavlja da poznajete C ili C+ + programiranje. Ova knjiga je podeljena n a tri glavne teme u programiranju na Linuxu: shell programiranje,jezici višeg nivoa i GUI programiranje . Pisanje shell programa ijezi ci višeg nivo a ne zahtevaju pretho dn o iskustvo u programiranj u . Prvi deo knjige obuhvata BASH i TCSH shell programiranje . BASH i TCSH su shell okruženj a na 4Linuxu koja imaju mo gućno sti za programiranje. U okviru BASH shella, možete da kreirate proste programe koj i se lako izvršavaju. BASH shell program iranje je orga nizovan o u d va modula, jedn o je osnovno, a d ru go je sa upravljačkim strukturama. Upravljačke strukture Vam d ozvoljavaj u kontrolu izvršenja programa , tako da možete da ponavlja te komande ili da izaberete komande koje će da se izvršavaju. TCSH shell programi koriste različitu sintaksu, iako priličn o slično rade.
xii
Linux
programiranje
Drugi deo obuhvata je zike višeg nivoa, uključujući GAWK, Perl i Tel/Tk. Svaki od ovih jezika Vam omogućava kreiranje veoma složenih programa kori�ćenjem nekoliko moćnih komandi. Svaki ima upravljačke strukture, a mnoge funkcionišu na sličan način. Sa GAWK-om možete lako da obrađujete podatke, generišući modifikovane verzije o riginala. Perl Vam omogućava pristup fajlovima i manipu laciju stringovima, kao i upravljanj e nizovima. Tel izvršava slične zadatke kao i Pe rl. Tk jc pro širenje Tel, koje Vam omogućava kreiranje grafičkih korsničkih interfej s a . Sa svega nekoliko ko mandi, možete da kreirate svoje prozore sa menijima i dugmadima . Tk pod ržava široki opseg GUI objekata. Treći deo o be zbeđuj e uvod u programiranje u GNOME i KDE. Poglavlje za GNOME, Deveto po gl a vlj e , bi trebalo da predstavlja krata k uvod i ne zahteva ra zu mev anje e programiranja. Pog l avlj e za' KDE, Deseto poglavlje, takođe daje uvod, mada programiranje u KDE zahteva razumevanje C+ + p rogra mi ranj a, poseb no hijerarhije kla sa . Za Vas koji posedujete ta znanja, ova poglavlja mogu da se poka žu veoma korisnima. Za one koji ne po seduj u p redzn anj e , i p ak o mogućavaj u razumevanje onoga što je neophodno za ra zvij anj e apl ikacij a za ove de skto pove . Knjiga ne obuhvata sistemske po z ive Linuxa nižeg nivoa. Oni s e često koriste za sistemsko p ro gramiranj e , za kre i r anje ap likacij a kao što su drajveri za uređaje. Oni zahtevaju ra zu mev anj e strukture Linux opera tivnog sistema, uklj u čuju ći procese, plani r anje i strukturu faj lova. To p re laz i domen knjige za početnike, i najbolje bi moglo da se uklopi u n eki s rednji nivo. Ova knjiga je u sre dsre đe n a na programir a nje za početnike koji ne moraj u da znaju kako su izgrađeni sami operativni siste mi .
Linux
progrun1lronle
o autoru
Ričard Petersen, M.L.LS, je autor knjiga Linux; Kompletni priručnik koja sada doživljava svoje treće izdanje; Linux: Priručnik za programere, izašlo je drugo
izdanje; CjC+ +
i Red
na
Hat Linux: Kompletni priručnik. Ričard takođe predaje
Berkliju, Univerzitet Kalifornija.
UNIX
i
Zahvalnice
Posebno se zahvaljujem Linusu Torvaldsu, kreato ru Linuxa. i onima kOJi su nastavili da razvijaju Linux kao o tvoreni, profesionalni i efektivni opcrat ivni sis tem koji je do stu pan svima. Hvala i akademskom ud ru žc nju kojI su zilslužni za razvijanje UNIX-a u fleksibilan i prilagodljiv oper:Jtivni sistem. 7:elf'o bih i da se zahvalim profesorima i studentima na Berkliju, Univerzitet Kalifornija, za podršku u r azvij anj u novih i različitih načina za ra zu m ev ' e c h o ' ' e c h o ' My I ndex< / TITLE> , echo ' < / H EAD> '
BAS H
shell uprovlio�ke struktu re
e c h o ' '
e c h o ' < H 1 > I nd e x of HTML Files< / H 1 > ' f o r i in
•
do if [
- d $i
l
then
echo
" $i< / h2> "
echo ' < u l> ' for
j
in
$ i / · . htm· do
if
f $j l then
t l ine= ' g rep ' <TITLE> '
if [
$1 - eq 1
$j '
l
th en n t i t l e = ' b a s e n ame
$j
cut -fi
-d" . "
else n t i tle= ' echo $tline
sed ' s r , "<TITLE> / I '
' s / � \ I T I TLE> . " $ 1 I '
I
sed
,
fi
echo " $nt it le ' fi done echo ' < I ul> '
fi done echo ' < / BODY> ' echo ' < I HTML> '
Program myindex šalje podatke na standardni izlaz, tako da treba da se preusmere
za snimanje u fajl pomoću :
$ myindex > m in dex . h t m l
Sledi primer za mindex. html. < HTML > <TITLE>My · l ndex< / T ITLE> < / HEAD> I nd e x of HTML Files< / H 1 > docnot e s < / h2>
- Why I like Perl? < / a>
59
60
Shel l
p rog ra mira nje
< l i>TeX and L a T e X Not e s < / a> < / ul> mywe b s < / h2>
mypic s < J a> My Summe r V a c at ion < / a> < J ul>
< / BODY> < / HTML>
Slika 3 . 1
prikazuje njegov izlaz, koji se javlja
u pretraživaču.
Index of HTML Rles docnotes • •
WhY I hb rW?
TeX o.ndLlltXNott..
· · mniU •
}đySymmq yoori9l)
Slika 3 . 1 Prikaz m index. html generisan myindcx shell
skriptom
Korišćenie preusmerava nia i sa upravliačkim strukturama
pipe
operaciia
Upravljačku strukturu možete d a posmatrate kao komandu koja podatke šalje na sta[1dardni izlaz. Ovaj izlaz može da se preusmeri ili provede (prenese na drugu komandu) , poput izlaza bilo koje Linux komande. U komandi upravljačke struk ture možete da postavite operator za preusmeravanje odmah posle ključne reči
na fajl. Na primer, u mylistsave fajlu, datum na standardni izlaz. Zatim se ime i datum preusmeravaju u fajl pod nazivom foods. Tako će II fajlu foods da se nađe lista sa svim artiklima. done kako bi se izlaz petlje preusmerio
komanda e cho
unutar for-in
petlje
postavlja ime i
my ltems= " m l 1 k c oo k ie s apples c h e e s e ' f o r g roce ry i n $my items Izlaz
do
ecNo ' $g rocery done
:>
•
komande
echo
se
snima u fajl pod nazivom foods
foods �-------'
BASH shel l uprovl jočke strukture
Sled i izvršenje skripta mylistsave zajedno s a prikazom kojeg kreira skript.
sadržaja fajla foods
$ myl1stsave
$ cat foodli milk
cookies apples cheese
je cbackupn skript izmenjen tako da na izlaz šalje ime faj la . Komanda echo unutar for-in petlje postavlja imena svih fajlova na standard ni izlaz. Imena fajlova se naj p re prosleđuju do filtera 'la sorti ranj e koji sortira imen a pre n e go što ih preusmeri do fajla. Primetite da je prosleđivanje postavljeno odmah iza ključne reči done. U se čuva lista svih fajl ova sa e programima koj ima su napravljene kopije. U sledećem primeru
svakog kop ira nog
for b a c k f i l e in * . c do
I
c p $bae k f i l e sou rcebak / Sbac k f i l e e c h o $backfile
done I
s o rt > c n a m e s
Sledi i zvrš e nj e
kre ira skript: $
Imena fajlova odštampana komandom echo se
11--------1
l
prosleđuju do filtera za sortiranje a zatim se sortirana imena pamte u cnames fajlu. ,
cbackup n skripta zajedno sa p rika z om cnames
fajla kojeg
cbac kupn
$ cat e n a m e s io . e
lib . e main . e
Postoji mogućnost i preusmeravanja standa r d n o g ulaza u u p ravljačku stru kturu. Kao što komanda echo štampa iz l az ne p odatke na s tan d a rd ni izlaz, tako komanda read čita p odatke s a s tan dardno g ulaza. Komanda read u n u tar petlje može da čita iz fajla. U bookrecsR skriptu korisnik kreira s kri pt z a unoš e nj e slogova u fajl baze podataka, a zatim prikazuje te slogove . U prvoj petlji korisnik unosi u knjigu slo gove koji su snimljeni u fajlu books korišćenjem d od atn og preusmeravanja na ko mandu echo. Kada se unesu svi slogovi, koristi se druga petlja za š tam panj e gamo autora i naslova za svaki slo g Ova d ruga petlj a prihvata ulaze preusmerene iz books fajla na u p ravlj ačku strukturu while. Test komanda druge petlje je komanda read. Kada komanda read pročita ulaz, nj en izlazni status je O. Dokle god p ostoj i ulaz, vraća se vrednost true. Međutim, kada komanda read detektuje end-of-file, vraća nenulti izlazni status. To znači da se petlja prekida kada se dođe do kraja faj l a Isti princip se p rime nj uj e na ulaz sa tastature kojeg unosi korisnik. .
.
61
62
Shell progra m i ranje
Komanda read nastavlja s a čitanjem ulaza sve d o k n e detektuje carriage
retum (CTRL-D)
kojim se završava unos.
I FS= : more rec=yes echo
" I nput f o rmat i s : : <price> : "
[
wh ile
" $m o r e r e c '
yes
do echo
-n
" Please e n t e r book record :
"
r e a d t it l e a u t h o r p r i c e p u b l i s h e r
!
echo
" $ t i t l e \ t $ au h o r \ t $ p r i c e \ t $ p u b l i s h e r ' »
echo
-n ' Do you w i s h t o c o n t i n u e ? '
boo k s
read m o r e r e c done
w h i l e re ad t it l e a u t h o r price p u b l i s h e r do
e c h o " $t i t l e $aut h o r " d o n e < boO k S
tim
Sledi izvršenje bookrecsR skripta. da su polja odvojena II kolone . $
Ovd e korisnik unosi celi slog odjednom, s
bookrecsR
I nput format i s : : < p r i c e> : P l e a s e e n t e r a b o o k r e c o rd : Wa r a n d peac e : Tolstoy : 1 5 . 75 : Pengu1n Do you wis h to c o nt in u e ? yes
Please e n t e r a b o o k r e c o rd : Christmas c a r o l : Dic k e n s : 3 . 5 0 : Ac a d e m i c Do you wish t o c o n t i n u e ? y e s
Please e nt e r
a
book record : I 1 1 a d : Homer : 1 0 . 25 : R andom
Do you wi s h t o c o n t 1 n u e ? yes P l e a s e e n t e r a book r e c o r d : Raven : Poe : 2 , Se : Pengu1n Do you wish t o c o n t i n u e ?
War and p e a c e
Tolstoy
C h r i s t m a s c a rol
Dic k e n s
l l il!d
H om e r
Raven
Po�
no
$ cat books Ch r i s t m a s c a r o l
D ic k e n s
3 . 50
Acad e m i c
I l iad
Home r
1 0 . 25
Random
R av�n
Poe
2 . 50
P e ngu i n
$
BASH shell uprovljočke struktu re
Tra p stru ktu re : trap Sledeća vrsta upravljačkih struktura je trap. nap
struktura
izvršava komandu ili
komande kada se desi određeni događaj . Događaj može da se desi u bilo kom trenutku i u bilo kojoj tački programa. ovi događaji se obično naz ivaj u .signalima. Kad a sistem primi s igna l izvršava se trap i kontrola se prenosi na komandu dadelj enu trap strukturi. D ole je navedena sintaksa za trap strukturu. ,
t ra p
' L i n u x · komarid e '
broj evi · signala
Trap struktura je kons truis a na za upravlj anje nekim spo lj nim
događajima
koji remete rad programa. Naj u običajeniji j e p rimer signala prekida kojeg ob i čn o š alj e koris n ik priti s kaj u ći CTRL-C. (Ako za vreme izvršenja programa pritisnf'tf' CTRL-C, p rogra m će da s e zaustavi.) Kad god se program prekine na ovakav način pos toj e akcij e k oj e Vi ili Vaš program možete da preuzmete . Naj uo bi č aj e n ij a akc ija je izlazak iz programa sa vrednošću g r eške Sistem svakom događaj u do delj uj e specifični broj. Možete da derektujete p oj avu spe cifičnog događaja korišćenjem njegovog broja. U sledeće m primeru, korisnik poku šava da zabeleži prekid tj. korisnik pritiska CTRL-C kako bi zaustavio program. Ako se p ritisne CfRL-C, trap struktura izvršava i echo i exit komandu. Broj signala za CTRL-C prekid je 2. ,
.
-
t ra p
' ec h o " Goodbye " ; e x it l ' 2
Sledeći cbackupT skript sadrži ko m an d u trap : t r ap
' e c h o Good bye j
f o r backfile in
rm c n ame s j
e x it l ' 2
*.c
do c p $b a c k f i l e
echo
sou rceba k / $ b a c k f i l e
$backfile
done I sort
>
c n am e �
U sledećem primeru, korisnik izvršava cbackupT program a zatim odlučuje da ga otkaže pritiskanjem CTRL-C, što je u kodu označeno sa �C. U tački otkazi vanja se izvršava komanda trap i pre nego što se program završi, sledi izvršenje komandi dodeljenih trap strukturi. $ c b a c k u pT AC
Goodbye $
Možete takođe da koristite komandu trap z a sprečavanje zaustavljanja pro grama zbog nekih spoljnih događaja. Na primer, pretpostavimo da ne želite da date mogućnost korisniku da sam zaustavi program pritiskanjem CTRL-C; ž e lite da se ignorišu svi spoljni događaji. Komanda trap može da presretne događaj CTRL-C i spreči ga da poremeti izvršenje programa. To možete da izvedete
6J
64
Shell programiranje
uno šenj em sku p a p ra znih navodnih z na kova na mestu prvog argumenta komande trap. Ako se u okviru komande trap n e navede Linux komanda, ona samo sp re čava d oga đ aj e koj i bi m o gli da zaustave program. Dole prikazana komand a trap će d a presretne CTRL-C do gađ aje i s preči zaustavlj anj e programa ako korisnik unese CTRL-C : t ra p
"
2
U sledeće m primeru, O sign al označava
nailazak
end - of pro gra m karaktera. -
Kada se koristi sa komandom trap, ovaj broj označava da se k omand a trap
izvrš ava svaki put kad a se program završi . Bilo da se program završava zbog prekida ili zbog nailaska komande exit, ili prosto izvršavanjem posle d nje komande u programu aktiviraće se komanda trap i izvrš iće se njena akcij a U sl edećem primeru, poruka "Goodbye" se št a mp a svaki put kad a se program završi, iz bilo kog razloga. ,
.
t ra p ' e c h o ' Go o d by e "
0
Ova kom and a trap se unosi u cbackupG skript, prikaza n ovde, zajedno sa ostalim trap koma nd ama koje proveravaju pojavu p re kida CTRL-C, koji se označava sa brojem 2, se uklanj a u ovom slučaju kako bi se ilustrovalo kako radi .
zamka
O.
t rap t rap
"
'
1 3 15
ec h o
' Goodbye " ' 0
f o r bac k f i l e in
* . c
do c p $backfile sou rceba k / $backfile echo $backf ile
done I sort
>
cnames
Ovde su prikazana dva izvršenja cbackupG skripta, jedan s a standardnim završavanjem, a drugi sa CTRL·C prekidom .
$ c b a c k u pG
Goodbye $ $ c b a c k u pG �G
Goodbye $
Tabela 3 .4 prikazuje različite sign ale i
daje opis
sva ko g signala.
BAS H
Signali
�hell uprovljočke 5tru ktur�
Opis
O Kraj programa
Završava program
l spuštanje
Prekida komunikacionu liniju
2
Prekid
3
Kraj
sa
terminala
9 Ubijanje IS
S o ftvers ko ubijanje
24 Stop
Pritisak na taster za prekid DELETE
•
CTRl·C ili
Pritiskanje CTRL- I ili CTRL· \ Ubija program; ne može se presresti Koristi komandu kill za završavanje programa Zau stavlj a program s a CTRL·Z; ne može se presresti
GLAVNA PROVERA
Da li mogu da se ugnežđavaju if strukture? Kako ćete da implementirate podrazumevanu opciju u case operaciji? 3. Kako možete da čitate argumente skripta jedan po jedan, obrađujući svaki od njih? 4 . Koj a se komanda koristi za automatsko detektovanje opcije koja je unela u ko ma nd nu liniju? 1.
2.
5.
Da li Vaš program može da izvršava bilo kakve komande nakon što ga korisnik prekine sa CTRL-C?
65
TCS H shel l p rog ra m
U TCSH SHELLU MOŽE
e
PROGRAMIRA, KAO I U BAS H S H E LLU . MOŽETE DA im dodeljujete vrednosti. Definicije promenljivih i Linux komande možete da postavite u skrip t fajl, a zatim da ga izvršite. Možete da koristite p etlj e i upravljačke strukture za p onavlj anje Linux komandi ili za don oše nje odluka o tome koj e će komande da se izvršavaj u. Možete da pos tavite i zamke (tra p s ) u programu tako da se spreči prekidanje izvršenja programa. TCSH shell se razlikuje od ostalih po tome što se njegove upravljačke strukture malo više uklapaj u u form at programskih jezika. Na primer, test uslov za upra vljačku strukturu TCSH sh ella je izraz koji vraća vre dnost true ili false , a ne Linux komandu. Izrazi u TCSH shellu koriste iste operato re kao i programski jezik C. Možete da izvršavate različita d o d e lj iva nj a , aritmetičke, relacione i DA
SE
definišete p rome n lj ive i da
bitwise operacije. TCSH shell Vam takođe omogućava da deklarišete numeričke
vrednosti koje mogu lako da
TCSH
se koriste u ovakvim operacijama.
shell promeniiive, skriptovi
i a rg u menti
TCSH shell koristi shell promenljive na isti način kao i BASH shell. Možete da d e finiš ete p rome nlj ive u sh e llu i da im dode ljuje te vrednosti, kao i da pozivate argumente s krip ta . Takođe, možete da definišete prome nlj ive okruženja koje rade na s ličan način kao eksportovane promen1jive u BASH shellu. TCSH shell se razlikuje po n a či nu definisanja p rome nlj ivih i tipu promenljivih koj e g možete da 4efinišete. TCSH shell definiše promenljive pomoću komandi set, @; i setenv. TCSH s he ll Vam takođe om ogućava da definišete numeričke prome nlj ive i nizove. Komanda @ definiše nume ri čku promenljivu na kojoj mogu da se izvrš avaj u a ritme tičke ope ra cij e . Male i velike zagrade Vam om o gu ć avaj u da d e finiš ete i pozivate n i zove . Skriptovi takođe funkcionišu na isti način, ali postoji nekoliko suštinskih razlika. TCSH shell mora d a počinje sa tarabicom (#) u prvoj koloni prve linije.
68
Shelf prog ra m i ranje
Takođe, iako se prompt može odštampati komandom echo, morate da preusmera
vate standardni ulaz u pro menlj ivu .
TCS H she l l prome n i i ive u TCSH shellu morate najpre da deklarišete promenijivu pre nego što počnete da je koristite. Možete da deklarišete promenljivu pomoću komande set iza koje sledi ime promenljive . Evo pravila za imenovanje promenljivih: •
Mogući su bilo koji nizovi alfabetskih znakova, uključujući karaktere za podvlačenje.
•
Mogu da sadrže brojeve, ali broj ne može da bude prvi karakter imena.
•
Nisu dozvoljeni ostali tipovi karaktera, kao što su uskličnici, tačka zarez iIi bIanko znak (razmak) . Ovi simboli su rezervisani za shell. Sledeći primer deklariše promenijivu greeting. Promenijivu možete kasnije
da razdefinišete komandom unset. set g reet ing
Ime ne može da ukliučuje više reči jer shelf ra zdva j a komandnu l i n i j u b l a n ka z n a kom Bia n ko znak je graničn i k za razdvajanje e le m e na ta u koma ndnoj l i n i j i .
.
koristite i za do d elj ivanj e vrednosti prom enljivoj Unesete promenljive; operator dod ele = ; a zatim dodeljenu vrednost. Promenijivoj može da se dode1i bilo koji niz karaktera. U sledećem primeru, p romenijivoj greeting je dodeljen string "hello" . Komandu set
.
ključnu reč set; ime
>
,
set greetlng= " hello '
Kod operacije dod ele u TCSH shellu, morate da postavite blanka znak sa obe strane operatora dodele, ili ih uopšte ne navoditi. Ovakav operator dodele >
set g reet ing = " hello '
je neispravan jer po stoj i blanka znak pre operatora dod el e ( = ) , a posle ga nema.
Možete da dobijete listu definisanih prome nlj ivih korišćenjem komande set argumenata. Sledeći primer ko risti set za pri ka ziva nj e liste svih definisanih promenljivih i njihovih vred nosti : bez
:>
set
g reeting h e l lo POf!t
Virg i l
Kao i u BASH shellu znak za d olar ($) je specijalni operato r koji izračunava shell promenljivu. Izračunavanje vraća vrednost promenljive obično niz karaktera. OVaj niz karaktera zamenj uje ime promenljive Zato, svaki put kada pre imena ,
.
.
TCSH sn�1I progromiranje
promenlj ive postavite $, shell zame nj uje ime promenljive njenom vrednošću. U sledećem primeru, izračunava se shell promenlj iva greeting, a zatim se nj en sadržaj
"hello" koristi kao argument na ekranu . >
II
echo komandi. Komanda echo štampa niz karaktera
e c h o $ g r e e t i ng
hello
Kao i u BASH shellu , jednostruki i dvostruki znaci navoda i kose crte sprečavaju izračunavanje specij aln ih karaktera. Takođe, kosi navodnici m ogu da
se koris te za d od el u rezultata komande promenljivoj . U
d vo s tru ki znakovi navoda okruž uj u s p ec ij al n i >
set n o t ic e
>
e c h o $not ice
Is
the
�
" Is
karakter ?
sledećem primeru,
t h e meet ing t omo r row? "
m e e t ing t omo r row?
>
TCS H she l l skri ptovi : U laz i izlaz Možete lako d a definišete korišćenje promenljivih u shell skriptu. Kao u primeru koji će sledeći put da bude n ave d en, postavljate linux komande, kao što su operator
dode1e i echo, II f operatorom.
TCSH shell nemo odgovora j uću verziju za
read
komandu iz BASH s ne l l a .
TCSH shell is pituj e prvi karakter fajla kako bi odredio da li je reč o TCSH shell skriptu. Zapamtite da svi TCSH shell skriptovi moraj u u prvoj l inij i kao prvi znak da imaju #. Na taj način se identifikuje TCSH shell s krip t . Primetite znak # na p očetku greet skripta. Kada se # postavi na bilo kom drugom mestu u faj lu, tretira se kao običan kara kte r. # # S c r i p t to o u t put h e l l o g r eet i n g s e t g re e t i n g = " he l l o " e c h o T h e v a l u e of g reet i n g i s $g r e e t i n g
U sledeće m primeru se skript greet postavlja izvršnim, a z ati m >
chmod
u+x
g reet
izvršava.
69
70
Shell programiranje
>
greet
The value of greet i ng
is
hello
Komanda set u kombinaciji sa operacijom preusmeravanja,
$
set greeting
=
$
.
echo - n Please e n t e r a g reet ing :
Ako želite da uključite bIanko znak na kraju prompta, morate da postavite izlazni string sa dvostrukim znacima navoda, uključujući i bIanko znak: >
echo - n " Please e n t e r a g r e e t 1 n g :
"
Dole prikazarii greetpt skript sadrži TC SH shell verziju prompta koj i ostaje u
istoj li niji kao i ulaz. #
echo
·n
" Please e�t e r a
s e t g re e t i ng
g r eetin g :
$
greetpt
Please ent e r a g reeting : h e l lo T h e g reet i n g you e n t e red was h e l lo �
N izovi : () i
#
U TCSH shellu možete da deklarišete i koristite nizove, i da pozivate svaki elemenat niza. Nizove deklarišete komandom set i listom vredno sti za svaki elemenat niza . Lista vrednosti se navodi u okviru zatvorenih zagrada, a svaka vrednost je odvojena bIanko znakom. Veličina ovog niza odgovara broju do delj enih vrednosti. Sledeći primer d eklariš e niz pod nazivom weather i dodeljene su mu tri vrednosti (pogle daj te sliku 4. 1) . Niz weather će da ima tri elementa, gde svaki ima njemu od gova raj u ću vrednost: ;> set
ti�1 vr�e�d�n�o�s� ta� · s� Ll� we a the r '" ( hot cold ra in ) ....Cf---�=-�
Imenom niza se
pozivaju e lementi
u nizu . Sledeći primer štampa ceo niz.
TCS H
>
shell prog ramiranje
e c h o $weat h e r
hot cold rain
Pojedinačne elemente niza možete da
pozivate postavljanjem
elementa
unutar z atvo renih velikih zagrada. Elementi u n iz u su numerisani, počevši od S l ed eći primer dodeljuje novu vrednost prvom elementu niza:
+
>
s et weat h e r ! 1 ]
>
e c h o $weat h e r
=
1.
r---'I -:-_ Indeks
sunny
niza
s u n n y cold rain
Zatim, možete d a p ristup a te s a drž aj u elementa, b a š kao i promenljivoj, tako št o ispred elementa navedete znak za dolar ($) . Sledeći primer štampa sadržaj trećeg elementa : >
t
e c h o $we a t h e r [ 3 ]
rain
-
;=.--------------,
_______
Izračunava element niza
1
weather %
2
3
! 1 ] weather [ 2 ] weather [ 3 ]
set weather (hot
cild
rain)
Slika 4. 1 TCSH nizovi U wreport
skriptu se definiše niz weather i koristi u samom skriptu : >
# s e t weat h e r
=
( hot cold rain )
e c h o " T h e weat h e r t oday is $we a t h e r [ 2 ] " e c h o " Tomo r row t h e r e will be $w e a t h e r [ 3 ]
"
Dole je prikazano izvršenje wreport skripta: >
wreport
The weat h e r today i s cold Tomor r ow t h e r e will be rain >
Opseg elemenata se može specificiranjem početka i kraja opsega, odvojenih crticom unutar zagrada. Sledeći primer štampa vrednosti drugog i trećeg elementa: >
� 1--- Skup elemenata niza
e c h o $we a t h e r [ 2 · 3 ]
cold rain
___ _____---,
71
72
Shell programiranje
Pitajte stručnjaka Pitanje: Kako da znam broj elemenata niza? , Odgovor: U svakom nizu postoji promenljiva u kojoj se čuva broj elemenata niza. Promenljiva se poziva navođenjem imena niza ispred kojeg stoji znak #. Na primer, promenlj iva koja čuva broj elemenata niza weather j e #weather. Kao i u slučaju bilo koj e druge promenlj ive , sadržaj u #weather pristupate navođenjem $ ispred nje, $#weather. U ovom primeru se štampa broj elemena ta niza weather: >
echo $#we at h e r
3
N iz a rg u menata : argv
Kada s e po ziva shell skript, sve reči u komandnoj liniji s e razdvajaju i postavlja
ju u elemente niza pod nazivom argv. Niz argv ( 8 )
pam ti
ime shell skripta, i
počevši od argv [ 1 ] , svaki sledeći element pamti jedan argument unešen u
komandnoj lin ij i . U sluč aj u shell skripta, argv [ 0 ] uvek pamti ime shell skripta. Kao i kod bilo kog elementa niza, mo že te da pristupite sadržaju elemenata niza argumenata navođenjem operatora $. Na prime r, $ argv [ 1 J pristupa sadržaju p rvo g elementa u nizu argv. U greetarg skriptu se pozdrav prosleđuj e kao prvi argument u kom a ndnoj liniji. Prvom argumentu se pristupa sa $ argv [ 1 J . # echo " The g r e eting you e n t e red was :
$argv [ 1 ] "
Sledi izvršenje greetarg skripta: >
g reet arg Hello
The g reet ing you e n t e red was : Hello
Sve reči u komandnoj liniji se razdvajaju, o si m ako nisu navedene pod znaci ma navoda. U sledećem prime ru se poziva greetarg skript sa stringom bez, a zatim sa znacima navoda. Primetite da se string pod znacima navoda " Hell o, how are you" tretira kao jedan argument. >
g reetarg HellO , how are you
The g reeting you >
ent ered
greetarg " Hello , how
wa s ;
are
Hello ,
you "
The g reet ing you ente red wa s ; Hello , how a r e you >
više argumenata, argumenti mogu da se po zivaju pomoću u argv nizu. U sle d eće m primeru, myargs skript štampa četiri argumenta. Unešena su četiri argumenta u komandnoj liniji Kada
se un e se
odgovarajućih
e le me nata
(pogledaj
4.2)
sliku
TCSH shel l
progra m i ranje
# echo " Th e f i r st a rgument is : $ a r gV [ 1 ]
"
e c h o " T h e s e c ond a rg u m e n t i s : $a rgv [ 2 ] " ec h o " The t h i rd a rgument is : $arg v [ 3 ] " ec ho- " Th e f o u r t h a rgument i s : $a rgv [ 4 ] "
Sledi izvršenje >
myarg
skripta:
myargs H e llo Hi yo " How are you '
The f i r s t a rg u m e n t i s :
Hello
The s e c o n d a rg u m e n t i s : H i
T h e t h i rd a rg ument i s : yo T h e f o u r t h a rg u m e n t i s : How a re you
Skri pt wreport je prepisan kao wreporta kako bi koristio argumente. Argumenti wreporta skripta su brojevi koji indeksiraju weather niz. Prvi argu ment je 2, kojim se poziva promenljiva $ argv [ 1 ] . Drugi argument je 3, kojim se po z iva $ argv [ 2 ] . U ovom primeru $weather [$ argv [ 1 ) ] poziva weather [ 2 ] ,
a to j e cold. Izvršenje myargs skripta Niz komandne linije: o
I
argv array myargs
Hello
I
2
3
hi
yo
argv[O] argv[l] argv[2] argv[3]
Running the myargs
I
1
Script
echo "the first argument
is
$argv[l] "
echo "the second argument is $argv[2] "
myargs
echo "the third argument is $argv[3] "
echo "the fourth argument is $argv[4] "
Slika 4.2 Niz argv za argumente komandne linije
# set weat h e r
=
( h o t cold rain )
echo " T h e weat h e r t oday is $weat h e r [ $a rg v [ 1 1 1 " echo " Tomor row t h e re will be $we at h e r [ $argv [ 2 ] ] "
Sledi izvršenje wreporta skripta: >
wreporta 2 3
The weat h e r t oday is cold Tomo r row t h e re will be rain >
argv
I How
4 are
you
argv[4]
'
73
14
Shell prog ra m i ra n je
Element argv može da bude s k raćenica za broj elemen ata koje m pretho d i znak $. $ argv [ 1 ] može da se piše i kao $ 1 . Ovo z nači da TCSH shell mož� da uključu j e pozive a rgumenata što je veoma sl ično pozivu a rg umen ata u BASH shel l u .
Pita jfe stručnjaka
Pitanje: Mogu li da pozovem sve argumente odjed nom ? Odgovor: Specijalni argument promenljive ar gv [ * 1 poziva sve promenljive u komandnoj l i nij i $ argv [ * 1 može s kra će n o da se z a pi suje sa $ * . Setite se da se na isti način pozivaju svi argumenti u BASH shellu. U sledećem primeru, skript allargs koristi i $ argv [ * ] i $ ± ža poziv svih argumenata. .
# echo
$argv [ * l
echo $*
Sledi >
izvršenje allargs slaipta:
allargs Hello Hi Salutations
Hello H i Salutat ion s H e l l o H i Salutat ions
Pitanje: Mogu li da znam broj argumenata koje korisnik un e s e u ko mandnoj liniji? Odgovor: Argument promenljiva #argv sadrži broj argu menata koji se unose u komandnoj liniji. Ovo je korisno kada se određuje fiksan broj argumenata za skript. Broj može da se proveri kako bi se utvrdilo da li je korisnik uneo tačan broj argumenata. U sledećem primeru, argnum skript štampa broj argumenata koje je korisnik uneo: /I e!;ho " Th e number of a rgume n t s e n t e red is $#a rgv "
Sledi izvršenje argn u m skripta . �
argnum HellQ hi salut.tions
The num�e r cf a rgume n t s entered i s 3
Arg/ist skript i slika 4.3 prikazuju korišćenje i argv [ * ] i #argv specijalne argument promenljive. Korisnik najpre prikazuje broj argumenata korišćenjem #argv, a zatim koristi argv [ * J kako bi prikazao unešen u listu argumenata. lt echo " Th e n u m b e r of a rgume n t s e n t e red is $#a rgv " echo " T h e l i s t 01 a rg u me n t s i s :
Sledi izvršenje arglisr skripta : >
arglist Hello hi yo
$ a rgv [ ' ] "
Broj argumenata komandnoj liniji
u
Lista argumenata komandne linije
TCSH shel l
progro m l l o n le
The numb e r of a r g u m e n t s e n t e red is 3 T h e l i s t of a rg u m e n t s i s : Hello h i yo
N umeričke promen ljive: @
u
TCSH
shell u možete da deklarišete numeričke proll1enlJ ive kmišćPlljell1
komande umesto komande
set.
relacione i bitske operacije na tim promenlj ivill1 (naravno operatore) .
Broj argumenata
$#arglist Hello hi yo
3
..
t
argv array
\I Z
odgovarajuće
�
.._--------
#argv
@
Zatim možete da izvršavate aritmetičke,
Lista svih argurTlPTlata argvf*l ,-------,
'-'_"""".-\-....-.......""""""""''''' " '''' ''' '''' '' '''' '"'' '''' '' ''' ''''''' ;
argv[O] argv[1 ] argv[2] argv[3] echo "the number of arguments = $#argv" echo "the list of arguments arc Sargv[*]"
argv niz Slika 4.3
#argv i argv [ * l pramenijive
Po ovome je TCSH shell sličan programskim jezicima. Numeričke i string promenljive su dva različita tiRa objekata, i njima sc u p r avlj a na različite načine. Za numeričku promenijivu ne možete da koristite komandu set. Komanda @ sadrži ključnu reč @, ime promenlj ive i operator dodele, a zatim izraz. U sledećem primeru se deklariše numerička promenljiva num i d o d e lj uje joj se vrednost 1 0 . >
@ num
=
10
Možete da koristite različite operatore dodele, ka-o šfo su operatori za inkre ment i operatori aritrnetičkog dodeljivanja. Isti operatori se koriste i za GAWK (koji će da bude disku tovan u petom poglavlju) i u programskom jeziku C. Izraz nfože da bude aritrnetički, relacioni ili bitski. Možete da kreirate složenije izraze korišćenjem zagrada. Operatori bi trebalo da se u izrazu razdvajaju bIanko znakovima; na primer, 1 0 * 5 nije tačan izraz, i trebao bi da se zapisuje kao 10 * 5 . Takođe, možete da koristite i numeričke promenljive kao operande u izrazi ma. U s le d e će m primeru je deklarisana promenljiva count kao numerička, a zatim je iskorišćena u aritmetičkom izrazu . Primetite da se count izračunava sa operatorom $ tako da se u izrazu koristi vrednost za c0W1t, 3 .
7S
76
Shell programiranje
> (il count > (il num
=
=
3
I
�__
Operacija dodele sa aritmetičkim izrazom
2 *
1 0) >
echo $num
26
TCSH shell aritmetički ope ratori su navedeni u tabe li 4. 1 . Sledeći p rimer koristi dva različita operatora dodele z a inkrementiranje pro menlj ive num za j e dan ; op erator inkrementa ( + + ) i aritmetičko sab iranj e sa operatorom dodele ( + = ) : > � num >
�
$num + 1
@ num +� 1
> (il
num++� _-::= Inkrement L:::
___ ...,
Aritmetički operatori
Funkcija/Opis Unarni o perator minus
+
Sabiranje
*
Množenje
O d u zimanj e
Deljenj e
I %
Modulo
Operatori dodete D odelj ivanj e Sabiranj e sa iz razo m, a zatim dodela Oduzimanje od i zraz a, a zatim dodela
+=
*=
Množenje sa izrazom, a zatim dodela
/=
Deljenje
izraza, a zatim dodela
Inkrementiranje promenljive
++
Dekrementiranje promenljive
Kao što možete da vidite na sledećem primeru, numeričkoj p rome nij ivoj možete da dodeljujete rezultat aritmetičkog izraza. > @ num >
50
e l; h o
•
10
$num
*
5
TCSH shell programironje
Relacione operacije vra�aju aritmetičku vrednost l
U sled e će m primeru, vrednost
operacije >
true .
@ count
> @ num >
=
'"
za
true,
o
num će da bude
l
za
O
zo
fa lse
jer je rezultat relacione
3
( $count
10)
Deklaracija niza
numeričkih
elemenata je komplikovanija zbog činjenice da
Vam j e neophod na komanda set kako bi se naj pre deklarisao niz. Zatim koristite komandu @ za dodelj ivanj e numeričkih vrednosti individualnim elementima niza.
U sledećem primeru je najpre deklarisan niz degrees, a zatim su mu dodeljene vred nosti Iako ove vrednosti mogu da budu bilo koji brojevi, oni se ne posmatraju .
kao numeričke >
vrednosti.
set d e g r e e s
=
(0
45
0)
Kada z a dodelu numeričke vrednosti elelmentu koristite komandu @, el ement postaje numerička vrednost. Tada po zivate element navođenjem broja između velikih zagrada. U sle d e će m primeru se prvom el e m e n tu dodeljuje numerička vrednost 1 00 : @ degrees [ 1 ] = 1 00 echo $degrees [ 1 ] 1 00
>
>
>
.
Promen i i ive o kruženia : setenv
TCSH shell ima dva tipa promenljivih: lokalne
promenljive
i promenljive okruženja.
Lokalna promenljiva je lokalna za she ll u korn je deklarisana;
promenljiva okruženja
funkcioniše slično specijalnoj globalnoj promenljivoj . Promenljiva okruženj a je
poznata svim subshell-ovima ali ne i roditeljskim shell-ovima. Promenljiva okružnja se definiše komandom setenv. Promenljivoj okruženja možete da d odelj ujete vrednosti korišćenjem koman de setenv, imena p romenlj ive i dodeljene vrednosti. Nema operatora dodele. U sled ećem primeru, promenljivoj okruženja greeting se dodeljuje vrednost :hello". >
setenv greet1ng hello
Kad god se poziva shell skript on generiše svoj shell. Ako se shell skript ,
izvršava iz nekog drugog shell skripta, imaće svoj shell posebno od shella za prvi skript. Sada postoje dva shella: roditeljski shell koji pripada prvom shell skriptu i subshell, kojeg generiše drugi skript kada se izvršava.
77
78
She l l p rogra m i ronje
Sva ki shell imo svoj skup promenljivi h . Subshell ne može da poziva lokalne prome n l j ive roditeljskog shel la, a l i može da poziva promenljive okruže n j a . Sve pr�me n l j ive okruženja se deklarišu u roditeljskom shel l u i mogu da se pozivaj u u svi m subshel lovima .
U sledećem primeru se pro m enljiva myfil e definiše kao promenljiva okruženja za dispfile skript. Primetite da se koristi komanda setenv umesto set. Sada promenljiva myfile može da se po z iva iz bilo kog subshella, kao što je na primer shell koji se generiše kada se izvršava prinftle skript. Korisnik je već kreirao fajl pod nazivom List sa ulazima sa ekrana, modema i papira. Ovde je prikazan dispfile skript: # s e t e n v myf i l e " L ist ' e c h o " Di s p l a y i n g $myf i l e '
cat
- n $myf ile
p r i n tf ile
Sledi prinftle skript: # e c h o " P ri n t i n g $myf i l e " l p r $myf i l e &
U sledećem primeru je prika z ano izvršenje dispftle skripta: >
d i spfile
D i s p l ay i ng List 1 screen 2 modem 3 paper Printing List
Kao što je prikazano na slici 4.4, kada se izvršava prinfile, moguće je direkt no pristupiti promenIjivoj myfile definisanoj u shell u dispfile skripta. J E D N OM I N UTNA VEŽBA • • •
Kako se dodeljuju vrednosti promenljivoj? Kako ćete promenijivoj da dodelitc numcričku vrednost?
Koji se specijalni niz koristi za čuvanje argumenata • Koristite komandu set i operator dode/e. •
•
Koristite komandu @ i operator dodele. Niz argv.
shell
programa?
TCSH shell prog remirenje
myfile je promenljiva okruženja poznata svim subshellovima i može da se poziva iz njih setenv myfile "Ust" myfile
I
dispfllc echo "Displaying cat -n $myfile
printfile
List
-7
$myfile" ""
____
Slika 4.4 TCSH shell promenljiva
okruženja pozvana unutar subshella
Tabela 4.2 navodi uobičajene
linije
TCSH
J
shell komande
TCSH komande kao i argumente komandne
Funkcija/Opis
echo
Prikazuj e vrednosti.
-n
Eliminiše postavljanje nove l i nij e na izlazu .
eval
Izvršava komandnu liniju.
exec
Izvršava ko m andu tekućeg procesa. Ne generiše novi subshell, već koristi tekući.
exit
Izlazi iz tekućeg shella.
setenv var •
printenv s et
@ shift
u n s et
u n sete nv
Čini promenljivu d o s tup n om za p o z iva nj e iz svi h novih subshellova (poziv po referenci) . Prik az uj e vrednosti promenljivih okruženja. Dodeljuje novu vrednost promenljivoj . Ako se ko ris ti sama, izlistava sve definisane pro menlj ive . D o delj uj e numerički izraz. Pomera argument komandne l in ije za jedno me s to ulevo tako da se p o ziva broj u ve k z a j edan m anj i od p reth odnog - na primer, argument $3 se poziva sa $2 i tako re d o m , $ 1 se gub i . Razd e fini š e p ro m enijivu . Razdefiniše promenijivu okruž e nj a .
79
80
Shel l
p rog ra m i ra n j e
Argumenti
linije
komandne
$argv [ 0 ] $0
$argv [ n ] $n $argv [ * ] $* $#argv $#
Opis Ime
Linux komande . n-ti argument komandne linije koja počinje od 1, $ 1 do Sn. Za nj i hovo menjanje koristite komandu set. Svi a rgumenti komandne linije, počevši od L Za njihovo menjanje koristite kom a nd u set. Broji argumente komandne linije.
U pravliačke
stru ktu re i switch i foreach Kao i
operatori :
while, if,
ostali shellovi,
TCSH shell ima skup u pravlj a čkih struktura koje Vam kontrolu izvršenja komandi i skriptova. Možete da koristite petlje i uslovne upravljačke strukture za ponavljanje Linux komandi ili odl učiva nj e koje će koman de da budu izvršene. Upravljačke strukture while i if su upravljačke strukture opšte name ne koje i zvrš avaj u iteracije i donose odluke korišćenjem ra zliči tih testova . Upravljačke strukture switch i foreach su specijalizovanije ope racij e . Struktura switch je ograniče ni oblik if uslovne strukture koji provera va da li je vrednost jednaka jednoj od vrednosti iz skupa. Struktura foreach je ograničeni oblik petlje koji prolazi kroz listu vrednosti, i u svakoj i te racij i prornenljivoj dodeljuje novu vrednost. Petlja while i uslovna struktura if funkcionišu slično on im a u programskim jezicima. omo guć avaju
TCSH she l l se rozlikuje od o sta li h shellov!] po tome što su po formatu n j eg ove u p ra vl jačke stru ktu re slične o n i m a u progra mskim jezicim a . U s l ov koji se ispituje u TCSH shell upravljačkoj strukturi je izraz koji vra ća vrednost true i l i false, a n e Li nux koma ndu . Klj učna razliko i z među BASH s he l l i TCSH she l l upravl jačkih stru kt u ra je to što TC SH shell upravljačke stru kture ne mogu da preusmeravaju i p rosleđuju svoje izlaze. One su s tr iktno u pravljačke stru ktu re i kontroli�u samo izvršenje koman d i .
Petlja se
testa ne vrati false. Uslovna struktura if Izraz testa je TCSH shell izraz, a operatori koji se koriste u TCSH shell izrazima su sličn i o ni ma koj i se koriste II programskom jeziku C. Shell koristi široki opseg operatora dodele, aritmetičkih, relacionih i bitskih operatora, s tim da mnoge od njih možete da sretnete i u BASH ili PDKSH shellu. Poput e izra za, TCSH shell izraz je tač an ako vraća nenultu vrednost; netačan je ako je rezultat O. Struktura switch radi slično ograničenoj verziji if strukture. Ona po red i string sa skupom mogućih šablona. Ako dode do pok1apanja, izvršavaju se ope racije dodeljene pokloplj e nom šablonu. Korisna je za imeplementaciju meni ja, kod kojih ko ris n i k bira jednu od nekoliko ponuđenih opcija. nastavlja sve dok izraz
izvršava svoj e komande ako njegov izraz testa vraća true .
TCSH shell prog romironje
Struktura foreach prolazi kroz listu vredn o sti i pri tome određenoj p rome nlj ivoj d od elj uj e svaku vrednost. Nema ispitivanja. Lista vrednosti može
d a bud e sastavlj ena oĆi šablona i specijalnih karakte ra shella. Na primer. zvezdi· ea (*) generiše listu naziva faj lova . Lista vrednosti može takođe da se odredi i skupom reči. U tom s lučaju se svaka reč pridružuje promenljivoj for. Petlja se nas tavlj a sve dok se ne dodele sve vrednosti.
izrazi
Test
Upravlj ačke strukture if i while koriste izraze u svojim testovima. Tačan test je svaki izraz koji vra ća nenultu vrednost. Netačan test je svaki izra z koji vraća vrednost O. U TCSH sh e ll u kao test izrazi lako mogu da se koriste relacioni izrazi i izrazi j ed nakos ti jer su njihovi rezultati l za true, a O za false. U izrazima možete da ko risti te brojne operatore, koje možete da vidite i u tabel i 4.3. I zraz može da bude i a ri tm et ički ili može da poredi stringove. ali stringovi se po rede
samo da s e utvrdi da li su jednaki ili ne. Za ra zliku od BASH i PDKSH shellova, u TC SH shellu if i while test izra ze morate da navodite u malim zagradama. Sledeći p rimer p rikazuje test izraz koji ispituje da li su dva stringa jednaka: if
(
$greet ing
: Poređenje jednakosti sttingova I - ---�tt: ..,.., _.,...=-
=,;4' hi · )
then
e c h o I n f o rm a l Greet ing e n d if
TCSH
shell irna p os eban sku p operatora za ispitivanje s tri ngova sa drugim
s tringovima ili sa re gula mim izra z im a : • •
O p era to ri = = i ! = is pituj u jednakost j nejednakost s t ringova . O p e ratori = - i 1 - porede s tring sa regulamim izrazom i određuju poklapanje šablona u�p e š no ili ne.
Poređenje stringova
da li je
Funkcija/Opis Jednakost stringova
!= =
-
Nejednakost str ingova Poredi string i šablon rad i u tvrđ ivanja jednakosti; šablon može da bude re gul aran i zraz Poredi string sa šablonom radi utvrđivanja
nejednakosti; šablon može da bude
regularan izraz
Logičke operacije
&& I I
Logičko I Logičko ILI Logičko NE
81
82
Shell programiranje
Testovi za fajlove
-w
Faj l postoji Fajl se može da čita Moguć je upis u fajl i modifikacija
-x
Fajl mo že da
-d
Ime fajla je naziv direktoriju ma Fajl je obič a n fajl Faj l ima vlasnika Fajl je prazan
-e -r
-f
-o -z
se izvršava
Relacioni operatori nego M anj e ne go Veće ili jednako M anj e ili jednako Različito Jednako
>
Veće
< >=
skripta:
lscholcew
1. List Sizes 2. List All File Information 3. List e Files 4. Quit Please enter choice: 3
main . c
lib.c
file.c
1. List Size s List All File Information
2.
3. List e Files 4. Quit Please enter choice: 4
Good·bye >
Struktura foreach
Struktura foreach je projektovana za sekvencijalno pozivanje liste vrednosti. Slična
je for-in strukturi u BASH shellu. Struktura foreach uzima dva operanda -
promenljivu i listu vrednosti u malim zagradama. Svaka vrednost iz liste se dodelju
je promenljivoj foreach strukture. Kao i while struktura, i foreach je petlja. Svakim prolaskom kroz petlju se vrši dodela vrednosti iz liste promenljivoj.
Petlja se zaustavlja, kada se dođe do kraja liste. Poput while petlje, kraj tela
I1etlje je označen ključnom reči end. Sintaksa foreach petlje je: f o reach promenljiva (lista vrednosti)
komande e nd
Foreach petlja je korisna za upravljanje fajlovima. U ovoj strukturi možete
kao šablone da koristite specijalne karaktere shella za generisanje liste naziva
91
92
She l l prog ra m i ra n j e
fajlova koju koristite kao listu vrednosti. Ova generisana lista fajlova zatim postaje lista koj u poziva foreach struktura. Zvezdica generiše listu svih fajlova u direktorijumu. Š ab l on *.c izlistava sve fajlove sa ekstenzijom .t. To su obično fajlovi sa izvornim kodom na programskom je z i ku C. Sledeći primer pravi kopiju svakog fajla i pos tavlj a kopij u u direktorijum pod nazivom sourceback. Š ablon *.c generiše listu naziva svih fajlova na kojim a funkcioniše foreach struktura. Dodeljuje sledeći fajl na listu u promenijivu backfile u svakoj iteraciji
# foreach backfile (
* .e
l�----+-
cp $baekfile soureebak/$baekfile
Generiše listu svih fajlova koji se završavaju sa .C
echo $bac kf ile end
Sledi izvršenje cbackup skripta : cbackup io.c
>
Ub.c main.e
Ako s e foreach struktura nave d e bez određene liste vredno sti, za listu uzima argume nte komandne linije. Kada se pozove shell fajl, argumenti komandne linije
postaju lista vrednosti koju poziva foreach s truktu ra .
Promenljiva koja sC,koristi u '
foreach strukturi se automatski po stavlja na svaku sledeću vrednost argum enta
u na vrednost prvog argumenta. Sledeći put joj se dodeljuje vrednost drugog argumenta i tako redom. Argument ko man d ne linije možete eksplicitno da poziva korišćenjem argume nta specijalne promenljive argv[* l, U sledeće m primeru se u komandnoj liniji uno s i lista e programa kada se pozove cbackuparg shell fajl. U foreach petlji argv[* l poziva sve argumente komandne linije, Svaki argument se s ekvenc ijalno dodeljuje promenijivoj backfile u foreach petlj i . Prvim prolaskom kroz petlju im amo da je $backfile isto kao i $argv [1]. Sledećim prolaskom, $backfile postaje j ednako $argv [2], Promenljiva argnum se koristi za pozivanje svakog argumenta. I argu ment i vredno st backfile sc prikazuju, kuko bi se pokazalo da su jednaki. sekvenci. Prvim prolaskom kroz petlju se promenljiva pos tavlja
@ argnum - 1 foreach backfile ($argv[*]l c p $backfile soureebak/$backfile
echo '$backfile $argv[$argnum], @ argnum
�
$nrgnllm
+ 1
end
Sledi izvršenje cbackupurg skripta:
TCSH shell
>
cbackuparg
ma1n.c
l1b.c
programiranje
10.c
main.c main.c lib.c lib. c ia.c ia.c
JEDNOMINUTNA VEŽBA ..
Koja se struktura koristi kao zamena switch strukture?
..
Mogu li da se koriste operacije za poklapanje fajlova kao što su �'J [l
..
Ako se promenljiva koja se koristi u testu petlje nikada ne menja
ili ? u testovima? unutar petlje, da li će program ikada da se zaustavi? ..
Ugnežđavanjem if struktura pomoću else.
.. ..
Da. Ne; imate beskonačnu petlju.
Struktura repeat
Struktura repe at je struktura koja prosto ponavlja komandu određeni broj puta.
Može da ponavlja samo jednu komandu. Struktura repe at počinje ključnom reči repeat, iza
koje
sledi broj po navljanja a zatim komanda koja će da ,
se
ponavlja.
Ovo je sintaksa: >repeat num komanda
U ovom primeru se komanda echo ponavlja tri puta. > r e p e a t 3 echo "h ello ag ain" h ello a g ain hello ag ain h ello ag ain
Komanda continue Kao
i
u BASH
radi prelaska
shellu, u
preko
TCSH
shellu se koristi komanda continue
preostalih iskaza
u
sa
petljama
telu petlje radi nastavljanja sledeće
iteracije.
'
Korišćenje komande conti nue može da doprinese nejasnoći stila program ira n j a. Trebal o bi da se ređe koristi.
U sledećem primeru, loopodd skript štampa samo neparne iteracije petlje koristeći continue za preskakanje echo komande kod parnih iteracija. Komanda continue uslovno rečeno prenosi kontrolu na ključnu reč se
nastavlja
sa sledećom iteracijom petlje.
end za kraj petlje,
čime
93
94
Shell programiranje
# @ num=0 while ($num < 6)
@ '.num
=
$num + 1
($num % 2) 0) continue echo "$num iteration of loop" ==
if ( end
echo Goodbye
Sledi izvršenje
loopodd skripta:
;,. loopodd 1 iteration of loop 3 iteration of loop
5
iteration of loop
Goodbye
Beskonačne
petlie i komanda break
u TCSH shellu možete da implementirate beskonačnu petlju korišćenjem
numeričke konstante l na mestu test izraza u while strukturi. Ako koristite petlju, neophodan Vam je način za njeno zaustavljanje. Kada se koristi sa petljom, komanda break prenosi kontrolu izvan petlje.
beskonačnu
Često beskonačna
petlju.
peti ,a sadrži uslovnu komandu break koja kada se izvrši okončava
U sledcćcm loopinJlnite skriptu, korisnik postavlja beskonačnu petlju koja štampa broj iteracije. Kada je num veće od 3, izvršava se komanda break, i petlja se okončava. @ num=1
1) I$num
while if
>
3) break
echo "$num iteration @
num
�
of loop"
$num + 1
end echo Goodbye
Sledi izvršenje loopinfinite skripta: ;,. loopin1in1t1l .iteration of lOOP 2 iterat10n of loop 3 Herabon of loop Goodbye
TCSH shell
programiranje
Pitajte stručnjaka Pitanje:
Da li mogu
da
koristim
komandu break za zaustavljanje foreach
petlje?
Odgovor: Ko manda break je jedini način za zaustavljanje foreach pl'tlje pre nego što se dođe do kraja l i ste . U fnamesAM skrip tu koji sledi, korisnik želi da štampa samo imena fajlova koja počinju slovima iz prve polovine alfabeta: im['J1H fajlova koja počinju sa slovima i z med u a i m. Struktura foreach će štampati sva imena fajlo va iz njene liste. Da biste je zaustavili, ko ristite komandu break. # foreach filename (
*
)
if ( $filename
=-
[n.z]* ) break
echo $filename end echo "Goodbye'
Sledi izvršenje JnamesAM ;>
skripta:
ls
lib.c main.c resume termpaper
fnamesAM lib.c
;>
main.c Goodbye
Program trećem
myindext
poglavlju.
je TCSH shell verzija BASH myindex programa opisanog u Izvršava iste funkcije, automatsko generisanje web stranice
koja može da funkcioniše kao indeks za biranje ostalih web stranica. Pretpostavlja se da postoje poddirektorijurni koji sadrže web stranice. Mnoge shell operacije su iste kao i u BASH shell programi. Komande grep, echo, base name, kao i cut i sed koje su korišćene u
myindex su zadržane i u myind�xt, i to
neiz menjene . Petlje i if strukture, kao i dodeljivanje, se veoma razlikuju u programu ovog
poglavlja. U myindext postoje dve ugneždene foreach petlje, slično for petlji u BASH programu. Operacije dodeljivanja koriste komandu set sa znakom Uslovi za if se navode u malim zagradama, a standardni operatori slični onima tt C-u rade sa njima. Zatim se postavlja ključna reč then u istoj liniji kao kod testa BASH shella, a if uslov se završava ključnom reči endif. =.
9.5
96
Shell
programiranje
Korak po korak 1. I zab erit e direktorijurne u t eku će m direktorijumu i proverite da li sadrže . web stranice (svi fajlovi sa ekstenzijama html ili .htm). Imena ovih fajlova se postavljaju II string koji sadrži HTML komand e , hrefs za selektovanje i prikazi vanj e faj lova . HTML reference su org an i z o vane II listu sa
o zna ka ma , a svakom elementu prethodi oznaka - . Imena direktorijuma se ko r i �te kao zaglavlje, ozn aka < hl>. .
2. 3. 4.
Koristite koman du foreach
sa
*
radi poklapanja sa svim fajlovima i nazivi
ma direktorijuma, kako bi se svi uključili u p romenljivu $i. Ako p ro nađ et e direktorijum, pretražite da li ima HTML fajlova u
unutrašnjoj foreach petlji. Post a vite HTML fajlove upromenljivu j. Pretražite HTML fajlove prema n aslovima i koristite link tekst u indeksu. Za pretraživanje poj ave šablona <TITLE> koristite koma n du grepo Ako ga pronađete, vratite ga u promenijivu dine. Ako ne nađete šablon, vrati te 1 u
statusnu promenU ivu $?
biste videli da li je i zvršenj e komande grep bilo uspešno. Ako jeste, koristite skup sed kom a ndi za izvlačenje prethodnih <TITLE> i krajnjih oznaka zaj edno sa ostalim karakterima. Tekst naslova ost aje i dodeljuje se promenijivoj ntitle. 6. Ako komanda grep ne pronađe liniju <TITLE>, dod el ite ime fajla promenljivoj ntitle. Najpre koristite komandu basename za izvlačenje imena fajla iz puta , tako što se uklanjaju imena direktorijuma koji prethode fajlu. Zatim koristite komandu cut za ukl a nj a nje ekstenzije (štampa se prvo polje korišćenjem tačke kao graničnika). Uklanj aju se obe ekstenzije, i 5.
7.
P rover ite statusnu promenijivu $ kako
.html i .htm. Posle dodeljivanja teksta promenijivoj ntitle, koristite tekst link II hre f HTML liniji. Ova linija počinje sa - oznakom, uka zuj ući da se radi o listi elemenata. Ovde je prikazan myindext skript: #I/bin/tcsh
echo
'My
echo
'auth_pub
5.1
Promenljive polja
se
koriste za pozivanje polja
u istoj liniji može da se poslavi više akcija t ok o kuo što je prikozono v prethodnom primeru:
u
svakoj liniji
što ćete
da ih razdvojite
točka
zarezom,
GAWK
Graničnici polja
Podrazumeva se da GAWK razdvaja po lj a bIanko znakom ili ralJlllalofllllil. ako želite da koristite specifični graničnik, možete da ga odredite opcijom -F. Opcija ·F u stvari postavlja GAWK specijalnu promcnljivll pod nazivom FS, što predstavlja skraćenicu za field separator (separator po lj a). Sa opcijom -F možete da odredite bilo koji karakter kao graničnik. U sledećem primeru, booksC fajl koristi dvotačku za razdvaj anj e polj a Opcija -F navodi GAWK da tretira dvotačku ka o gra n ičnik polja.
Međutim,
$ gawk
.
'{print $1, $3}' 1 5.75
F:
booksC
War a n d peace
ChrIstmas carol 3,50 Iliad 10.25 Raven 2.50
Sledi sadržaj booksC fajla. Wa r and peace:Tolstoy:15.75:Penguin ChrIstmas carol:Dickens:3.50:Academic Iliad:Homer:10.25:Random Raven: Poe:2.50:Penguin
Sledeći primer ponavlja prethodni primer ali ovog puta!;a opcijom -F, i štampa liniju sa šablonom "Dickens" dva puta: prvo sa obrnu tim a zatim sa pravim redosledom polja. ,
$ gawk -F\: Academ ic
'/Dickens/ { p rint $4 , $3, $2 , $1; p rint $0}' booksC
3.50
Christmas carol
Dickens
Christmas carol
Dickens
3.50
Academic
JEDNOMINUTNA VEŽBA • •
Šta se dešava ako odredujete akciju bez šablona? Da li na polja može da se primeni poklapanje šablona sa regularnim izrazima? • •
Akcija se primenjuje na sve linije ufajlu. Da; poklapanje šablona može da se ograniči na individualna polja.
Specijalne
GAWK
promenljive
GAWK definiše skup specijalnih promenljivih koje obezbeđuju informacije o linij i koja se procesira. Promenljiva NR sadrži broj tekuće linije. Promenljiva NF
sadrži broj polja u tekućoj liniji. Postoje razne specijalne promenljive koje pamte graničnike polja i zapisa. Postoji čak i promenljiva FILENAME, koja pamti ime ulaznog fajla. Specijalne GAWK promenljive su navedene u tabeli S.l. Specij alne promenljive i promenljive koje definiše korisnik ne zahtevaju znak za dolar ispred njih. Da biste koristili ove promenljive, treba samo da se odredi ime promenlj ive. Sledeći primer kombinuje specijalnu promenij ivu NR sa
107
1 08
Jezici višeg n i voa
pro menijivi m polja $2 i $4 za šta mpanj e broja linije, iza kog sledi sadržaj drugog i četvrtog polja.
Promenljiva
Opis
NR
Broj tekućeg zapisa
NF
Broj polja u tekućem zapisu
$0
Tekući zapis u celini
$n
Polja u tekućem zapisu, numerisana od l
FS
Ulazni graničnik polj a ; podrazumevani graničnik j e bIanko znak ili tab u l a tor
.
na primer $ 1
•
OFS
Izlazni graničnik p olja; po d ra z u m e vani graničnik je b i anko znak ili tabu la tor
RS
Ulazni gran ičnik zapisa; po drazumeva se da je to oznaka za novu lin ij u Izlazni graničnik zapisa; p o dr az u m evani graničnik je
ORS
oznaka za novu liniju
OMFT
Izlazni format brojeva; p o dra z u me vani graničnik j e %
FILENAME
N az iv tekućeg ulaznog fajla
U promenlj ivoj NR se pamti
broj lin ij e koja se
procesira.
$ gawk ' { print N R , $2 , $4} ' books 1 Shakespeare
Penguin
2 D ic k e n s
Ac ademic
3
Ra ndom
Homer
Penguin
4 Poe
Promeniiive koie definiše korisnik
Možete da definišete svoje p ro m e nljive, dajući im nazive po želji. Ime novanj e promenljivih m o ž e da se izvede korišćenjem svih karakte ra , bilo alfabetskih, b ilo numeričkih. I m e mora da p o činj e alfabetskim karakte rom . Promen1jiva se definiše kada je prvi put koristite, a t i p promenljive j e od re đen načino m na koji je koristite. Ako je koristite za čuvanje numeričkih vrednosti, promenljiva se smatra aritmetičkom. Ako se koristi za čuvanje karaktera, promenljiva se smatra stri n go m . Morate da budete konzistentni kod korišćenja p rom e n1jive . string promenljive ne bi trebalo da se ko risti u aritmetičkim izračunavanjima, i obrnuto. Promenijivoj može da se dodeli vre dno st ko ri šće nj em operatora dodele ( = ) . N a l evoj strani operacije dodeljivanja je uvek promenljiva, a sa desne strane je vrednost koja se dodelj uje. Vred nost može da bude sadržaj neke druge
promenljive, kao što Može da
se
je po lj e , specijalna ili p ro m enlj iva koj u definiše korisnik. dodelj uje i ko n s ta nta , kao što će da bude o p i sa n o u sledeće m
odeljku. U ovom primeru korisnik dod e ljuj e myfield.
sadržaj
drugog
polj a prome nljiv oj
GAWK
$ gawk ' { myfield
$2 ; print myfield } , books
Shakespea re Dickens
Homer Poe
Konstante
Kons tante mogu da budll a ri t m e tič k e vrednos t i ili s t r i n g o v i Aritmetičke konstante se pred stavljaj u ciframa. Broj 56 pre d s t avlj a aritmet ičkll vrednost 56. String konstante mogu da budu bilo koji nizovi ka ra kte ra n avedeni pod d vo strukim znaci ma navoda, tako da se s tri n g konstanta za reč izdanje navodi kao "izdanje". Imajte na urnu da je broj ispred k og s toj i znak za dolar promenlji va polja, a da sam broj bez znaka za dolar predstavlja aritmetičku konstantu . .
Konstante
se ši roko koriste sa o pe ratori m a . GAWK i m a s k u p relocion i h . o ritmet i č k i h i uz pro menl j ive i k o n sta nte rodi formiranja složen i h izraza. Ovi i z ra z i mogu da se kori ste b i l o za u s l o ve ili za segme nte akci le u GAWK i nstru kci j i . Det a l j n i je su ispita ne u s ledećim odel j ci m a .
ope r a to r a dodele koj i mogu da se kori ste
Fu n kciie GAWK obezbeđuj e skup funkcija koje mogu da s e izvršavaju n a poljima, šabloni ma i promenljivim. Postoje funkcije nad stringovima i aritmetičke funkcij e . Aritmetičke funkcij e su opisane u odeljku "Aritmetičke operacij e i operacije dodele", kasnije u ovom poglavlj u . Najčešće korišćene funkcij e n a d stringovima su length, index, suhstr i split (pogledaj te tabelu 5 . 2 i odeljak "Nizovi i asoci j ativni nizovi", kasnije u ovom poglavlju) . Funkcij a length daje dužin u stringa . Može da se primeni na bilo koju string promenij ivu, uklj učujući i promenljive polj a . Poziv funkcije length($2) vraća dužinu drugog polja.
Funkcije nad stringovima
O p is
length (str)
Vraća broj karaktera u stringu, str. Ako funkcija nema argumenata, izračunava se dužina tekućeg zapisa u karakterima.
index (strl, str2)
Utvrđuje da li se strI sadrži u str2, i ako jeste, vraća pozicij u u str2 od koje počinje str I . U suprotnom vraća O.
split (str, arr,
delim)
Kopira segmente str koji su razdvojeni graničnikom delim u elementima niza arr. Vraća broj elemenata u nizu (pogledaj te odeljak "Nizovi i asocij ativni nizovi" kasnij e u ovom poglavljuu) .
1 0�
1 10
Jezici vi šeg n ivoa
cc
'
, Tabeio 5,��:::'GAWj( wnkc:iie nod
� �� e
"�'�"�� st�l!lJf��i, u:i� "
Funkcije nad stringovima
Op is
Vraća p od s tri n g iz s t r. Karakteri u s trin g u se numerišu od l. Argu me n t pos je broj koj i u ka zuje na karakter od kojeg p o či nj e p o d string Argument len je broj koji u ka z uje koliko se karaktera iz pos koristi za p od string
substr(str, pos, len)
.
.
Poziv funkcije length($O) vraća broj karaktera u liniji, uključujući bianko znakove ili tabulatore U sle d eće m primeru se pre svake linije štampa nj e n a dužina. .
$ gawk ' { p rint length ( $0 ) , $0} ' books 31
Tempest
Shakespeare
31
Christmas
D i c ke n s
24
I l iad
Home r
20
Raven
Poe
1 5 . 75 3 . 50 1 0 . 25 2 . 50
Peng u i n Aca d e m i c R a ndom
Penguin
Funkcijom substr se dobija podstring polj a ili p rome nljive . Funkcija substr ima tri argu m e n ta Prvi j e polj e ili šablon iz ko g se ko p ira podstring, dmgi je po z i cija od koje počinje po d s t ri n g , a t re ći je broj karaktera koj i se kop i ra od početne p ozicije Po z iv funkcij e substr($2,4,3) vraća po d s t ri n g koji p o či nje od četvrtog karaktera u d ru gom polju i koji se završava na šestom karakteru. Podstring se sastoji od karaktera na p o zicija ma 4, 5 i 6 u drugom polju. Funkcija index pronalazi poziciju šablona unutar stringa. Pozicija šabl ona "en" u "Dickens" je 5. U sledećem p rime ru , korisnik štampa prvu reč u na s lovi m a koja sadrži više od j ed ne reči u booksT fajlu. BooksT fajl ima polja koja sadrže više reči, gde s u polja odvojena tabulatorirna. Naj p re index p ronala z i kraj prve reči t r a ž e nje m prvog blanka znaka. Pozi cij a bIanko znaka se ' dodeljuj e promenijivoj pos koju definiše korisnik. Ako nema bIanko znaka, onda naslov irna samo jednu reč, i index vraća vre d n o st O. Zatim substr kopira prvu reč koristeći poziciju bIanko znaka koju je vratila funkcija index kako bi se odredilo .
.
koliko
se karaktera kopira .
$ gawk
.F\ :
' { pos
=
ind�)( $1 ,
"
"
) ; print subst r ( $1 , 1 , pos ) } '
boo ksC
Wa r Ch ristmas
nad stringovima koje Vam omogućavaju da što su zamcna š ablon a (sub i gsub) , traženje šablona (match) i zamenu velikih i malih slova (tolower i toupper) . Pogledaj te tabel u S.3. GAWK irna veći broj funkcija
izvršavate operacije kao
Formatira n i izlaz: funkcija printf Funkciju printf možete da koristite za formatiranje Vašeg izlaza. Koma nd a printf obično štampa stringov[', a iza to ga se p re l a z i u novu liniju. Pretpostavimo da želite da se nekoliko različitih stringova štampa u
istoj
liniji, ili da se numeričke vrednosti štampaju u određenim d ecimaln im pozicijama.
GAWK
Poređenje stringova i zamene
matchCstr, šablon)
Opis
Poredi str sa šablonom. Ako se poklapaju,
vraća se pozicija od koje počinje poklapanje: u suprotnom vraća
sub Cšablon, str, zamena)
gsub(šablo n, str,
toupper(str) slova. tolowerCstr)
zamena )
O.
Izvršava zamenu tako što se šablon u stringu
str menja stringom zamena. Ako nij e određen string zamena, koristi se $0. Izvršava globalnu zamenu u stringu str
menjajući svaku pojavu šablona sa stringom zamena. Menja sva mala slova u s tringu str u velika Menja sva velika slova II stringll str II mala slova.
Funkcija printf može da koristi niz specijalnih kontrolnih specifikatora i konstanti za formatiranje Vašeg izlaza. Sintaksa za funkciju printf je:
printf(''format-string'', arg1, arg2, ... , argn) Funkcija p rintf kao prvi argument uzima format stringa. To je obično string pod dvostrukim navodnim znacima koji sadrži specifikatore konverzije ili konstante koje želite da odštampate. Svi karakteri navedeni u formatu stringa se tretiraju kao karakteri koj i se štampaju. Neštampajući karakteri, kao što je prelazak u novu liniju ili tabulator se predstavljaju sa njihovim ekvivalentima u okviru znakova navoda. " h ello \ n "
Posle formata stringa navĐdite niz vrednosti koje želite da odštampate. To mogu da budu vrednosti promenljivih, kao što su promenljive polja ili specijalne promenljive. To mogu da budu i rezultati izraza, kao što su na primer rezultati aritmetičkih izraza. U većini slučajeva, navodićete promenljive čije vrednosti želite da odštampate kao argumente. Za svaki argument u listi morate da imate odgovarajući specifikator konverzije u formatu stringa. Specifikator konverzije se sastoji od znaka % iza kojeg sledi jedno slovo koje označava tip konverzije. Specifikator konverzije uzima vrednost argumenta i pretvara je u karakter koji će da se odštampa. Na primer, %d specifikatar konverzije uzima celobrojnu vrednost, kao što je 465, i , pretvara je u karaktere 4, 6 i S koji će da budu odštampani. U većini slučajeva ćete da štampate stringove, a specifikator konverzije za stringove je %s. Specifikatori konverzije su navedeni u tabeli 5 .4. Specifikatori konverzije u formatu stringa se sekvencijalno poklapaju sa argumentima koje ste naveli u listi. Prvi specifikator konverzije u formatu stringa će pretvarati prvi argument, drugi pertvara drugi argument i tako redom.
111
1 12
J ezici višeg n ivoa
U sledećem primeru, korisnik unosi celobrojnu vrednost 23, a string "visitors" koristeći prvo Ofod, a zatim Ofos specifikator konverzije. p rintf ( ' %d %s " , 23 , ' visitors " ) ;
Tabela'5;4: Specifikatori konverziie za
printf
Specifikatori konverzije
Opis
Ofod Ofof Ofoe %g f ili e
Decimalni, celobrojni Pokretni zarez Eksponencijaini zapis Koristi kr�ći zapis u pokretnom zarezu,
%0
Oktal no predstavljanje celobrojnih
%x
Heksadecimalno predstavljanje
%$
Niz
vrednosti
karaktera
Unutar formata stringa možete da uključite i bilo kakve znakovne konstante koje želite da odštampate . U s tvari , možete da ko ris tite printf samo za štampanje niza karaktera koristeći form at string bez argumenata. U sledeće m primeru, korisnik najpre štampa stri ng 'Visitors Report". Zatim, u slcdećoj komandi printf, korisnik štampa vrednost 23 i "visitors" ispred kojih se štampa 'Th e re where". printf ( " Visitors Repor t ) ; p r l n t f ( " There were %d %5 " , 23 , " visitors , " ) ; '
V i s i t o r s Report Th e r e we r e
23
visitors ,
$AVET« ' «::
Pri mctite
da se šta m pa n j e vrši u j e d n o j l i n i j i . F u n kc i j a p ri ntf ne d a j e prelazak u sledeću a ko to e k s p l i citn o n e n a l ožite sa ko n sta nto m za p re l a z a k u novu l i n i j u .
l i n i j u osim
Unutar format stringa možete d a unosite specijalne konstante, kao što su
konstante za prelazak u novu liniju ili t a b u la to r i , radi ko ntro lc izlaza. Ove specijalne konstante se sastoje od kose crte i oznake. Specij alna konstanta \n je konstanta za pre l azak II novu linij u koja štampa carriage return; \t je konstanta koji štampa tabulator. Možete takođe da štampate i o ktalne vrednosti za sve karaktere iz skupa karakte ra kojem prethodi kosa crta i aktaIni broj sa nulom. \007 štampaju karakter iz ASCII skupa karaktera koji Vas verovatno asocira n a nešto. Ove specijalne konstante su nC!VPdf'llf' II t aheli 5 . 5 .
GAWK
tgb••a.���ngt"@fi�i(��'��"It::: ', " 'č*� " ·. · · :�i���;� · · " .·' .'·. ·�f;2�i::f;f�;;i; Specijalne konstante
Opis
\n
Nova linij a Tabulator
\t \Onum
: " ,·; ': :'·':�: '�;?T
Tempest
Shakespeare
1 5 . 75
Penguin
l liad
Home r
10 . 2 5
R a ndom
1 0 . 00
= .
{ p rint } ' books
Operand u GAWK uslovu može da bude i vrednost koju vraća funkcija. sledećem primeru, funkcija length sc koristi za štampanje samo onih zapisa kojima je d rugo polje veće od S . U
$ gawk ' le n g t h ( $2 ) >
5
Tempe s t
Sh a k e s pe a r e
Ch ristmas
DiC k e n s
Log ički
{ p r i nt } '
boo k s
1 5 . 75
P e ng u i n
3 . 50
Academic
operatori
GAWK ima skup logičkih operatora uslova. Logički operatori su isti kao
koji Vam
omogućavaju kreiranje složenih
jeziku C, i navedeni su u operator za I je dvostruki znak za ampersend (komercijalno "i") (&&) . logički operator za ILI su dve u s p ravn e crte ( I I ) , a logički operator za NE j e j edan u skličn i k ( ! ) . OperandI za logi(,-kf' o p e ra to re su i sami uslovi. Obično se navode u malim zagradama. U sledećem primeru se štampaju sve knjige koje j e izdao Penguin, a koje koštaju više od $ 10.00. Ovo uključuje poređenje četvrtog polja sa "Penguin" i testiranje da bi s e videlo da li je treće p olj e veće od 1 0 . 00. u
programskom
tabeli 5 . 7 . Lo gi čk i
$ gawk Tempest
' ( $4
==
" pengUin " ) a a ( $3
Shakes peare
15.75
>
1 0 . 00 )
Penguin
{ print } ' boo k s
GAWK
U s l edećem primeru, koma nda štampa knj ige koje je izdao ili Penguin ili
Academic. Ovo uključuje proveru da "Penguin" ili "Academic". $ g awk ' ( $4
==
I I ( $4
· Penguin " )
1 5 . 75
li je četvrto
==
" ACAdemiC " )
polje jednako stringovima
{ p rint } ' books
Penguin
Tempest
S h a k e s pe a re
Ch r istmas
Dickens
3 . 50
Ac ademic
Raven
Poe
2 . 50
Peng u i n
Operatori za traženie šablona
sa polju. Umesto korišćenja operatora jednakosti za poređenje celog polja sa stringom, možete da koristite operator kako biste videli da li se šablon nalazi unutar polja. Kada koristite ove operatore za pretraživanje p olja , desni ope rand je u v ek šablon, a levi je polje koje se p re tra žuj e . U sledećem pri m e ru , u prvom polju se traži "mas". Možete d a kor i sti t e dva operatora z a poređ enj e šablona, ti1da ( -) i tilda
uskličnikom C H ,
za izvođenje
traženja šablona
$ g awk ' ( $ 1
- I mas l ) { p rint } · books
C h r istmas
Dic kens
3 . 50
Academic
Sledeći primer vraća sve sl ogove "mas" .
kod kojih se u prvom po lj u ne nalazi šablon
l l iad
Imas / ) { print } ' boo ks 1 5 . 75 P e n g u i n 1 0 . 25 R a n d om Home r
Raven
Poe
$ gfowk ' ( $1 Tem p e s t
II
!-
S h a k e s p e a re
2 . 50
Penguin
Baš kao i kad koristite specij alne karaktere za opšte traženje šablona, možete da koristite specijalne karaktere za pretraživanje polja. U sledećem primeru, korisnik poredi šablon "PenguiQ." u verzijama i sa malim i sa velikim slovima, u okviru četvrtog polja. Specijalni karakteri, uglaste zagrade ( [ ] ) se koriste za definisanj e klase za ma l o i veliko slovo P. $
g awk ' ( $4 - I [ Pp ] e ng / ) { print } ' books Sha k e s p e a r e 1 5 . 75 P e n g u i n
Tempest Raven
Poe
2 . 50
Pe n g u i n
Specijal ni ša bloni BEGIN i END G.,.WK instrukcije imaj u dva specij alna šablona koja korisniku omogućavaju d a odredi akcij e koj e ć e d a se izvršavaju pre i posle procesiranja linij e s a ulaza. Š ablon BEGIN je uslov koj i određuj e akcij e koje se izvršavaju pre nego što se linij a proces ira, a END šablon određuje akcije koje će da se izvršavaju kada se linij a procesira .
117
1 18
Jezici višeg
nivoa
U sledećem primeru , zaglavlje "Book List" se štampa pre nego što se proce sira bilo koja linija. Posle procesiranja se štampa vrednost NR. Kako se sa svakom • l inij om NR inkrementira, u NR se pamti uku p ni broj slogova u fajlu.
Uslov
,
BEGIN
se izvršava pre procesiranja
I
$ gawk ',BEGIN {print " Book List " } {print} END{ print " Total rees" , NR} ' books
Book List Tempest
Shakespeare
Christmas
Dickens
l liad
Homer
Raven
Poe
uslov se izvršava posle procesiranja
END
15 . 75
Penguin
3.50
Academic
1 0.25 2 . 50
Random Penguin
Total recs 4
Šabloni opsega
GAWK im a sp ecijalni z a re z operator koji se p ostavlj a između dva uslova za dobi j anje opsega lin ija . Prva linij a skupa je prva linija koja zadovoljava prvi uslov. Poslednja l inija skupa je sledeća l inija koja zadovoljava drugi uslov. Zarez operator je posebno koristan za biranj e opsega linija pomoću speci jalne promenljive NR, u kojoj se p amti broj tekuće linije. Uslov NR = = 4 će da izabere četvrtu liniju, jer će kada se stigne d o četvrte linij e vrednost NR da bude 4 i uslov će da bude zadovoljen. NR = = 1 , NR = = 3 određuje opseg linija počevši od linije 1 do linije 3. U sledećem primeru I;e šta mp a $ gawk
' HR
==
1,
HR
==
3
samo treća li n ija . { pr1nt } ,
Sha k e s pe a r e
Ch ristmas
Dickens
1 5 . 75
l 1 1ao
Homer
1 0 . 25
Tempes t
GAWK
3 . 50
books
Penguin Ac ademic R a ndom
instrukci je uslovno rečeno t ra že p rvi uslov. Kad a se
.
u s l ov zadovo l j i , zat i m
.
se
eks kl uzivno traži drugi us l o v U tom procesu može d a se pređe p re k o p rvog u s l ov a U
mogu d a se postave d ruga ispitiva n j a , i GAWK će d a vrati sva ko od njih. GAWK zaustavl ja koda se dobije prvi uslov - resta rtuje svoje p retraživan j e i kada se zodovo l j i drugi uslov, tražeći sl edeći por koji zadovol java uslov. stvo r i ,
se ne
Aritmetičke operaciie i operaciia dodele
o pe ra tora . Možete da izvršavate sabiranje, oduzimanje i izračunavanje ostatka. Arirmetički operatori su isti kao oni koj i se koriste u pro gr ams ko m jeziku e, a navedeni su u tabel i 5 . 8 , zajedno sa operatorima dodele, koji će da budu GAWK
poseduje
kompletan skup arirmeričkih
množeI1Je, deijenje,
ukratko prodiskutovani.
GAWK
·jlfili"j�.5,f'�iij!�WK· •.a�[��ti��E��'Jri����� �_fdfj�jj'�i��it" ; ;!Li�::�'!ii !, .8;i EA�Ii!! Aritmetički operatori i funkcije
Op i s
*
Množenje Deljenje
/
Sabiranje Oduzimanje Modulo; ostatak pri deljenju
+
%
i daje
int(num)
Odseca broj u pokretnom zarezu celobrojnu vrednost
cos (num)
Vraća kosinus za num
sin (num)
Vraća sinus za num
log (num)
Vraća prirodni logaritarn za
exp (num)
Vraća eksponent za num
sqrt(num)
Vraća kvadratni koren iz
rand O
Vrać a slučajan b roj
srand (num)
Vraća num kao novu vrednost za rand O
num
num
Operatori dodele
Dodela Inkrement
++
Dekrement +=
Sabiranje i dodela; i = i + 1 je isto kao i + = 1
*=
Množenje i dodela; i = i* l je isto što i i* = l
Oduzimanje i dodela; i = i- l je isto kao i- = 1 /=
Deljenje i dodela; i = il l je isto što i iI = l
%
Modulo i dodela; i = i% l je isto što i i% = 1
=
Možete da izvršavate aritmetička izračunavanja na numeričkim vrednostima predstavljenim u vidu numeričkih šablona. Numerički šablon je bilo koji niz cifara, a aritmetička konstanta je očigledno numerički šablon. Aritmetičke konstante, promenljive polja i promenljive koje definiše korisnik je moguće koristiti kao operande u aritrnetičkim operacijama. Tu su izvesne specijalne GAWK promenljive koje se definišu kao numeričke, npr. NR i NF. One mogu da . se koriste kao numerički operandi. , Aritmetičke operacije mogu da se koriste u akcijama i u segmentima šabloQa GAWK instrukcije. U sledećem primeru, korisnik štampa sve parne linije. Oznaka za procenat (%) je operator moduo koj i daje ostatak deljenja. Ako je ostatak deljenja broja linije sa 2 nula, linija je parna. Primetite način na koji se koriste male zagrade za uređivanje izraza. $ gawk ' ( NR % 2)
==
0 { pr1nt NR , $0 } ' books 3 . 50 Academic
2 Christmas
Dic k e n s
4 Raven
Poe
2 . 50
Penguin
1 19
1 20
Jezici višeg nivoa
Uz aritmetičke operatore i promenljive možete lako da izvršavate izračuna vanja na poljima u bazi podataka. Na primer, možete da sumirate vrednosti, ili • na primer, sumirate samo članove jedne kolone u tabeli. Sledeći primer sumira treće polje u books fajlu . U promenijivoj tot, koju definiše korisnik, s e pamti suma, a uslov END štampa konačni rezult at promenljive tot. Kako se promenljive automatski inici jalizuju na O, promenljiva tot ima inicijalnu vrednost O . $ g awk ' { print ; t o t = t o t + $3 } Tempest
Shakespeare
C h r ist mas
Dickens
l liad
Home r
Raven
Poe
Total=
1 5 . 75 3 . 50 1 0 . 25 2 . 50
END { p rint " Total= " , to t } ' books Penguin Academic Ra ndom Penguin
32
Osim standardnih aritmetičkih operatora,. u tabeli S.8 su navedeni i operatori
dodele . Ovi operatori kombinuju operaciju dodele sa aritmetičkim operacijama. Koriste se kao neka vrsta prečice za određenje operacije koja se dodeljuje promenljivoj kao rezultat izraza u kom se ta promenljiva koristi kao operand. O peracij a tot tot + 1 se pomoću aritmetičkog operatora + zapisati kao tot + = 1 . Promenljivu tot ne morate da o dre đuj ete u aritmetičkom izrazu j er je aritmetička operacija d ode le pre tpostavlja O peracija i = i * 2 se može zapisati kao i * = 2. =
=
.
Sledeća komanda daje isti rezultat kao i prethodni primer korišćenjem aritmetičke
operacije dodele.
$ g awk ' { print ; tot
+=
$3} END {p rint " Total= " , tot } ' books
Pitajte stručnjaka Pitanje: Kako s e impie menti raju
inkrement i dekrement?
Odgovor; Pos t oj e dva specijalna aritmetička
operatora za inkrement i
dekre
ment, Operator za inkrement čine dva znaka plus (+ +), a op erat or za dekre
ment dva znaka za sabiranja i dodele.
m i nu s (--) . Operacija inkrement je kombinovana
operacija
Inkrement operacij a najpre dodaje 1 p rome n lj ivoj , a zatim j oj dodeljuje
uvećanu vrednost. Izraz i+ + je ekvivalentan sa i=i+ l . Operator dekrementa
izvršava kombinovanu operaciju oduzimanj a i d o d e l e . Izraz i-- je ekvival e ntan sa
i -- i- 1 . Operacija inkrementiranja je veoma korisna za prolazak kroz niz, i često se
koristi u petljama za ažuriranje promenljive koja kontroliše pe tlj u . U sledećem primeru, korisnik koristi promenij ivu linenum za p raće nj e broj eva svih linija,
umesto NR. Promenljiva linenum se uvećava za �a štampanje broja linije, $ gawk
' { 11nenum++ ; print
1 Tempest
S h a k e s p e a re
2 Ch ristmas
DIckens
3 I l iAd
Home r
4
Poe
RAven
1 u svakoj linij i , a zatim kori s ti
l i n e n u m , $0 } ' books 1 5 , 75 3 . 50 1 0 . 25 2 . 50
Penguin Academic R a ndom Peng u in
GAWK
N izovi i asociiativn i n izovi Zapis unutar
vel ikih z a gra d a
i pos t avlj en po r e d naziva niza
ukazuje na elemenat
niza. Poput promenljive, prvo korišćenje zapisa u GAWK in�trukciji takođe definiše niz. Za razliku od ostalih programskih j e zik a , nizovi se ne deklarišu, i za niz se ne definiše maksimalna veličina. Niz može dinamički da se proširuje sa
po z ivi ma
e l e m e n at a .
U sledećem primeru se definiše niz titles. Svakom elemntu niza je dodeljena vrednost prvog polja lin ij e . U nizu će da postoji onoliko elemenata koliko mu se vrednosti dodeli. Promenljiva num se koristi za pozivanje svakog elementa niza, i inkrem entira se po s le
svake
upotrebe . Na kraju
=
$ gawk ' { t i t l e s [ n um ]
se štampa poslednji elemenat niza.
$ 1 j n u m + + } E N D { p rint t i t le s [ num - 1 ] } ' boo ks
Raven
Međutim, pretpostavimo sloga. To možete
da
da nizu želite da dodelite1:vako polje pojedinačnog
izvedete individualnim dodeljivanjerp za svako polje, ali
GAWK obezbeđuje i prečicu. Elementima niza
možete $ dodeljujete polja
Separator polja s e određuje stringom - da biste
koristili
sa
funkcijom split. Funkcija split kao argumente uzima li nij u , niz i separator polj a . dvotačku k a o separator
polja, odredićete string " : " . Separator polja je opcion, i ako se ne navede, podrazumeva se da su separatori bIanko znak ili tabul ator. Funkcija split može da radi i sa jednim stringom. Sa split("9- 1 O-92", date, " -" ) dodeljujete 9 u date [ 1 ] , 10 u date [ 2 ] i 92 u d ate [ 3 ] . U sledećem primeru,
l
svako polje linije je dod e jeno elementu niza myrec. Dodeljena linija je selekto vana traženjem šablona / Dickens/. Polj a se štampaju u obrnutom redosl edu. $ gawk ' / D icken s / { s p lit ( $0 , . myrec ) j print myrec [ 4 ] , myrec [ 3 ] , myrec [ 2 ] , myrec [ 1 ] } ' books Ac ademic
3 . 50
Dic k e n s
Christmas
GAWK Vam omogućava .definisanje i takozvanih asocijativnih nizova . Asocij ativni
ni z
omogućava
definisanje
niza
čiji
su
elementi
ZapI S I .
Pretpostavimo da želite da pozovete izdavača nekog od autora pozivajući ime autora. U sl edećem primeru, kao i na slici 5 . 2 , korisnik dodeljuje izdavače nizu indeksiranom na osnovu imena autora.
U
u četvrtom polju se navodi ime izdavača.
drugom polju se nalazi ime autora, a
U
ovom sl učaju se štampa Dikensov
izdavač. Primetite da se koriste dvostruki navodnici za "Dickens". Kada koristite string konstantu kao zapis u asocijativnom nizu, morate da je postavite u okviru dvostrukih znakova navoda. •
$ gawk ' { pub l [ $2 ] Ac ademic
=
$4} END{ print pub l [ " Dickens " ] } , books
1 21
1 22
Jezici višeg nivoa
Shakespeare Dickens
Penguin Academic : Random Penguin
Homer Poe
,�
L print
(pub1[S2]
Definiše
se
=
pub["Dickens"J
$4)
niz pod nazivom publ,
njegovim elementima se dodeljuju vrednosti četvrtog polja, a indeksira
se
imenima autora
iz drugog polj a knj ige
----+ .
__
gawk -+ Academic
$4
�
Tempest
Christmas
lliad Raven
Shakespeate PlOtI:ns .
Hđmer
Poe
..
1 5 . 75 3 . 50 10.25 2.50
Penguin
Academic Random
Penguin
books Tempest
Christmas Iliad
Raven
Shakespeare
Dickens Homer Poe
1 5 . 75 3.50 10.25 2.50
Penguin
Academic
Random Penguin $
Slika 5.2
Asocijativni
Failovi
niz
koristi stringove
sa
za
gawk ' j pubJ [S2J
==
$4}'
indeksiranje elemenata
GAWK instrukciiama
Kako GAWK instrukcije pos taj u sve složenije, to je lakše upravlj ati njima ako se smeštaju u fajlove koje GAWK može da čita. Ako morate da izvedete neke promene, sve što m'ha da uradite je da modifikujete fajl. Opcij a -f omogućava GAWK-u da čita GAWK instrukcije iz faj l a umesto iz komandne linije. (Opcij a -f je bila prodiskutovana II odeljku "Komanda GAWK" na početku ovog poglavlja.) U sledećem primeru, GAWK instrukcije za izlistavanje knjiga koje je izdao . penguin S� postavljaju II fajl pod nazivom jindbk. Zatim se opcijom -f i nazivom fajIa poziva GAWK. GAWK instrukcija se čita iz fajla jindbk.
GAWK
BEGIN
{ p r int " Book count
List " ; =
0;
} $4
-
I P�ngu ln l
{ count
c ount
+
1;
p r int ; END
{ prlnt " Total r�cords found ls
" ,
count ;
Sledi izvršenje .rndbk skripta: $ g awk - f f in d b k
books
Book List Tempest
Sha kespea re
Raven
Poe
15 , 75
Peng u in
2 , 50
Peng u i n
T o t a l rec o rd s f o u n d i s 2
SAVET
da Vam nisu potre bni jednostru ki navod nici oko i n strukcije Ta kođe, možete do g a n i z u j ete različite delove Vaše instru kci je na različiti m l i n ijama, či neći instrukciju još čitl j iv i j o m _ Ova ka ra kte risti ka j e veo m a korisna kada se koriste upravi ločke stru kture_ Pri metite
or
JEDNOMI NUTNA VEŽBA •
Može li da se koristi
GAWK za
pristup standardnom ulazu i izl azu u
Linux komandnoj liniji, kao što je to slučaj sa Linux filterima? •
Može li da se postavi ceTa
GAWK komanda
unutar izvršnog fajla, kao
deo shell skripta? • •
Da, GAWK može da čita sa standardnog ulaza i da štampa podatke na standardni izlaz_ Da, možete da kreirate shell skriptove koji sadrže GAWK komande_
U pravl iačke stru ktu re
qAWK funkcioniše slično programskim jezicima, i dozvoljava Vam da definišete promenljive, kreirate izraze i dodelj ujete vrednosti_ Takođe, uključuje i skup upravljačkih struktura kako bi se omogućile iteracije i izbor karakteristika_ U okviru GAWK-a postoje tri upravljačke strukture za konstrukciju petlji: while, for i for-in petlje_ Postoji jedna upravljačka struktura za selekciju: if struktura_ GAWK upravljačke strukture su navedene u tabeli 5-9, a detaljno su opisane u diskusiji koj a sledi. Uz izuzetak for-in petlje, ove strukture su slične onima koje se nalaze u programskom jeziku C .
1 23
1 24
Jezici višeg
n ivoo
Petlja while Petlj a while s e sastoj i od ključne reči while i z a koje sledi test izraz u malim zagradama. Iza test izraza sledi GAWK akcija, s tim da se nek ol iko GAWK akcij a može kombinovati u blok akcij a koje se navode u velikim zagradama, a razdva jaju se tačka zarezom. Postavljanje bloka akcija posle test izraza u while petlji izvršava sve akcije unutar petlje. Evo sintakse while petlj e : while ( t est izraz ) {
gawk - akc1j e ; }
.
Većina petlji za i spravno funkcionisanje zahteva tri kompon ente : inicij ali z acij u , test i inkrementiranje. Sve ko mp o ne n te rade s a prom e nij ivom koj a se koristi za
kontrolu pedje. U threejields fajlu, koji će da b u de prik azan, štampaju se prva tri polj a u sva ko m s lo gu . Promenljiva i se koris t i za ko n tro lu petlje, a inkrementiranje i se postavlj a u okviru b leka navedenog između velikih z a gr a d a , u nu t a r p e tlje .
Sintaksa
upravljačke strukture
{akcije }
if(izraz) akcija else akcija while (izraz)
akcija
for(exp l ; exp2; exp3) akcija
for(promenljiv(l in naziv niza) akcija
Opis Blok se formira u n u ta r velikih zagrada ;
koristi se za gru pis a nj e akcija, či neći ih subjektom upravlj ačke strukture - kao što je petlja - ili da bi se pravilno n avel e za GAWK ins trukcij u .
Upravlj ačka struktura if izvršava akcij u
ako je njegov izraz tačan. Ako je netačan, izvršava se else akcija .
Upravljačka struktura while izvršava akciju dok god iz ra z vraća vrednost
true. Upravljačka s t ruktu ra for i zvrš ava akciju d okl e god exp2 vraća vre dno s t true. Prvi i z ra z , exp l se i zvrš ava pre nego što petlja p očnc . Treći izraz, exp3, se izvršava unutar p etlj e , posle svakog izvršenja akcij e .
Upravljačka struktura for-in je name nj e n a za korišćenje uz asocijativne nizove. Operandu
promenljiva se sekvencijalno d o delj uju stringovi
next exit
kpji indeksiraju niz.
Iskaz next zaustavlja operaciju u tekućem slogu i prelazi na sledeći slog. Iskaz exit završava sva procesiranj a i izvršava komandu END ako postoji.
GAWK
Zatim se ispituje p ro me nlj iva u relacionoj o pe ra cij i sa test izrazom petlje kako bi se utvrdilo d a li se petlja završava. Vrednost i se koristi za pozivanj e svakog polja u slogu . Prvim prolaskom kroz petlju se postavlja vrednost 1 za i, tako da se sa $ 1 p o ziva prva promenljiva polja u slogu. Kako se i inkrementira, njegova vred nost se me nja; tako će $i pozivati svaku p ro menlj ivu po lj a u teku ćoj liniji, sve do trećeg polja, kada se petlja završava.
Za poziva n j e p rome n l j ive polja možete da koristite promenljive koje defi n iše korisnik, koo što je promenljiva i. Identifi kacija promenlj ive polja se vrši navođenjem znaka za dolar pre
numeričke vred nosti, a ova vrednost može da se dobije kao konstanta, i l i kao n u merička promen l j iva . Ako je vrednost prome n l j ive i 2, toda se so $ i poziva drugo pol je.
Sledi threefields skript: i=1 ; while ( i
> . Iza komande gawk će da se napiše sadržaj trećeg polj a u fajl costfile. Ime fajla je string, i ovde j e navedeno kao string konstant� sa dvostrukim znacima navoda. print $3
»
· c ostfl1e " ;
Za čitanje podatka iz fajla jednostavno koristite standardni ulazni operator za preusmeravanje zajedno da imenom fajla u ulaznoj
getline,
GAWK
komandi, kao što je
zajedno sa promenij ivom u koju želite da učitate podatak. Sledeći primer čita liniju podataka iz publist skripta i postavlja je u promenljivu bufferpub. Primetite da se ime fajla navodi sa dvostrukim znacima navoda - GAWK za ime fajla očekuje string, pa se u ovom slučaju daje string konstanta .
Izlazne operacije
Opis
print
Štampa tekuću linij u na standardni izlaz.
print
var
Štampa promenljivu var na stan dardni izlaz.
print
var > > imefajla
Š tampa promenljivu var u fajl.
print > > imefajla
Štampa tekuću liniju u odredeni fajl.
printf(format, vars) > > imefaj la
Ulazne operacije getline var ako se
Štamp;1 fajl. Čita
formatirani izlaz u odredeni
sledeću ulaznu liniju i vraća O
došlo do kraja fajla. Ako je odredena promenljiva
liniju u nju .
getline var< < imefajla
var,
pročita će ulaznu
Čita sledeću liniju
i z o d ređ enog faj l a
vraća O ako se došlo do kraja Linija se čita u odredenu promenijivu var.
Ime fajla može d a sc clodeli promenIj ivoj , naziva fajla. getline bU11erpUb
t it lelist " ;
p rint $2
»
" autho riist " ;
}
} END {
print " Total records found IS "
}
Sledi izvršenje getat skripta: $ g awk -f g e t a t
boo k s
Tot a l r e c o r d s f o u n d is 3
$ cat titlelist Tempest I l iad
Raven
$ c at a u t h o riist Shakespeare Homer Poe
file
count
1 33
1 34
Jezici višeg nivoa
možete da koristite za definisanje svojih filtera postavljanjem GAWK instrukcije u skript fajl. Zatim možete da načinite fajl izvršnim, tako da ime fajla postaje nova Linux komanda. GAWK instrukcije unutar skript fajla moraju da se navode pod znacima navo da. Uslovno rečeno, skript fajl sadrži Linux komande koje će da se izvršavaju u shellu; zato unutar shella morate da pišete instrukcije kao da će da se izvršavaju u komandnoj liniji. GAWK uslove i akcije možete da pišete u njihovim linijama, . ali svaki karakter za prelazak u sledeću liniju (carriage return) mora da se navede unutar znakova navoda za GAWK instrukciju. Ovo znači da će prva lini ja GAWK operacije da počne ključnom reči gawk, iza koje u istoj liniji sledi jednostruki znak navoda. Z a tim u nos ite u s l ov i akcije GAWK instrukcije u različitim linijama. Međutim, završna akcija mora da se završi jednostrukim - znakom navoda, iza kojeg, u istoj l inij i sledi ime fajla. S intaksa za ovakav format GAWK
izgleda ovako : gawk
' sablon
}
gawk - akcij e j ,
imena fajl o va
Kora k po korak 1. 2.
Kreirate skript faj l
pod nazivom Jield3 u koji možete da postavite GAWK instrukciju. Instrukc ij a će da štampa prva tri polja svake l in ij e . Navedite GAWK ins tru kcij u pod navodnim znacima, počevši sa j e dnostru kim navodnikom pre nego što otvorite veliku zagradu, a na kraju navodite još j edan posle gawk komande.
3. 4. 5. 6. 7.
Kreirajte for p etlju koja inicijalizuje promenijivu i i inkrementira je tri puta. Kre i raj t e iskaz printf koj i korist i vrednost i za pozivanje polja, počevši od prvog i završavajući se na trećem polju. Kreirajte kon a čn i printf iskaz koji d aj e prelazak II novu l iniju pošto s e petlja završi. U poslednjoj l inij i , iza zatvorene zagrade sledi jednostruki znak navoda. Zatim unosite ime fajla iz kojeg će GAWK da čira (books) . Postavljate dozvolu za izvršavanj e za skript fajl, a zatim ga izvršavate prosto unošenjem imena skript fajla. Ovde je prikazan sadržaj field3 skripta : gawk ' { 1or ( 1�1 ; ( 1 < STDIN > je slična komalJ.di read u BASH shell programskom jeziku. Da biste koristili ulaz koji čita < STDIN > , d o d eljujete mu promenijivu . Možete
sam i da definišete promenijivu, ili da koristite podrazumevanu promenijivu $ kao
š to je prikazano u sledećem primeru . $_ se pod razumeva za m no ge komande . Ako
se u print ko mand i ne navede argument , štampa se vrednost $_. I s to , ako koma
nda chomp nema argumente, radi sa $_ p relazeći u n ovu liniju . sledećeg primera ilustruje korišćenje $_ sa standardnim ulazom. # ! / u s r / b i n / pe rl
$_=<STD I N> ; p r int " Th i s i s what I e n t e red :
$_ " ;
Sledi izvršenje myread skripta. $ myread
larisa and ale ina T h i s is what
I e n t e red : l a r i s a and a l e i n a
Skript myrea d iz
1 41
1 42
Jezici višeg n ivoa
Korišćenje sta ndard nog izlaza Za upis podataka u bilo koj i fajl ili na standardni izlaz koristite komandu p rint. Posle komande print, a pre podataka (stringovi ili promenlj ive) se postavlja file-handle. Ako se ne određuje file handle, komanda print štampa podatke na standardni izlaz. Obe komande u sledećem primeru štampaju string "hello\n" na standardni izlaz. Eksplicitni file handie za standardni izlaz je STDOUT. p r i n t STOO UT ' h e l l o \ n ' ; p r i n t ' he l l o \ n ' ;
Ako se ne određeaju podaci za štampanje, komanda p rint koristi sadržaj $_. Drugim rečima, sve što prethodna komanda < STDIN > pročita i do deli promenijivoj $_, ko m a nda print štampa. Ako s� štampa na standardni izlaz, sadr�aj promenUive $_ se šalje na standardni izlaz. Skript myecho.pl čita linij u sa standardnog u l a z a , a zatim š tampa to što je pročitao. # I / u s r / bin / perl
$_"<STDIN> ; p rint ;
Sledi izvršenje myecho.pl skripta. $ myecho . pl my n a m e is Dyl a n my
name
is Dylan
takođe ima i komandu printf koja funkcioniše slično onoj u GAWK ili Kao argumente uzima format l iste i l istu promenljivih ili vre dnosti . Format liste ko ris ti specifikatore konve rzij e koji se koris te za konverziju podataka u odgo varajuće promenljive ili vrednosti koje će da se štam paju. Na primer, %d je speci fikator konverzije za cele brojeve, %8 za stringove , a %f za brojeve u pokretnom zarezu. Pogledajte peto poglavlje, "GAWK" u kom je navedena kompletna l ista i detaljno objašnjenje ko ma n de printf. Sledeći primer konvertuje celi broj il string. Perl
e-tL
$num
=
$myneme
14; -
" Lar isa " ;
p r in t f ' Fo r l u n c h %9 ate %đ a p p l e S \ n " , $myname ,
$num ;
Izlaz za ovu printf operaciju bi bio : F o r l u n c h L a r i s a a t e 1 4 a ppl e s
je
Prazan file handle, ";; ;> , je specijalna u la z n a operacija koja čita iz faj la koji naveden u komandnoj l i n ij i k sda se pozove Perl skri p t. Perl će automatski da
file handie za. taj fajl i da čita podatke iz njega. Ako u komand noj liniji n avo dite nekoliko fajlova, tada će Perl da čita sadržaj svih fajlova korišćenjem praznog file handle. Ovo možete da smatrate operacijom cat u kojoj se sadržaj svih navedenih fajlova nadoveZUJe, a zatim učitava u Perl skript. pos tavi
Perl
Perl skript mycat.pl i sledeća GAWK komanda su ekvivalentni. Primetite da se u Perlu petlja koristi za e ks plicitno učitavanje svake linije ulaza . Ovo je mycat.p/ skript: # ! / u s r / b in / pe r l
(
wh i l e
) -./1-----+-
{
Čitanje iz fajlova koji s u uneti kao argumenti u Perl skript
print ;
A,
ovo je
GAWK komanda.
c a t report sum I g awk ' { p r i nt } '
Fi l e handie Z a kreiranje file handie
z a faj l ili
cevovod
(pipe)
možete ria koristite komanrlu
open. Komanda open ima dva argumenta: ime file handie i string sa imenom fajla . Ime file handle može da bude bilo šta, a po konvenciji, zapisuje se velikim slovima. String sa imenom fajl a može da bude ime fajJa ili promenljive u kojoj se čuva ime faj la . S tri n g može da uključi i različite modove za otvaranje fajla. Podrazumeva se da se fajl otvara čitanjem; ali faj l može da se otvara i radi upisa, za dodavanje ili i za či t anj e i za upis. Sintaksa komande open j e : o p e n ( f i l e - h a n d l e , f i le n ame - st ri ng ) ;
Sledeći primer otvara fajl reports, pozivajući file handie kao REPS . o p e n ( R EPS ,
" re p o r t s " ) ;
D a bi se fajl otvorio u specifičnom modu, kao što je upis ili dodavanje, uklj učujete odgovarajući simbol za mod u stringu imena fajla pre nego što navedete ime fajla (razdvajaju se bIanko znakom) . S imboli za modove su prikazani u tabeli 6 . 3.
Pitajte stručnjaka Pitanje:
Može li da se u promenijivoj čuva ime fajla?
Odgovor: Č e s t o se ime faj la čuva u promenljivoj . Tada koristite znak za dolar ($) uz ime promenljive kako bi se pozvalo ime fajla. U ovom primeru, ime fajla "reports" se čuva u promenlj ivoj fi1en. filen
=
" reports " ;
o p e n ( R EPS , $ f i l e n ) ;
1 4�
1 44
J ezici višeg n ivoa
Tabela 6.3: f,d[Qp"
ri:atiie lia fajloyirna
Dozvole za otvaranj e fajla < ime fajia > ime fajla + > ime fajla » ime fajla
komanda I I komanda
Opis Samo čitanje Samo upis Č itanje i upis Dodavanje (zapisani podaci se dodaju na kraj fajl a) Č ita podatke iz cevovoda (pipe) Š alje podatke preko cevovoda (pipe)
Simbol z a veće otvara fajl radi upisa, a znak plus sa simbolom za veće ( + »
omogućava i čitanj e i upis. U sledećem primeru, file reports je otvoren i radi
čitanja i radi upisa. open ( REPS ,
" +>
report s " ) ;
Ako za čuvanje imena p ro m enlj ive ko ri s t i te prom e nIjivu možete da u klj u čit e promenlj ive unutar stringa sa imenom fajla, kao što je ovde prikazano: ,
izračunavanje open
( REPS ,
" +>
$f ilen " )
j
Da biste čitali iz fajla pomoću file hand le, postavljate hand i e između < i > . < REPS > čita liniju iz fajla reports . U myreport skriptu se otvara fajl reports, a zatim se prikazuje njegov sadržaj. # ' / u s r / bin / pe rl open ( R E PS , " < re po rt s ) ; .... ... jf-----!=�O),t� var;:;a;-;n;; jc � fa �jiJ; la� ra;;-;d:Jii)č�it�a;-;n;; �a � wh ile ( < REPS> "
{ print ; o l o s e REPS i
Da biste čitali iz pipe , koristite ko m and u open za kreira nje file handie za pipe. stringu za ime fajla navodite komandu za čitanje podataka iz cevovoda (pipe) , iza koje sledi operator I . Na primer korišćenjem "cat -n reports I " kao stringa za ime fajla izvršavate komandu cat -Il reports koja štampa sve lin ij e u reports fajIu, U
zajedno sa brojevima linija, a zatim ih šaljE' u cevovod (pipe) . Izlaz cevovo d a (pipe) će da budu numerisane lini j e iz reports fajla. Korišćenjem file handI e za ovaj pipe, PREP, Vaš Perl program može da čita ove n ume ris a ne linije . cpen
( PREP , " cat
Možete i da
-n
reperts I " ) j
u pisujete p o da tke u pipe koji mogu da se proslede do neke druge slučaju, operator I se postavlja ispred ko man d e kojom se
komand e _ U ovom
Pt'! rl
podaci prosleduju. U sledećem p ri m e ru , p od a tke
do formatera
o p e n ( PT F ,
" I
PTF handle identifikuje
pipe k oji šalje
teksta pr.
pr " ) ;
Myrepor2.pl skript Vam pokazuje kako da koristite operac ije za čitanje ulaza iz jednog pipea, a štampanje u d rugi pipe . Ovakve operacije Vam daju maksi malnu prednost shell fil te ra ,
kao što su sort, cut, unique, i ostalih programa koji
rade sa standardnim ulazom i izlazom. # ! / u s r / b i n / pe rl open
( PR E P ,
o p e n ( PT F ,
" c at r e p o rt s
I")
i
" I pr" ) ;
wh ile ( < P R E P > ) { p r i n t PTF ;
c l o s e PR E P i c l o s e PTF j
J E D N OMIN UTNA VEŽBA • • •
Koja komanda se koristi za čitanje sa standardnog ulaza? Koja promenljiva se p o drazumeva za izlaz? Koji operator se koristi za otvaranj e fajla i za čitanje i za upis? • <STDlN> • •
$+>
Tekst operator:
.
<
( RE PS ,
$f i l e n " ) or d i e " Ca n ' t open $f i l e n " ;
Operacija and radi na sličan način, s tim što se drugi izraz proverava ako je prvi vratio tačnu vrednost. S ledeći primer traži praznu liniju; ako je pronađe, štampa poruku . r $ / && p r i n t " Fo u n d e m p t y l i ne " ;
Petlie
Pe tlje u
Perlu
while, <Jo-until, for i foreach petlje. Petlj a while j e name nj ene za specijalne potrebe. C-shellu, a veoma je korisna za procesiranje lista i nizova. Petlje while, do-until i for funkcionišu slično od govarajućim petljama u pro gra m sko m jeziku C. Pe tlj a for ima ista tri izraza kao C petlja. Thbela 6.9 rezimira Perl strukture petlji. uključuju
petlja opšte namene, dok su for i foreach petlje Petlja foreach je slična odgovarajućoj petlji II
1 , : , , : , :::',," " "
,: '�': :i,:� :�", "
Upravljačke strukture petlji while (izraz) { iskazi; }
fore inic-izr; test-izr; {
inkrem-izr)
iskazi j što }
{ }
iskazi;
do { iskazi; } until(izraz)
while izvršava iskaze izraz ta č a n .
sve dok je test
Upravlj ačka struktura for izvršava iskaze sve dok je test-izr tačan. Prvi izraz, inic-izr, se izvršava pre nego
p e tlj a počne . Treći izraz, inkrem-izr,
se
foreach promneljiva
Opis
(lista-vrednosti)
i zvršava unutar petlje, posle bloka iskaza. foreach petlj a je namenjena za ra d sa listama vrednos ti, kao što su liste koje se generišu nizovima; operan d u promenljiva se sekvencijalno dodeljuju vrednosti iz liste vrednosti do-until petlja izvršava iskaze dokle god izraz vraća vrednost false.
Pe rl
Preskače o st a tak
next
sledeću iteracij u .
petlje i prelazi na next je slična e
koman d i continue; izvršavaće bilo
koj i continue blok.
Izvršava continue blok kao poslednji iskaz u pedji. Blok se izvdava čak i ako iskaz next počinje sledeću iteraciju.
continue {iskazi; }
while petlja
u Perlu while petlja p o č i nj e
klju čnom reči while, iza koje s led i izra z II m alim se obično navo d i u sledećoj liniji. U ovom bloku može da se n a l az i nekoliko iskaza, s tim d a se iza svakog iskaza navodi ta čka zarez. Blok predstavlja niz iskaza koji se navodi između velikih zagrada . Pe tlj a while mo ž e lako da se adaptira za rad sa nizovima. Promenljiva koja se ko ri s t i za kontrol u petlj e može takođe da se koristi i unutar petlje, za inde ksira nje niza. U titlearr.pl skriptu koj i sledi, elementima niza sa naslovima kao vred n osti se dodeljuju naslovi. Zatim se sadržaj svih elemenata štampa korišćenjem while petlje. Primetite da se u $#title p a mti broj elemenata niza. $#tit1e se koristi kao gornja granica u test izrazu while petlje, kako bi se utvdrilo da li t re b a zaustaviti petlj u . zagradama.
Blok koji sledi iza izraza
# ! / u s r / bi n / perl @t H l e $1
=
=
( " Te m p e st " ,
" I l i ad " ,
" RaVen " ) ;
0j
wh ile ( $ i ; ) { }
Pitanje:
Šta ako se u fo r petlji ne navede test izraz?
Mada prvi i p os le dnji izraz u petlji mogu da budu bilo kakvi iz ra z i s re d nj i izraz je s p e c ij a l an i mora da bude test izraz . Rezultat ovog izraza određuje nastavak izvrš ava nj a p e tlj e M e d u tim Vi možete da izostavite test izraz. U tom slučaju će test izraz da ima uvek vrednost true, tako da ćete da dobi jete beskonačnu petlju. U stvari, ak o Vam je u programu potrebna beskonačna p e tlj a n ajb o lj i način da je dobijete jeste for iskaz sa praznim izrazima. Od govor:
,
.
,
,
fo r (
;
)
;
Kao i kod
while petlje, posle izraza sledi blok iskaza. Sintaksa za foreach
p e tlj u j e : foreach
promenlji va ( l i s ta · vrednosti) iskazi ; }
Pe tlja foreach može da bude koris n a z a u p ravlj anje nizovima. Možete da koristite ime niza za ge n e risa nje liste vrednosti svih elemenata niza, a zatim tu listu iskoristite za listu koj a će da se poziva u foreach petlji. Možete takođe da odredite opseg elemenata niza, koristeći samo određene vrednosti za listu, i li možete da koristite in d ividualni s kup elemenata. U mynumlist.pl skriptu koji sledi, ime niza, @mylist, se koristi za generisanje liste njegovih vrednosti, tako da mogu da se koriste u nutar foreach pe tlje u kojoj se svaka vrednost dodeljUje mynum. ,
# ! / u s r / b i n / p e rl @my l i s t
=
( 34 , 2 1 , 96 , 85 ) ;
f o r e a c h $ m y n u m ( @my l i s t ) { p r i n t " $m y n u m \ n " ;
1 64
Jezici višeg n ivoa
Sledi izvršenje mynumlist.pl skripta. $ mynuml 1 s t . pl 34 21
96 85
Niz @ARGV j e specijalni niz u kom se pamte argumenti koje korisnik unese u komandnoj liniji. Korišćenjem niza @ARGV, možete da odredite komandnu liniju kada pozvani program pos taje lista vrednosti koja se poziva unutar foreach petlje. Promenljiva koja se koristi za foreach petlju se automatski postavlja na svaku vrednost argumenta u nizu : prvim pro4lskom kroz p etlju se promenljiva postavlj a na vrednost prvog argumenta; drugim prolaskom se postavlja na vrednost drugog argumenta, i tako redom. Broj argumenata koje korisnik unosi u komandnoj liniji može da se menja, a vrednost specij alne prom enljive #ARGV j e uvek jednaka broju elemenata niza ARGV. #ARGV m o že da se kori s ti z a utvrđ ivanj e da li ste p ozval i sve elemente ARGV niza kori š će nj em njihovih indeksa. Na primer, da biste koristili foreach petlju za pozivanje svakog ele ment a u ARGV nizu, trebalo biste da koristite operator .. kako bi se generisala lista in d eks a : O .. $#ARGV g en e ri š e listu brojeva, počevši od O, pa sve do vre d no sti $#ARGV. U pbackuparg.pl skriptu koji sledi se po pozivu cbackuparg shell fajla u komandnoj liniji unosi lista e programskih fajlova. U foreach petlji, O . . $#ARGV generiše listu brojeva. Za tri a rgumenta, $ #ARGV i m a vrednost 3, a lista će da bude ( 1 , 2, 3) . Svaki broj se sekvencijalno d o d e lj uj e promenijivoj i, koj a se zat im koristi za indeksiranje ARGV niza. # l / u � r / bin / perl
foreaoh $i (0 . . $#ARGV) { p r i n t " Copy i n g $ARGV [ $ i ] \ n " ; o p e n ( S F I LE ,
"
\ n " ; p r i nt ' < u l> ' ;
op e n d i r ( HOI R ,
( readd i r { HD I R ) )
f o reach $f i l e n { if
(
' $d i r n a m e ' ) j
' $d i r n ame / $f i 1 e n " &&
-f
{ u n le s s ( o pen ( H F I L E ,
"e
( $f i l e n
/ . h t m1 7 $ ! )
)
$ d i r n ame / $f i l e n " ) )
d i e " Co u n t no o p e n f i le $d i r n arne / $f i l e n " ;
$found
0;
=
wh i l e « ( $h11ne {
if ( $h E n e
" ) ; < /TITLE " ) ; $ l po s ,
$rpos
- $lpos ) ;
} p r i n t ' " < l i> $n t it l e < / a > \ n " ;
p rint " < / u l> \ n " ; c l o s e d i r ( HD I R ) ;
} } print
" < / BODY > \ n< ! HTML> \ n " ;
c l o s ed i r ( CD I R ) j
1 71
1 72
Jezici
višeg nivoa
Fu n kciie za rad sa stri ngovi ma Perl obezbeđuje nekoliko funkcija i operatora za m?nipulaciju stringovima, a oni su sumirani u tabeli 6. 1 l . Funkcije length, index i substr izvršavaju standardne operacije nad stringovima, kao što je dobijanje dužine stringa ili kopiranje podstringa iz stringa. Specijalni zadatak izvršava split. Generiše niz od stringa, tako što string odseca u vrednosti koje se dodeljuju elementima niza (pogledajte raniji odeljak, "Funkcije za upravljanje skalarnim nizovima : Operacije nad listama") . Operator tačke (dot) nadovezuje stringove, a operator x generiše string koji sadrži ponavljajuće karaktere. Funkcija chomp odseca kraj izlazne linije, razmak ili tabula tor koji može da se nađe na kraju stringa Veoma je korisna za uklanjanje karaktera za prelazak u novu liniju koji se dodaje stringu prilikom čitanja sa standardnog ulaza, < STDIN > (tekst kojeg korisnik interaktivno unosi u Perl program) . .•
Operacije nad stringovima
Opis
str . str
Operator tačke (.) koji nadovezuje stringove Op e rato r x ponavlja string ili karakter n u m b roj puta
str x num
Funkcije nad
stringovima
Ukl a nja znak za prelazak u n ovu liniju Vraća podstring u određenom stringu,
chomp (str)
substr(stlj
s tart-poz, dužina)
substr(str, start-poz,
određene dužine, počevši od s ta rt-p oz pozicije Zamenjuje određeani deo stringa str, o dređ e ane dužine, počevši od sta r t-p oz sa dodeljenim s tringom
length(str)
Pronalazi dužinu stringa,
i ndex(str, sablan)
Pronalazi poziciju određenog šablona
dužina) =string
stringu,
s tr
u
s tr
P r o nal azi p o s l e dnj u p o z i c ij u određenog šablona u stri n gu, str.
rindex(str, šablon)
Za povezivanje dva stringa možete da koristite operator tačke ( . ) . Sledeći primer d od aj e sufiks . dat nazivu root fajla. Ako je sadržaj promenljive $curfile "myaddress", tada će vrednost $newfile da bude "myaddress.dat" . $Mw1' l l e Mm e
=
$ e u rf i l e
.
" . d at "
;
Sa operatorom za ponavljanje ex) m o žete da ponavljate string bilo koji broj puta. Ispred operatora x navodite string koji će da se ponavlja, a iza operatora se navodi broj puta koliko će da se string ponavlja. String može da se sastoji od jednog ili više karaktera. S le d eći primer ponavlja "hi" če tiri puta.
Pe rl
" hi
"
x 4
Fu nkc ij a length vraća
du ž i nu stringa. Može da se
p rimeni na bilo koju string
uključujući i promenljive polja. Poziv funkcije length("Christophcr") vraća vrednost I I jer postoji I I karaktera. Funkcija length može da se primeni na bilo kakve promenljive. Dužinu strin ga naziva fajla vraća lengih($filename) koji sc pamti u promenljivoj $filename. Kada se koristi bez argumenta, funkcija length vraća dužinu stringa p ro m e nlj ive $_, a to je obično broj karaktera u ulaznoj liniJI. F u n kcij a index pro n alaz i prvu pozicij u šablona u s tring \] , fl rimlf'x fllTl kcijn p ron alaz i p os le d nj u poziciju šablona u stringu . Funkcija !'index može da sc p osmatra kao desna funkcija index koj a poči nj e pretraživanje s d es no g kraja s tri n g a . Po z icij a šablona "en" u Dickens je 5, ako je vraća funkcij a index. Funkcija substr s e koristi ili za kopiranje podstringa datog st r i ng ;] i l i za zamenu pod strin g a određenim stringom. Funkcij a sub str ima tri argumenta. Prvi argument j e string sa kojim funkcij a radi drugi predstavlja poziciju od kOJe p o činje podstring, a treći pred s tavlj a broj karaktera počevši od startne pm;icije podstringa (dužina podstringa) . Funkcija substr inače funkcioniše kao operacija za ko p ira nje Jedini i zuze tak je slučaj kada se koristi sa leve strane operatora dodclc, ka d a substr p ost aj e o pe ra c ija z a m en e pro me nij ivu
,
,
.
.
Poređenie ša blona Kao i u GAWK-u, i u Perlu možete d a tražite šablone. Sintakse z a različita pretraživanj a su date u tabeli 6 . 1 2 . Z a traženje šablona u datoj linij i s e šablon navodi između dve kose crte. /Dickens/ traž i šablon "Dickens" u liniji. Podrazumeva se traženje šablona u s a d ržaju promenlj ive $ u kojoj se obično pamti sadržaj poslednje učitane ulazne linije, bez obzira odakle potiče. _
Tabela
,
�;12: Traženie šablol'l�:� �,,�;r'3f ; /'
Sintaksa za traženje šablona Ireg-izri
var = -Ireg-izri var! -Ireg-izri
Opis Poredi šablon korišćenjem regularnog izraza Pronalazi pojavu regularnog izraza u string p ro men ijivoj var Proverava da li se string promenljiva var ne javlja u re gu larno m izrazu
Ako je poslednja ulazna komanda bila < STDIN > , u $ će da se pamti standardni ulaz, a svi sledeći šabloni ne određuju sledeću metu traženja u toj liniji. U sledećem primeru se najpre čita linij a sa standardnog ulaza, a zatim se traži šablon /Dickens/ u njoj. _
·
$_
=
<STD I N > ;
/ Dic k e n s / ;
1 73
1 74
Jezici višeg n ivoa
Za razliku od GAWK-a, Perl ne čita automatski sve linije sa u l aznog izvora. Za čitanje svih ulaznih l inija treba eksplicitno da se navede ko m a n d a read za svaku liniju. Zato za pretraživanje svake linije sa standardnog ulaza morate eksplicitno da pročitate svaku liniju sa komandom < STDIN > , a zatim da tražite šablon pomoću operacije pretraživanja. To može lako da se izvede korišćenjem while petlje. U sledećem primeru, while petlja čita sve ulazne linije sa standardnog ulaza, a zatim traži šablon /Dickens/. Uz traženje šablona se koristi if uslov, /Dickens/, a zatim komanda print za štampanje linija u kojima je pronađen šablon. w h i l e ( <STD I N> ) if
/ D i c k en s / print ;
Poređenje ša blona na promen l j ivi m a :
= -
Za traženje šablona u sadržaju promenljive se koristi operator - zajedno sa operacijom traženja šablona. Kao levi operand koristite ime pro m c nlj ive , a kao desni operand koristite o peraciju traženj a šablona . Sledeći primer traži šablon =
"Christmas"
u promenljivoj $title.
$ t l t l e -- / Ch ri s t m a s /
Ako ste po d atak i z ulaznog izvora učitali u promenijivu, mo ž ete pretraživati podatak poređenjem operatora = -, a šablon se tra ži na toj promcnljivoj . Sledcći primer čita podatak sa sta n dardn o g ulaza u p rom e n ljivLl $title. Z a t i m se koristi operacija traženja šablona za traženje šablona "Christmas" . $t i t l e
�
Stitle
=�
<STO I N > ; I C h ri5tma 5 / ;
Ovu tehniku možete da kori stite za pretraživa nj e [aj lova, liniju po liniju. Pretpostavimo da postoji fajl sa nasl ovim a pod nazivom newtitles, u kom svaka linija predstavlj a naslov neke knj ige . Sledeći p ro g ra m će da u po re d uje sve naslove sa šablonom "Christmas" tako što će da čita jedan po jedan naslov (u ovom slučaju liniju) , dodeliti ga promenijivoj $title, a zatim ovu promenljivu
porediti sa šablonom. open ( NT ITLES ,
'
.
fajla
Tada select_title odlučuje da l i kao naslov u zi ma ime faj1a ili naslov iz < TITLE > linije. Ak o s e naslov uzima i z < TITLE > linij e , trebao bi da s e pozove potprogram get_title radi razdvaj anj a naslova korišćenjem indeksa i operacije izvlačenj a podstringa .
.4.
Primetite da search_file vraća dve vrednosti. Prva vre d n ost je O ili 1 , koja ukazuje na to da li j f' šablon pronađen ili ne, a druga vrednost predstavlja
u kojoj je pronađe n šablon . sel�ct_title se prenose tri argumenta, i svi su dodeljeni lokalnim promenIjivim (found, filename i titleline) , tako što se vrednostima @_ niza dodeljuje lista lokalnih promenljivih. Individualno dodeljivanje argumenata lokalnim promenljivim search_file koristi, ali j e lakše koristiti l istu p r ome n ljiv i h i niz @_' Na prime r,
liniju U
my
( $hfile , $ s e a rchst r )
Sledi myhtsub.pl
skript.
-
@_ ;
Perl
# l / u s r / b i n / pe r l
s u b s e a r c h_f i l e ; s u b s e l e c t t it l e i _
s u b get_t it I o ; p r i nt " < HTML> \ n \ n<TI TLE>My I ndex< / T I TLE> \ n < / HEAD> \ I'I \ n " ; p r i n t " I ndex of HTM L Files< / H 1 > \ n " i
o p e n d i r ( CD I R , " . " j
;
foreach $di rname (
r e a d d i r ( CD I R )
-d $d i r n am e && ! ( $d i r n am e
if
A / \
•
/))
{ print
" < h2>$d i rname< / h2> \ n< u l> \ n " ;
o p e nd i r ( HDI R , " $ d i r n a m e " j ; fo reach $f ilen ( ( readd i r ( HDI R ) )
if (
.f
" $d i r n ame / $f 1 l e n " &&
{ ( $fo u nd , $tline ) =
$ n t it l e
=
s e l e c t_t i t l e ( $f o u n d ,
p rint " < / ul> \ n " ; c l o s e d i r ( HDI R ) ;
p r int " < / BODY> \ n < / HTML> \ n " ; c l o s ed i r ( CD I R ) ;
s u b search file my $ h f i l e
=
$_ [ 0 ] j
my $ s e a r c h s t r = $ [ l ] j
_
my ( $ h l i n e , $ f o u n d )
=
(""
u n l e s s ( op e n ( H F I L E ,
,
0) j " < $ h f ile " »
d i e " Co u n t no o p e n f i le $ h f i l e " ; w h i l e ( ( $fo u nd
{ if ( $h l i n e
0 ) && ( $h l i n e = < H F I LE» / $ s e a r c h st r / )
$f o u n d = l j
/ . html?$ / ) " TITLE " ) j )
$f i l e n I $ t l i n e
i
h r ef=$d i rn a m e / $f i l e n >$ n t i t l e < / a> \ n " j
}
}
�-
search_file ( " $dirname / $f ilon " ,
" < l i>1- . je, kao što
TeI/Tk proširenia i a p l i kaciie
Trenutno i Td i
razvija i podržava Sciprics, ko mp a n ij a koju j e 1 997.godine (u štamp i ) za Tel i Tk je 8 . 3 . Tekuće verzije, koje se plaćaju, možete da d o bij ete na ScipticsTcl/Tk web sajtu na http;!/dev.skriptics.com. Na ovom sajtu možete da pro na đ e te i o bim nu doku mentaciju za sve pro i zvo d e u PostSkript, Adobe PDF i HTML formatima. HTML dokumentacija može da p re gled a online. RPM pa kova n a verzija može d a se pronađe na sajtu za Red Hat na ftp.redhat.com. Biće Vam p o tre bn i i Tel i Tk Tk
osnovao John Ousterhout. Tekuće i zdanje
RPM paketi kao i ra.,;v ojni paketi za oba. Tel/Tk j'e unllprf'df'll proširenjima koj a povećavaju m ogu ćno sti jezika. Nekoliko n ajčešće korišćenih proširenja su TcIX, i ncr Tei i Orate!' Ova proširenja su 'dostupna preko linkova sa Skriptics web s aj t a . Pris t u p i te Tel Resource strani ci, a odatle idite na Tel Sofrware stranicu . O d atl e možete da pristupite lixtensions stranici na kojoj su navedena trenutno ras p oloživa proširenja (dev.skriptics. com/resources/so{tware/extensions) - većinu možete da učirate i in stal irate besplatno.
Too l Com m o n d
.. TclX proširuj e mogućnosti kao
L� ngu�ge (Td)
što su pristup faj l ovi m a i manipulacij a
vre
men om i datumom, a mnoge od njih su u klju čene u s korija Tel izdanja. .. incr Tel podržava laku implementaciju mehanizama višeg nivoa, korišćenjem objektno o rij e ntis an ih p ro gram skih struktura.
.. BLT dodaj e grafičke i ba r naprave u Tk. .. Sybtcl i Oratcl implementiraju i nte rfejse
baza podataka
u
Sybase i Oracle
baze podataka.
• TelDP o b e z b e đ uj e p od ršku za d i s trib u i ra n o programiranje preko mreže. .. TrfCrypt proširenje dodaj e šifrovanje koje j e bilo uklonj eno iz standardnog
Tel/Tk izdanja kako bi bilo eksportabilnij e .
Brojne TcI[rk � p l i k�eije, razvojne a l atke i pomoćni prog ra m i m o g u
da
se
dobiju
besplatno sa razl ičitih I nternet sa jtova . Do veći ne ovi h sa jtova možete do dođete preko
Tel softve rskog p� n e l a na Skri pties s� it� .
tclsh
shel l i s kri ptovi možete interaktivno da izvršavate Tel komande unošenjem kom a n di u Tel shell p rom p t u i izvršavajući ih j ed nu 'po jednu; ili m o žete da postavljate komande u skript fajl i tako ih izvršavate sve odjednom. Unesite komandu tclsh za startovanje Tel shella sa % promptom. Možete da unesite po jednu Tel komandu, a zatim se određuju pritiskom na · ENTER. Iz Tel shella izlazite komandom exit il i pritiskanjem Ctri-D: Unutar Tel shella
,
$ t1 h % set age 1 1 % puts $age 11 % exit $
Komanda tclsh se implementira kao link do stvarnog telsh programa. Ime programa se sastoji od telsh kojem je pridružen broj verzije, kao na primer, tclsh8. 3 za verziju 8 . 3 . Ako Vaš sistem ne implementira telsh link, moraćete da koristite komandu tclsh ili da sami implementirate link. Tel skript možete da pokrenete bilo kao samostalni program ili kao fajl kojeg ekspli
s e t d ir [ l i n d e x $argv 0 ] } else { s e t d ir
# I s pun j a v a n j e p o l j a za l i s t u ( . l i s t ) sa l i s t om f a j lova i d ire k t or i j uma d o b i j e n o m iz ls e d $ d ir
f o r e a c h i [ ex e c l s - a ] { if [ f i l e i s f i l e $ i ] { .
}
l i s t i n s e rt e n d $ i
22�
224
Jezici vi šeg n ivoa
# Postavl j anj e veza ( priklj ucaka ) za faj l menager . Cont rol · C zatvara proz o r .
bind a l l { d e s t roy . }
Događaii i povezivači (bi nd ings) Tk program je upravljan događajem, što znači da z a pokretanje čeka događaj, kao što je događaj kojeg izaziva miš ili događaj sa tastature. Događaj miša može da bude klik na d ugme, dvoklik ili čak pomeranje miša gore dole. Događaj tastature može da bude pritiskanje kontrolnog tastera ili meta tastera ili može da bude pritiskanje tastera ENTER za kraj unošenja podataka. Kada program detektuje pojed inačni događaj, on preduzima akciju. Ova akcija može da bude neka grafička operacija, kao što je prikazivanje nekog menija, ili može da bude izvršenje Tci, Perl ili shell
programa. Akcij e se eksplicitno o gra nič avaj u na date događaje korišćenjem koma nd e bind. Komanda bind kao argumente uzima ime obj e kta ili klase, d o gađ aj koj i se spaja i akciju ve za nu za taj d oga đ aj . Kad god događaj zauzima mesto u okviru objekta, izvršava se o d re đena akcij a . Sledi primer pridruživanja ulaza. Z a događaj pritiskanj a tastera CTRL-C se izvršava akcij a uništavanj a svih mehanizama i program se završava.
šablon ,
događaja
b i n d a l l { d e
t roy . }
Komanda bind se koristi za povezivanje događaj a u Tk objektu s a Tci koma koju želite da izvršite. To bi moglo da se shvati kao da Vaš Tci pro gram delite
ndom
u segmente koji se povezuju sa događajem u Tk
objektu . Kada se događaj p os tavi u
objekat, izvršava se njemu pridruženi skup Tci komandi . To znači da možete da ugnežđavate objekte i njihove događaje. Tel ko man d e koje se izvršavaju u j e d nom Tk događaju mogu da u klj uče Tk komande i objekte sa događajima koji su već uključeni u druge Tel komande. Događaj može da se pokrene bilo sa tastature pritiskanje m tastera, ili okida nje m preko klika miša. Događaj koji se predstavlja u Tk kodu j e šablon događaja. Na primer;- pritiskanje tastera BACKSPACE j e dog ađ aj koji se predstavlja šablonom događaja < CTRL-H > . Šabloni d ogađaj a se zatvaraju u okviru simbola < > . Klik na dugme miša se predstavlja sa < Button- l > . Za prikazivanje d ogađaj a kao što je dvoklik, uno site modifikator pre događaja. Na primer, š ablon događaja za dvoklik < Double-Button- l > , gde je Double modifikator za d ogađ aj Button-l . Pogledajte rabelu 8.4 u kojoj su nave d en i Tk šabloni događaja. Povezivači (Bindings) su klj učne operacionaine kompo n e nte Tk programa. Povezivači d etektuju događaje koj i upravljaju progra m i ma . Tk program možete da smatrate beskonačnom petljom koja neprestano skenira pojavu specifičnih Tk
Tk
događaja Cbindings) . Kada se događaj detektuje, kao što su klik miša ili pritisak na tastaturu, program izvršava akciju pridruženu
tom dugađaju.
Povezivač možete da p osmatrate kao više groma. Povezivači ne koriste potpuno istu
ulaznih točaka, gde počinju ro"dičiti delovi pro' strukturu kojCl se koristi kod tmdidonCllnih hije rarhijskih, sekvencijainih prog ra ma. Pove};ivoč stratuje svoju sekvencu komondi, ili svoj prog ra m . Ovo znači dCl zCI prClćenje kontrole toko Tk progmmCl stortujete povezivač . .Svoki povezivač ima svo j put, ili svo j u kontrolu toka.
,;t9$JiiI, jfji&�i�!9�i d�godaiQ•.·.� �C!m����::ililf�,i;j� : ���;,! Sekvenca šablona događaja < Pritisak na taster>
Opis Bilo koji taster sa tastature
<modifikator-modifikator-tip-detalj>
Sekvenca događaja, kao što je
taster ili klik miša
CTRL
Modifikatori šablona događaja Control
CTRL
taster
Shift
SHIFT
Lock
CAPS
Alt
ALT
Me r a, M
taster
LOCK
taster
.
taster
Meta taster
B utto n 1 , Bl
Prvo dugme miša
Button2, B2
B utton3 , B 3
Dru go du gme miša Treće dugme miša
Button4, B4
Četvrto dugme miša
ButtonS , BS
Peto d ugme miša
Mod I , M l
Modifikator l
Mod2, M2
Mo difikato r 2
M od 3 , M3
Modifikator 3
M o d 4 , M4
Modifikator 4
Double
Dvostruko ponavljanje d o g a đaja , kao š to je dvokl ik miša
Triple
Trostruko ponavljanje što je troklik miša
d o ga đaj a ,
kao
Tipovi d o gađ aja B"uttonPress, Button
Pritisak na dugme miša ; p o dra zu meva se za Button modifikator
ButtonRelease
Otpuštanje dugmeta miša
Destroy
Uništavanj e mehanizma
En ter
Unošenje mehanizma
225
226
Jezici višeg n ivoa
Tipovi događaja KeyPress, Key
Pritisak na taster
KeyRelease
Otpuštanje tastera
Leave
Napuštanje mehanizma
Motion
Prelazak preko mehanizma
Detalji događaja For Buttons
Broj dugmeta; ako nije dat broj dugmeta, važi za svu dugmad
1 23 4 5
Ako je tip izostavljen, podrazumevani tip je ButtonPres s Button-1 j e isto što i Button-ButtonPres s - l
Keypress
Simbol tastera predstavljenog na tastaturi na primer, A, ZAREZ,
SHIFT-R
-
Ove akcije mogu da budu bilo koja Tel/Tk komanda ili niz komandi. Obično su ove kom ande pozivi funkcija koje izvršavaju složene ope ra cij e Kada se ove komande izvrše, program nastavlja sa s ke n iranj e , p oj ave ostalih p ridruženih događaja. Ovo skeniranje se nastavlja d ok se ne identifikuju koma nde exit ili destroy, što se postiže sa CTRL-C povezivačem. Program mydir2, koji je pri ka z a n na slici 8-2, i l us utruj e finkcije i objekte pove;-;ivača . Ovde je po b olj š an mydir 1 program sa mo gućnošću prikazivanja dva polja za liste : jedna za direktorijume, a druga za liste. S va ka lista ima svoj skrol bar. Po lj e za listu direktorijuma je nazvano .listdir, a njen skro l bar je nazvan .scrolldir. Svako polje za listu i njen skrol bar se definišu, a zatim kreiraju, ta ko da će se .listdir i .scrolldir najpre pojaviti sa leve strane prozora. Tel funkcija listdirsfunc se zatim definiše za p opu nj avanje oba polja za liste. Kao argument ove funkcije se uzima direktorij um. Komanda cd će da pređe na raj direktorijum, obezbeđujući mogućnost izlistavanja razl ičitih direktorijuma. .
S l i ka 8.2 Palja. za. liste direktoriju.ma i fajlova z a mydir2
Tk
Zatim se direktorijum proverava sa testom isdirectory, i
p olje za listu.
postavlja
u .listdir
p r o c l i s t d i rs f u n c d i r { . listdir delete 0
. l ist delete
end
0 end
c d $d i r
f o reach i [ exec l s · a l { if [ f ile isdirecto ry $ i ] . l i s t d i r i n s e rt e n d $ i
} else { . l i s t i n s e rt e n d S i
}
Iza definicij e
fu nkcij e sledi njen poziv. Funkcija listdirsfuncs mora da se svako polje za l istu kako bi se polja i sp u n i l a sadržajem
pozove po j e d no m za tekućeg direktorijuma. #
P rvi
p u t p r i k a zu j e
l i s t d i r sf u n c $d i r
d i r e kt o r i j ume
i
f a j love
Sada postoji povezivač z a .listdir objekat. Dvoklik n a levo dugme miš a , Double-Button- l , s e vezuje za p o z iv funkcije listdirfuncs za .listdir polje z a l i s tu Ovaj p ove ziva č omogućava pozivanje fu nkcij e listdirsfuncs svaki put kad se izvede dvoklik u polj u za listu. Ako u polju za lis tu .list nema povezivača, dvoklik u to m p o lj u neće da ima efekta. .
bind
.
l i st d i r < D o u b l e · B u t t o n · 1 > { s e t i [ s e l ec t i o n
l i s t d i rsfunc
get ]
Si}
Z a .listdir s e vezuju dve aRcije z a slučaj dvoklika.
One se navode u velikim
zagradama - kada imate više akcija koje se izvršavaju sa povezivačem, morate da
ih postavite između velikih zagrada. Prva akcija je operacija kojom se dobija ime
selektovanog direktorijuma iz prvog polja za listu. Stavka se selektuje kada u polju
za listu kliknete na nju . Operacija selection get će da vrati selektovanu stavku - u ovom slučaju, ime direktorijuma. Ime direktorijuma je dodeljeno promenljivoj i. Ova promenljiva se koristi kao argument u pozivu funkcije listdirsfunc, druge akci je. Ove dve akcije Vam ilustruju način dobijanja vrednosti i njihovog prenosa u vidu argumenata funkcije, sve unutar povezivača. Najpre dobijete vrednosti, dodelite ih promenljivima, a zatim te promenljive koristite kao argumente u pozivu funkcije. Sledi sadržaj
mydir2
skripta :
# ! / u s r / bin /wish · f # K r e i r a n j e s k ro l b a r a i p o l j a z a l i s t u z a d i r e k t o r i j ume s c r o l l b a r . s c ro l l d i r · c o mmand " . l i s t d i r y v i ew " l i s t b o x . l i s t d i r · y s c r o l l " . s c r o l ld i r set "
· re l i e f s u n k e n · widt h 1 5 .
227
228
Jezici višeg n ivoa
height 1 5 -
s e t g r i d yes
p a c k . l i s t d i r . s e ro l ld i r
- s id e left
# K r e i ra n j e s k ro l b a r a i p ol j a
za
-
f i l l bot h - e x pand y e s - a n c h o r w
l i s t u za f a j love
sc r o l l b a r . s e ro l l - command ' . l i s t yview' - r e l i e f s u n k e n - widt h 1 5
list box . l ist - ys c ro l l ' . s e r o l l s e t "
-
height 1 5
- s e t g r id y e s - s id e l e f t
pac k . l i s t . s e r o l l
- f i l l b o t h - e x p a n d yes - a n c h o r w
# P ro v e r a v a n j e da li j e a rg ument u n e t
if $ a rg c > 0 { se t d i r [ l index $a rgv 0 ] } else { s et d i r " . " }
# Funkc ij a z a odvoj eno izlistavan j e # Na j p re se b r isu tekuci u l az i proc listdirsfunc d i r { . li s t d i r d e l e t e 0
. l ist d e l e t e
d i r e k t o ri j u m a i f a j lova
end
0 end
cd $dir
fo reach i [ exec l s if
a l
{
[ file isdirectory $ i l
. l i s t d l r i n s e r t end $ i
else {
. l ist i n s e rt end $t
}
#
Prikazivan j e d i r e k t o r i j uma Sdi r
i f a j lova po p r v i p u t
l is t d i rsf u n c
# Post a v l j a n j e p o v e z i v a c a
�a
p r e t razivac .
đVof
Sadrži iskačući
gnome-popl1p-menu
Uključuje anizmima
gnome-preferences
Sadrži rutine za pozivanje GNOME osobina
i postavlj anje
gnome-startup
Uključuje interne rutine za sesijama
upravljanje
gnome types
Sadrži neke globalne tip ove koji se ko ris te GNOME bibliotekama
-
gnome-winhints gl kcauldron
GnomeMDI
hclp sistcm za GtkWidgets ru tin c za p ri d r u živa nje menija meh
Sadrži rutine za
u
manipulaciju
GNOME-specifičnim p ro zori ma sa u p ut s tvima
Iz formata stringova proizvodi gtk!GNOME okv i re za d ij a l og
Biblioteka Ilbgtk je GTK Toolkit biblioteka. Poseduje profc s ionaln i skup me h a koji je TIn više načina superioran u odnosu na ostale skupove mehanizama. GNOME aplikacije su u potpuno sti pisanekorišćcnjcIl1 Iibgtk za sve GUI elemente (dugmad, fl H'n iji, skrol barovi i tako dalje). Biblioteka libgnorb a obezbeđuje podršku za CORBA operacije. kao što je dobijanje re ferenci na obje kte i zahtevanje novih instanci objekata. B i blioteka libzvt je jednostavna biblioteka koja sadrži terminaini mehanizam. B i bl ioteka libartJgpl čuva grafičke funkcije koje mogu da se
nizama
koriste sa GnomeCanvas mehanizmom.
GNOME
JEDNOMINUTNA VEŽBA IM iIll
Da li GNOME ima svog menadžera prozora?
Koje su dve biblioteke neophodne za sve GNOME aplikacije? iii Illl
No libgnome i libgnomeui
GTK+
se sastoji od proširenog skupa funkcija za mehanizme različitih tipova. kao i prozori. Takođe podržava pove zivače koji Sl' ciodl'l)IlJIl GUI događajima, kao što su klik miša uz objekte kao što su d u gm ad . Proverite onli ne dok umen taciju za GTK API na www.gtk.org i developer.gnome.org Wweb sajtovima. Dokumentacija uključuje opsežne listi nge svih GTK funkcija, kao i deta lj n i tutorijal za GTK programiranj e . Preporučuje se korišćenje ove doku me n tacij e - zbog ograničenosti veličine, ova knjiga p red s tavlja samo kratki uvod i navodi nekoliko najuobi čaj en ij ih GTK funkcija. Takođe, proverite fajlove GrK GTK
što su meniji, d ug mad
zaglavlja u koji ma se nalazi detaljna deklaracija
razlit'itih funkcija i struktu ra,
uključujući njihove argumente i vrednosti koje vraćaju. Za GTK program je neophodno nekoliko osnovni h fu nkcij a i kompone nt i .
Najpre morate da uključite gtk.h fajl zaglavlja. Mogu da se zahtevaju i ostali fajlnvi z aglavlj a, zavisno od mehanizama i funkcija koj e koristite. Zatim treba da defi nišete pokazivače na mehanizme koje nameravate da definišete i koristite. Potom treba da inicijalizujete GTK biblioteku sa fu nkcijom gtk_init. Kada to uradite, možete da definišete Vaše mehanizme korišćenjem GTK funkcija i da dodelite a drese pokazivačima koje ste ranije d e finisali . GrK funkcij e mogu da se kor iste za određivanje akcija i atribu ta mehanizama, kao što je njihovo prikazivanje. Na pri mer, događaj zatvaranja okvira (delete_event) sc povezuje sa prozorom, kao i funk cija gtk_main_quit, tako da kada god kori snik u prozoru klikne na okvir Close, program se završava. Konačno, za pokretanje mehanizma koristite funkciju grk_main. Sledeći program
base.c
definiše prosti
jednostavni prozor: base
#i n clud e i n t main ( int
arg c , cha r * a rg v [ )
)
GTK program koji prik a z uje
2S1
252
GUI programiranie
G t kWi d g e t *wi n d o w1j g t k in it (&arg c , &arg v); _
g t k sig n al co n n ect (GTK OBJECT (window1) , "de le t e e v e n t " , _ _ _ _ G TK SIGNAL_FUNC (gt k main qu i t ) , NULL); _ _ _
retu rn(0) j
Fajl zaglavlja, gtk,h uključuje definicije GTK promenlj ive , makroa i funkcija. Definiše se window1 kao pokazivač na strukturu nazvanu GtkWidget. Stvarna s t ru ktura na koju pokazujc ćc da bude određena ka sn ije , funkcijom koja se koristi za kreiranje date str ukt ure . Funkcija gtk_init kreira inicijalne postav k e ,
kao što je podrazumevana vizuelna i kolorna mapa, a zatim po z iva gdkJnit funkciju za i n icij a lizaciju GrK b i bl ioteke i proverava GTK argumente. Fun kc ij a gtk_window_new kreira novi prozor, vraća njcgovu adre su , a ta adresa se zatim
dode lj u je pokaziva ču na prozor. Prozor sada ukazuje na GTK
strukturu prozora,
prozor pod kontrolu menadžera prozora, korišćenjem podrazumevane funkcije menadžera prozora za prikazivanje pro zo ra . Funkcija gtk_widget-show prikazuj e prozor - primetite
Arg u men t
GTK_WINDOW TOP
LEVEL
postavlja
da se poka z iv a č prozore! koristi ke!o e!rgument
u
ovoj funkciji, Konačno, funkcija
gtk_main startuje int eraktivni proces, čekajući da se poj avi do ga đ aj , sel e ktova n je dugmeta i klik miša.
kao što
je
GTK + program možete da kompajlirate korišćenjem gcc kompajlera i GTK + bibl ioteka . Za određiva njc GTK + biblioteka u komandnoj l inij i , koristite komandu gtk-config, Ova komanda određuje opcije k ompajiera n eophodne za kompajliranje
GTK + programa .
'gtk.conflg ..Cflags ··llbs'
gtk-config je program koji se izvršava u komandnoj liniji. Da biste to izveli, okmžujete ga zajedno sa njegovi m argumentima kosim navodnicima, Kosi
operatori koji se koriste za izvršavanje zatvorenih komandi u komandnoj liniji i postavljaju vraćene vrednosti na isto mesto u toj liniji .
navodnici Sl! shell
Funkcionisanje ove opere!cije možete da smatrale m akrooI11 , s tim da vraćene vred n os ti zamenjl!ju izvršenu komandu. U ovom slučaju, gtk-config k o m a nda sa
argumentima
cflags i libs postavl ja
GTK flegove kompajIera i biblio teke koje su Koma nda gcc se za tim izvršava
u komandnoj li n iji neophodne za koma n d u gcc.
sa ovim t1egovimrt i hihliotelwma. gOD hello.c
o hello 'gtk conf1g ··cflags --libs'
GNOME
Najčešće korišćene biblioteke su navedene u tabeli 9.5. Tipovi programskog jezika koji se koristi za GTK + programiranje mogu da se kategorišu u osnovne, ugrađene i objektne tipove. Osnovni tipovi su poput standardnog e tipa progr am a i os no vnih tipova klasa za GTK +, kao što su GTK_1YPE_OBJECT. Osnovni tipovi se automatski definišu sa gtk_init.
Biblioteka
Opis
GTK (-lgtk)
GTK biblioteka mehanizama
GDK (-lgdk) gmod ule C-Igm odule)
Xlib wrapper
Glib (-lglib)
GTK je ugrađen na vrhu Glib i uvek je zahteva
Xlib (-DnI)
Koristi je GDK
Xext (-IXext)
D elj ena memorija sa pixmap slikama i ostale X ekstenzije
math (-lm)
Matematička biblioteka
Runtime ekstenzije
U građ e ni tipovi uključuju neka osnovna nabraj anj a, flegove, i strukture poput GdkWindow - ove tip o ve GTK + ne mora da razume. Objektni tipovi se sastoje od registrovanih GtkObject tipova.
Signali i događaii GNOME programiranje je
nalik ostalom GUI programIranju orij entisano je događajem. U p rogram ima upravlj anim događajima, najpre morate da definišete objekte na kojima korisnik može da operiše, a zatim počinj ete interaktivne funkcije koje kontinualno proveravaju izvesne događaje, kao što je klik mišem ili selekto vanje menija. Kada se detektuj e ovakav događaj, prenosi se do odgovarajuće funkci je radi upravljanja. Na primer, hko korisnik klikne na OK đugme, đetektuje se klik miša i kontrola se prenosi na funkciju postavljenu za upravljanje klikom na OK dugme. Kada se funkcija završi, kontrola se vraća nazad u interaktivni program. GTK uvodi dodatni nivo sofistikacije. Kada se na izvesnom mehanizmu desi događaj, mehanizam emituje signal koji se zatim koristi za izvršavanje funkcije dodeljene tom signalu i objektu. Na primer, kada kliknete na dugme Close, meha nizam Close dugmeta detektuje događaj klika mišem i emituje "clicked" signal. Signal je detektovan i izvršava se dodeljena funkcija. Takođe, ako želite, možete da dodelite događaj direktno funkciji. Da bi ovo radi lo, programer mora da poveže signal na datom objektu sa pojedinačnom funkcijom. Funkcije kojima su dodeljeni pojedinačni signali se nazivaju "handiers" ili "callbacks". Kada se signal emituje, poziva se njegova funkcija povratnog poziva. Ovaj proces se naziva "emisijom". Napomenimo da signal koji se ovde pominje ni na koji način nije sličan signalima koji se koriste u UNIX sistemima.
2S3
254
GUI programiranje
Za dodelj ivanje pojedinačnog događaja funkciji koju želite da izvršavate za dati signal, koristite ili gtk_signal_connect ili gtk_signal_connect_object funkciju. Kada se detektuje signal, automatski se izvršava njemu dodeljena funkcija. Funkcija gtk_signal_connect se koristi za pozivanje funkcije u koju možete da prenosite argumente, a gtk_signatconnect_object se koristi za pozi vanje funkcije bez argumenata. U sledeće m gtk_signal_connect sintaksnom tvrđenju, object je GTkObject kojeg Vi definišete, kao na primer dugme. Name je ime signala, kao klik miša; func je funkcij a koju želite da izvršavate svaki put kada se javi događaj za ovaj objekat; func_data su bilo koji argumenti koji se prenose u datu funkciju. gint gtk_signal_connect! GtkObject GtkSignalFunc
*object� gchar *name, func, gpointer func_data);
Kada se za određivanje objekta detektuje signal, poziva se njemu dodeljena funkcija, kao što j e prikazano u ovoj izjavi sledeće sintakse: void
callback_func( GtkWidget
*widget, gpointcr
callback_data)j
Tako ćete, n a primer, za dodeljivanje klika na du gm e
funkciji
hello
da
koristite sledeći gtk_signal_connect iskaz:
gtk_signal_connect (GTK_08JFCT (mybutton) GTK_SIGNAL_FUNC
Objekat je mybutton, clicked jf' signal
pro gra m er napisa o za izvršavanje u s l učaj u
,
"clicked" ,
(hello),
kl i ka a ,
NULL);
hello
je funkcija
koj u
je
dctcktovanja signala GTK_OBJECT i GTK_SIGNAL]UNC su makroi koji izvršavaju prove ru i .
izbor tipa kako bi se osiguralo da su prenešeni objekti odgovarajućeg
tipa.
objekti imaju signale koji mogu da im se pridruže. Na primer, dugmetu objekta može da se pridrul. i i signal clicked ili signal enter. Signal clicked se javlja kada ko risnik pritisne i otpusti dugme miša, dok se si gnal enter javlja kada korisnik pomera pokazivač miš a preko dugmeta obj ekta. Signali dugmeta su Određeni
sledeći; 1\11 •
pressed releosed dugmetu.
IIII
di�ked
Dugme miša je pritisnuto kada je pokazivač postavljen na dugmetu.
Dugme miša je otpušteno kada je po k azivač postavljen na
D ugme miša je pritisnuto
postavljen na dugmetu. •
tilnttilf
Po ka z ivač miša je pomeren
1\11
lel'lve
Pokazivač miša je
Pitajte stručnjaka Pit/'lnil!� Mo že
povratnog po z iva ?
li
objektu
i
otpušteno dok je poka z iva č miša
na dugme
.
pameren sa dugmeta.
njegovom signal u da se pridruži
više funkcija.
Odgovor: Da, možete da pridružite pojedin ačnom objektu i specifičnom signalu proizvoljan broj funkcija povratnog poziva. Kada se signal pojavi, ove
funkCije se i;?;vršavaju sekvencijalno.
GNOME
Pitanje: Kada se objektu jednom prid ruž i funkcij a povratnog poziva, može li kasnije da se otkaže? Odgovor: Da, ali Va m je potrebno referenciranje oznake te funkcije. Vraćena vrednost za gtk_signatconnect funkciju predstavlja identifikacionu oznaku za tu funkciju. Ova vrednost se pam ti u promenIjivoj tipa gint. Ako k a sn ij e želite da ra zdvoj ite tu funkciju od pojedinog objekta i signala, koristite funkciju gtk_sig nal_disconnect sa identifikacionom oznakom i objektom kao argumentom. void gtk_signal_disconnect( GtkOb]ect 'object,
gint id
)j
U s le de ć e m primeru, funkcija myfunc je d od eljen a kliku mišem na objekat Njena identifikaciona oznaka se pam ti upromenIjivoj m yfun c id , koja se koristi u funkciji gtk_signal_connect za razdvajanj e myfunc od operacije button!.
klika mišem. gint mytuncld;
myfuncid
=
gtk_signal_connect (GTK_OBJECT "clleked",
GTK_SIGNAL.JUNe
(button1), NUL.L.) j
(myfunc),
gtk_ sign al_d isconnect (GTK OBJECT (button1), _
Pitanje: Mogu
li odj ednom da se otkažu sve
myfuncid);
funkcije
koj e su bile pridružene
obje ktu ?
Odgovor: Da, mogu. Funkcija gtk_signal_handlers_destroy funkcije i si gnale od pojedinačnog objekta:
otkazuje
sve
p ri d ru žene
Možete da koristite i sign al
pove zi vanja funkcija za direktno povezivanje funkcijom, ume sto da k o ristite signale. Događaji su poruke koje prenosi XII se rver kako bi ukazao na pojave kao što je klik mišem ili selektovanje menija . U furtkciji gtk_signal_connect, koristite ime događaja umesto signala. Funkcije povratnog poziva za događaje uklj u čuj u dodatne argu- . mente za doga đ a j . . Tip ovog parametra može da bude GdkEvent ili jedan od ne kolik o tipova
događaja sa objektom i
događaj a. Oni su navedeni u tabeli 9.6. void cal l b a c k_func( Gt kWid g e t *wid g e t , Gdk E v ent
g pointer
*ev e n t ,
cal l b a c k_d at a ) ;
Na primer, za dodeljivanje buttonyress_event OK dugmetu, k oristi ć e t e
"buttonyress_event" kao ime signala. Sledeći primer pri d ru ž uj e događaj button_press_event d u gmetu sa
fun kcij om buttonyress_callback:
g t k _signal_conne c t { GTK_OBJECT(but t on ) ,
"button_p ress_e vent",
GTK_S I GNAL_FU NC(b u t ton_p r ess_c allbac k ) ,
NULL ) ;
255
256
GUI
programiranje
Funkcija povratnog poziva se koristi za povezivanje signala - u ovom slučaju buttonyress_callback - a za argument događaja će da se navodi događaj tipa GdkEventButton. static gint button_press_callback( GtkWidget GdkEventButton *event,
*widget, gpointer data )j
Sledeći primer pridružuje klik na prozor Close box sa funkcijom close-win. Objekat je mywindow, delete_event je događaj za Close-box, a close-win je funkcija koju je programer napisao za izvršavanje kada se pojavi ovaj događaj. Kada korisnik klikne na prozor Close box, poziva se funkcija close-win. gtk_signal_connect (GTK_OBJECT (mywindow) ,
"delete_event", . GTK_SIGNAL_FUNC (close-win), NULL) j
Tip događaja
GtkWidget signal
GDK DELETE
"delete ("vent"
GDK DESTROY
"destroy_event"
GDK EXPOSE
"expose_eve nt "
GDK_MOTION_NOTIFY
"m o tio n_ notify_event"
GDK_BUTTON_PRESS
" b utton.-p ress_event"
GDK -2BUTTON-PRESS
"button_press _eve nt"
GDK-3BUTTON-PRESS
"button'-pre ss_event "
GDK-BUTTON-RELEASE
"button-release-event"
GDK
KEY
GDK
KEY RELEASE
PRESS
"key-press_event" "key_rel ease_even t "
GDK_ENTER_NOTIFY
"enter_notify_event"
GDK LEAVE NOTIFY
"leave_notify_event"
GDI(-FOCUS-- CHANGE
"focus_change _ even t "
GDK CONFIGURE
"configure_event "
GDK MAP
" ma p_event"
GDL UNMAP
"unn1ap_event"
UlJK_PROPERTY_NOTIFY
"property_notify_ event"
GDK- SELECTION-CLEAR
"selection_clear_event"
GDK_SELECTION_REQ UEST
"selection_request_event"
GDK-SELECTION-NOTIFY
"selection_notify_even t "
GDK-PROMIXITY-TN
"proximity_in _event"
GDK- CLIENT-EVENT
"client event"
GDI{-\nSIBIUTY-NOTIFY
"visibility not i fy_event"
GDK NO EXPOSE
"no expose _event"
__
GNOME
Signali su smešteni u globalnoj tabeli. Možete da kreiratc svoje signale sa fun kcijom gtk_signatnew, a zatim koristite stk_sisnatemit za oUjekat kOji e mitu je signal Sigurno će gtk_signal_new da vrati identifikator zn novi "ignaL Ovo možete da koristite sa gtk_signatemit da biste imali objekat koji emituje .
taj signal. JEDNOMINUTNA •
II
VEŽBA
Koja se funkcija koristi za povezivanje objekata sa akcijama? Koju funkciju koristite za razdvajanje objekata i akcija? • •
gtk_signal_connect
gtk_signatdisconnect
GNOME
funkciie
GTK + prog ra mi ma ob ez beđuju GNOME funkci interfejsa koji je konzistentan sa stilom GNOME deskt o pa f)a b i s te kreirali jednostavan GTK program, počinjete sa definicijom GTK objekt a za Vaše GNOME mehanizme, a zatim koristite GNOME funkcije za inicijalizaciju programa i d e fin isanje mehanizama. GTK funkcije kao što je gtk_signal_connect se koriste za dodeljivanje GDI događaja objektima, GNOME programi izgrađeni na
je k oje Vam o l akšavaj u kreiranj e GNOME .
funkcijama, kao što je gnome_app_crete_menus kreiraju meni da uključite funkciju inicijalizacije, gnome_init, koju postavljate na samom početkU. Za kreiranje primarn o g prozora Vaše
dok se GNOME
ji.
U GNOME programu m o rate
aplikacije, ko ri sti te gnome_app_new.
Sledeći primer
prikazuje korišćenje funkcija gnomeJnit i gnome_app_new.
Funkcija gnomejnit za argumente ima sve inicijalne argumente koje ko risn ik mora da unese kada se program startuje, kao i ID aplikacije i broj verzije. Inicijalni korisnički
argumenti sc upravljaju specijalnim promenljivima argc i argv.
Kao argum e nti u gnome.:..app_new se
uzimaju naslov kojeg želite da
prikažete u prozoru aplikacij e i ime objekta aplikacije. Vraća se adresa novog objekta, koja se, u ovom primeru, dodeljuje pokazivaču
app. Tako je app pokazi
va č na objekat tipa GtkWidget. GtkWidget *app; g n o me in it ( " " , "0.1" , arg c , arg v ) ; _ app = gn o me _app n e w ("Hello·World ", "Hello App"l; _
Ostale operacije, kao što je prikazivanje mehanizama i startovanje interaktivnog interfejsa, se upravljaju GTK funkcijama. Znamo da će gtk_widget_show_al1 da prikaže mehanizam i s ve ostale mehanizme koji se nalaze u okviru njega. Dok će gtk_main da startuje inetra ktivne operacije, detektujući GUI događaje, kao što je taster i izvršavanje njima
dode ljenih
gtk_widg et_show_all(app); g t k_ma i n (I;
funkcija.
klik
mišem ili pritisak na
257
258
GUI
programiranje
Kom paj i i ra n je
G N OM E
prog rama
U z brojne biblioteke koje s e uključuju u kreiranje GNOME aplikacija, komande kompajiera sa svim navedenim bibliotekama i flegovima mogu da budu veoma složene za konstrukciju. Zbog toga GNOME obezbeđuje gnome-eonfig skript. Poziv ovog skripta postavljate kao argument u operacijama kompajiera umesto ručnog na vo đ e nj a GNOME biblioteka i flegova. Tako, gnome-eonfig ima dve opcije, --cfalgs i --lihs. Opcija --eflags generiše sve flegove koji su Vam potrebni, a --lihs generiše listu svih potrebnih GNOME biblioteka. Kao što je prikazano u sledećem primeru, morate da odredite biblioteke koje nameravate da koristite, kao što su gnomeui i gnome : g n om e - c o n f i g - - c f l a g s · - l i b s g n o m e g n om e u i '
Z a izvršavanje o p e ra cij e gnome-config u operaciji kompajiera, neophodno je njeno navođenje i z me đ u kosih navodnika : g e c myprog . c
·0
myp rog ' � nome ennf i g
c f l a g s · · l i b s g n ome g n om e u i '
Da bi se dobilo pojednostavljenje, možete da postavite ovu o pe racij u II Makefile. U Makefile se vrši odvoj eno kOlll <J pjliranje od povezivanja. Za kompajliranje ćete da koristite gnome-config skript sa opcijom --eflags, a za p ove zivanj e ćete da koristite opciju --libs. U sledećem primeru, makroi CFIAGS i LDFLAGS se koriste za pamćenje rezultata kompajliranja i povezivanja, respektivno . Prime tite upotrebu kosih navo dnika u kodu.
makef i l e
CFLAGS= ' g nome - co n f ig - - c f l a g s g n ome gnomeu i ' LDFLAGS= ' g nome - conf i g
. · l ibs
g n omo g n om e u i '
a l l : b o o k rec boo k ree : f i l e . o c a l c . o cc $ ( LDFLAGS ) main . o - o boo k r e e main . o :
cc
maH\ .
c
$ ( CFLAGS ) IlI a i n . c
f i le . o : f ll e . c f l l � . h oc
S ( CFLAGS ) f ile . c
���i�k(jt9.1! GN!)ME Hello Program hello l . c j e prosta GNOME aplikacija u stilu "Hello World". Program kreira prosti prozor sa d u g metom koje na standardnom izlazu prikazuje poruku. Kada korisnik klikne na Close okvir (delete_event) , prnz('r se zatvara. GNOME funkcije počinju terminom "gnome", dok GTK hmkcije poči nj u sa "grk". Primetite ua Je funkcija inicijalizacije GNOME funkcija, gnome) nit. Kao što je ranije ohjšnjcno, GNOME programi su d o ga đaj e m upravljani: najpre defi nišete Vaše ohjektc , kao što su prozori, zatim postavljale n j i hove atribute, a zatim spajate signale iz događaja, kao što j e klik mišem na ohjekat kao što je pro-
G N OME
zor, i
fu n kcij e koje ohrađuju ove događaj e . Ove funkcije se često nazivaju
funkcijama. D a biste kompajlirali ovaj program, koristite s led e ću komandu za kompajIi ranje u GNOME terminalnom prozoru. Zatim samo unesete hello l kako bi se pokrenuo. Opcija -o odre đ uje ime programa, u ovom slučaju hello. Obavezno koristite kose navodnike za segment gnome.config, Sledeća ilustracija prikaZl! je GNOME p ro zor i dugme. callback
g e c h e l l01 . c - o h c l lo 1
' gnome - co n f ig
c f la g s - - l ibs gnome gnomeu i '
Kora k po korak 1.
2.
J. 4.
Dcfinišite dve funkcije povratnog poziva :
hellomessage i closeprog.
"Hello World". Funkcija c1oscprog poziva gtk_main_quit funkciju kako bi se program završio . U gl a vnoj funkciji definišete dva GtkWidget pokazivača: ap p i mybutton. Poka zivač app bi trebalo da bude pokazivač na glavni p ro zo r aplikacije, a hellomessage samo šta m pa tekst
myb utton na prosti objekat d ugmeta. Kreirajte funkciju g no me_in i t za inicijalizaciju GNOME
interfejsa. o bj ekat dugme korišćenjem funkcije gnome_button_new_withJabel, i dodelite njenu adresu pokazivaču mybutton, kao što je p rika z ano u sledećoj kodnoj liniji. Dugme će da se Kreiraj te
prikazuje sa labelom "Click Me". my b u t t o n 5.
=
g t k bu t t o n new wit h l a b e l ( " Cl ick Me " ) ; _ _ _ _
Kreirajte meh a n i z a m
prozora
aplikacije korišćenjem funkcij e
gnome_app_new, i dodelite njenu adresu pokazivaču app.
6.
Za postavlj anje dugmeta u prozoru ap l i ka cije koristite
gnome_app_set_contents.
7.
Koristite gtk_signal_connect za p ove z iva nje a p likac ij e sa delete_event
koji se j avlj a kada korisnik klikne na Clo se okvir. Ovo postavljate za izvrš ava nj e fu nkc ij e closeprog, koj a kori sti gtk_main_qui t za
signalom,
završavanje programa .
8.
za pove z iva nj e d u gm e ta s a d o gađ aj em klika postavljate ovo za izvršava nje fu nkc ij e hello . Kad go d korisnik klikne na d u gm e , na st and a rd no m i zla zu se prikazuje "Hello Koristite gtk_signatconnect
mišem ( clicked) , i
World". 9.
Koristite funkciju gtk_widget_show_all za prikazivanje prozora aplikacije i dugmadi koje s adrži,
259
260
GLl I
programira n j e
1 0. Z a startovanje interaktivnog interfejsa koristite funkciju
gtk_main.
Sledi sadržaj programa hello l . c : # i n c l u d e < g nome . h >
v o i d h e llome s s ag e ( Gt kWid g e t 'wid g e t J g_p r i n t
data
gpointe r
)
( " He l l o Wo r ld \ n " ) ;
} g i n t c l o s e p r og
( Gt kWidget *widget J
Gd k E v e n t
' event J
g point e r
data
{ g t k m a i n_q u i t ( ) ;
int main ( int
a rg c J c h a r * a r g v [ ]
Gt kWidget
"app ;
G t k Wi d g e t
*mybu t t o n j
)
g n ome init
( '' '' J
my b u t t o n
gt k_bu t t o n_n ew_w i t h _ lab e l ( " C l i c k Me " ) ;
app
=
�
" 0 . 1 " , argc , argv ) ;
g n ome_u p p_ n ew
( " Hello -World " , " H e l l o App " ) ; ( GNOME_APP ( ep p ) , mybut t o n ) ; ( GTK OBJ ECT ( ap p ) , " de l e t e_ev e n t " ,
g n ome a p p s e t c o n t e n t s _ _ _
g t k_s ig n a l_c o n n e c t
GTK S I GNAL FUNC _ _
( c l o s e p rog ) J N U L L ) ;
g t k_s i g n a l_connect ( GTK_OBJ ECT ( my b u t t o n )
J
"
c l icke
d" ,
GTK S I GNAL FUNC ( h e l l ome s s ag e ) J NUL L ) ; gt k_widget_s h ow_ a l l ( ap p ) ; g t l< _ma i n
();
retu rn ( 0 ) ;
)
G N OME
G N OMEApp, too l b a r i m e n u m e h a n izm i
mehanizam je osnovni mehanizam za GNOME aplikacije . Ovaj p ro z o r u ko m se nalaze meniji, toolbarovi i po d a c i . Za kreiranje novog GnomeApp me h an i z ma koristite funkciju gn ome_ app_new Ova fu nkc ij a ka o a r gume n t u z i m a n a z iv aplika cije . GnomeApp
mehanizam d aje glavni
Za dodavanje ele menat3 k30 što su t oo lb a rovi , meniji i statusne Iinijc, jednostavno koristite odgovarajuće funkcij e . Na primer, za dodavanj!= menija, ko ri s tite gnome_app_set_menus , a za do d ava nj e statusne li n ij e kori�tit[' gnome_app_set_statusbar. Za d o d avanj e jednog toolbara koristite gnome_app_set_toolbar, a za d o dav anj e više toolbarova, koristite gnome_app_add_toolbar. U t ab e l i 9 . 7 s u n aved e n i svi GNOME mehanizm i .
·
Sa gnome_app_helper funkcijama možete automatski da generišete menije i toolbarove ko ri šće nj e m GnomcUlInfo struktura . Za to ol b a rove i menije ITložete' d a kreirate GnomeUIInfo strukture za njih sa odgovarajućim vrednostima, il
z a ti m
koristite
gnome_app_create_me nus
za
kr ei r anj e
menij a
gnome_app_create_toolbar z a kreiranje toolbarova . Tabela 9.7: GNOME
mehanizmi i objek1i
Mehanizmi i objekti
Opis
GnomeAbout GnomeAnimator GnomeApp
About okvir za aplikaciju Pros t a a n i macija za
GNOME aplikacije
G NOME kontejner n aj vi še g nivoa Mehanizam za S tatusnu liniju/Progres/Mini
GnomeAp p Ba r
bafer
Meha nizam kalku l a tora
GnomeCa1culator GnomeCanvas
Generička mašina za strukturalnu grafiku
G nome C a nva s l te m
GnomeCanvasLine
Mehanizam za kreiranje i upravljanje elemntima podloge F u nkc ije i strukture za spajanje elemenata podloge u grupu Linija na podlozi
GnomeCanvasPolygon
Podloga za poligon
GnomeCanvasRE GnomeCanvasRect
Podloga za pravougaone i osnovne elipsaste oblike ' Podloga za pravougaonik
GnomeCanvasEllipse
Podloga za elipsu
GnomeCanvasText . GnomeCanvaslmage
Podl.oga tekstualnog objekta Podloga slike Podloga m e hani z ma .. Ruti n a koja obezbeđuje podršku upra vlja nj a sesij om u Vašoj aplikaciji Mehanizam za biranje boja
Gnome CanvasGroup
GnomeCanvasWidget GnomeClient GnomeColorPicker
o
261
262
G U I programiranje
Gno me DataEd i t
Mehanizam za u n o s datuma i vremena
Gn o m e D En tryEdit
Editova nje obj ekta za "dentries" (desktop fajlovi)
Gn o me D i a log
Privremeni (is ka ču ć i) okviri za dij alog
Gn omeDockB and
M e ha niz am z a imp le m e nt a. ciju uporišnih ve z a (dock bands)
Gno me D ockIte m
Uporišni (Dockable) mehanizam
Gn ome D o ck
Mehanizam za podršku pokretnim mehanizmima
i onim koji se rast avlj aj u (koj i se u kl anj aju)
GnomeDruid
Glavni mehanizam za GNOME druid sisteme
GnomeDruidPage
Virtuelni mehani z a m z a definis a nje druid stranice
GnomeDruidPageStart
GnomeDruidPage za po činj anj e DRUID -a
GnomeDruidPageStandard Standard za G n om e D ru i dPa ge
završavanje D RUI D a za prać enje za n a ziv e fajlova
GnomeDruidPageFinish GnomeDruidPage za
-
GnomeEntry
Ulazni mehanizam
GnomeFileEntry
Ulazni mehan i z am
GnomeFontPicker
Dugme koje p ri k a zuj e t e ku ći fon t ; klikom se sclcktuje novi font
GnomeGu ru
Zastarelo; koristi se GnomeDruid
GnomeHRef
Link dugme
GnomelconEmry
Selektuje ikonicu
GnomeIconTextltclll
Element
podloge za
listama iko nica
menjanje nasl ovnog
teksta u
GnomelconList
Lista ikonica sa naslovima, sa opcionim editovanjem naslova
GnomeIconSelection
Prikaz liste/izbora ikonica
GnomeLess
Jednostavni mehan iz a m
GnomeMDIChild
!\pstrah ovanje klase d e teta u interfej su za vi š e
GnomeMDIGenericChild
Generičko GnomeMDI
GnomeMDJ
sad�žaja fajla
za pretraživanje
dokumenata ? ? ?
dete
GnomeNumbcrEntry
GNOME interfejs z a višestruke doku ment e Rutine za prikazivanje okvira za po ru ke Ulazna linija za unos brojeva
GnomePaperSelector
Selektor papira
GnomePixmapEntry
Selektuje veće slike Prikazuje i učitava slike (pixmap) Standardizovani okvir za dijalog za
GnomeMessageH ox
GnomePixmap GnomeProperty Box
upravlj anje
konfiguracijom
koji prikazuje n aj b olj e rezultate za toolbarove, menije i
GnomeScores
Okvir za dijalog
GnomeStock
Podrazu mevane ikonice
dugmad
GNOME
GtkDial
m eh an i z am časovnika koji može da real-time modu ili da broji naviše i naniže Analogni mehanizam za biranje brojeva
GtkPixmapMenultem
Spe cij a lni mehanizam za GNOME menije
GnomeDockLayout
Mehanizam za snimanj e i vraćanje izgleda GnomeDock mehanizma
GnomeProcBar
GNOME procesna linij a
Tekstualni
GtkClock
radi
II
Za proste ulaze menija možete da koristite razne makroe . Tabela 9 . 8 navodi GNOME makroe menija. Sa GNOMEUITNFO_ITEM
m
a kroom možete da dodaje!e stavke menija.
GNOMEUIINFO_SEPARATOR makro dodaje separator linije, a GNOMEUIIN FO_END makro određuje kraj m e n ij a U sledećem primeru, label je tekst lebele, .
tooltip je obj ašnjenje alatke koje se javlja kada se pokazivač pomeri na taj ele ment, a callback je funkcij a koj a se i zvr š ava kada korisnik klikne na taj element. Tabela
Makroi File menija
Opis
GNOMEUIINFO_MENU_ITEM (label, hint, cb,
data)
Stavka menija "New" (ovde mora te
za sebe obezbediti
i uputstvo) Stavka menija
labelu
GNOMEUIINFO _MENU_OPEN_ITEM (cb,
data)
"Open"
Slavka menija "Save" Stavka menija "Save As" GNOMEUIINFO_MENU_PIp:NT_ITEM (cb, data)
Stavka menij a "Print"
GNOMEUIINFO_MENU_CLOS E_ITEM (cb, data)
S tavka menija "Close"
GNOMEUIINFO_MENU_EXIT_ITEM (cb, data)
S tavka menija "Exit"
Makroi Edit
menija
GNOMEUIINFO_MENU_CUT_ITEM (cb, data)
S tavka menija "Cut"
GNOMEUIINFO_MENU_COPY_ITEM (cb, data)
S tavka menija "Copy"
GNOMEUIINFO_MENU_PASTE_ITEM (cb, data)
Stavka menija "Paste"
GNOMEUIINFO_MENU_SELECT_ALL_ITEM (cb, data) Stavka menija "Select All" GNOMEUIINFO_MENU_CLEAR_ITEM (cb, data)
Stavka menija "Clear"
GNOMEUIINFO_MENU_UNDO_ITEM(cb, data)
Stavka menija "Undo"
263
264
GUI
p rog ra m i ra n je
TCitfifd"t:S:t�"\\Ia",kroi 'rn��ilqi ' 'i�J� >J < :J':!,�'��'fj; ' . Makroi Edit menija
GNOMEUIINFO _M EN U REDO_ITEM (cb, data)
Stavka menij a "Redo"
GNOMEUIINFO_MENU]IND_ITEM (cb, data)
Stavka menija "Find"
GNOMEUIINFO MENU FIND AGAIN ITEM(cb, data)
Stavka menij a "Find Again"
_
•
7
-
-
-
Stavka menij a "Replace" GNOMEUIINFO_MENU]ROPERTIES_ITEM(cb, data)
Makroi
za
Stavka menija "Pro perties"
postavke menija
GNOMEUIINFO-MENU-PREFERENCES-ITEM(cb, data) Stavka menija "Preferences"
Makroi Windows menija GNOMEUIINFO-MENU-NEW-WINDOW-ITEM(cb,
data) Stavka
menij a "New window"
GNOMEUIINFOJvIENU_G..OSE_WINDOWJfEM(cb, data) Stavka
menij a
"Close window"
Makroi Help menija GNOMEUIINFO_MENU_ABOUT_ITEM (cb, data)
Stavka m enij a
"About"
Makroi menija Tree GNOMEUIINFO_M ENU]Il ,E TREE(tree)
"File" meni
GNOMEUIINFO_MENU_EDIT TREE(tree)
"Edit" meni
GNOMEUIINFO_MENU_VIEW_TREE (tree)
''View'' meni
GNOMEUIINFO_M ENU_S ETTINGS_TREE (tre e)
"Settings" meni
GNOMEUIINFO _MENU_FILES_TRF.F.(tree)
"Files" meni
GNOMEUIlNFO_MENU_WINDOWS_TREE (tree)
"Windows" meni
GNOMEUIINFO _MENU_HELP_TREE (tree)
"Help" meni
Opšti makroi menija GNOMEUIINFO_ITEM (label, tooltip, cb)
Dodaje stavku menija sa svoj o m
oznakom GNOMEUlINfO_SEPARATOR GNOMEUIINFO
END
Uba cuje Menu separatorsku liniju Specificira kraj menija
GNOM�
Možete da dodajete još jedan argument za sliku i k o nic e Clkn žel i t e ll;] 1;e iko n i ca p ri ka z uje pored stavke menija. To je obično .xprn sli ka t oo l t i p ,
GNOMEU I I N FO_I TEM ( l a b e l ,
callbac k )
Da biste o dred ili akceleratorski taster za pojedinačnu 1;tavku, 1;a1l10 postavite donj u crticu ispred slova u oznaci (label) za taster koji žclitc da kuristite . Akceleratorski taster je alternativni taster preko kojeg možete da pristupite stavki menij a . 'lo je obično taster ALT. U sledećem primeru, stavka HlPllija (Ir- da illln lnIwill Exit sa po dvučenim "x", što označava da može te za pristup ovoj stavki menija da koristite
kombinaciju tastera ALT-X. "
GNO M E U I I N F O_ I TEM ( E _x it " ,
" " E x i t t h e p ro g ram , O X ! tfu n e )
GNOMEUIINFO_ITEM makro generiše vrednosti koje s e koriste u srrukmri GnomeUIInfo. Ove vrednosti mogu da se dode lj uj u o vakvoj strukturi . U sledećem p r im e ru , kreirani meni sadrži ni z GnomeUIInfo struktura, a GnomeUlInfo makroi se koriste za d odeljivanje V[edrlosti SVil koj GnomeUIInfo strukturi u tom nizu. U ovom primeru je kreiran jednostavan File meni sa dva' ulaza, jeda n za Ope n , a drugi za Exit. Između nj ih će da se p rika zuj e linijski separator. G n omeU l l n f o f i le m e n u [ ] ; { _
G N O M E U I I N FO_ I TE M ( " _o p e n " ,
" Opl' n a d o c u m e n t " ,
openfUnC ) ,
GNOMEU I I N FO_S E PARATOR , GN O M E U I I N F O_ I T EM ( " E_x it " ,
" E xit
Lhe p r o g r am " ,
e x it f u n c ) ,
G NO M EU I I NFO END
};
Pos toje makroi koji služe za 'standardne stavke menija, kao što su ulazi Save u File m en ij u. Kao argumenti sc uzimaju funkcije koje se izvršavaju kada se stavka se l e ktuj e (cb) i s l i k a ikonice koj a će da se pr ik a zuje za t aj ulaz (data) . S le di sintaksa za ove makroe: i
Open
G N O ME U I I N F O_M E N U_OPE N_ I T E M ( cb ,
da ta )
Sledeći pri me r kreira prosti File meni kao u pre th od n om primeru, ali koristi specijalizovane makroe za kre iranj e svake stavke. Ovde je p rikaz a n GNOMEUI INFO_MENU_EXlT_ITEM makro koji kreira ulaz Exit u m e n ij u : GnomeU l l nfo file_menu [ ]
=
{
GNOM EU I I NFO_MENU_O P E N_ I TE M ( openfunc) , GNOM EU I INFO_SEPARATOR , GNOM E U I I NFO_MENU_EX I T_ I TE M ( ex itfunc), GNOME U I I NFO END
}; Za p o d me n ij e
menije
koj i
se dodaju Vašem meni baru
koristite makro
GNOMEUIINFO_SUBTREE (label, tree) , gde je tree niz GnorneUIInfo s tru ktu
ra koj e se koriste za taj podmeni.
265
266
G U I programiranje
U sledeće m primeru se ranije definisanom File menij u dodeljuj e Edit meni u
okviru meni bara. Ponovo se radi o GnomeUIInfo strukturama za koje makro generiše vrednosti. Primetite upotrebu crtica u labelama koje ukazuju na upotre bu tastera ALT za pristup meniju. Gnome U l l nf o m e n u b a r [ ]
{
=
GNOM E U I I N FO SUBTRE E ( " J I L E " , f i l e_me n u ) , _ GNOMEU I I N FO_SUBTR E E ( " _ED I T " , ed it_m e n u ) , GNOMEU I I N FO E N D };
Za pojedinačne menij e u meni baru koristite makroe stabla menija, prikazane u tabeli 9.8. Argument tree predst�vlja niz GnomeUIInfo struktura za taj meni. Na primer, File meniju može da se doda meni bar sa sledećim iskazom, gde je tree niz GnomeUIInfo struktura za File meni: GNOMEUI I N FO_MENU_ F I LE_TREE ( t ree )
Sledeći primer je prerađena verzija dodele meni ba ra korišćenjem specij ali zovanih makroa za File i Edit menije : GnomeUl l nf o
menuba r [ ]
=
{
GNOMEU I I N FO_MENU _ F I LE_T R E E ( f i l e_m e n u , N U L L ) , GNOME U I I N FO_MENU_E D I T_T R E E ( e d i t m e n u , N U L L ) , _ GNOM EUI I N FO E N D };
Kada definišete Vaše menije, možete da ih kreirate pomoću funkcije gnome_app_create_menus. Kao argumenti se ko r i s te strukture GNOME ap l ika c ij e i pokazivači na Gn om eUI I n fo strukture koje koristite za Vaš m e n i bar. U prethodnom primeru, ovaj pokazivač je b i o imc niza, menubar. Svakim elementom niza menubar se refen'l1cira GnomeUIInfo niz za taj meni.
· p�i�.��;;i�t �ii!· i �ji' m'"U� ·
. ..
• : ,, ; . . . .
Program koji se kreira u ovom projektu implementira GNOME aplikaciju sa dva menija i toolbarom. File i Edit meniji se implementiraju zajedno sa toolbarom na kom se nalazi Exit dugme, kao što je prik3zčlno na sledećoj ilustraciji.
�
--------�
GNOME
Kora k po kora k 1.
Definišite dve callback fu n kc ij e : copy_func i open_func. U ovom pro gramu bi trebalo da se njima prikazuje poruka; ali, u kompletnom programu, one i zvršavaju operacije nad fajlovima
2.
3.
4.
5.
7.
8.
Z a File
meni kre i rajte niz p od nazivom file_menu. Koristite GNOMEUIIFO makro
za
kreiranje stavki menija, koj e će da hudu elementi file_menu niza. D e fi n i š i t e Edit meni sa jednom stavkom za Copy. Za Edit meni kreirajte niz pod nazivom edit_manu. Koristite GNOMEUIIFO makro za kreiranje s t avke menija, koja će da bude element edit_menu niza .
Definišite meni bar sa dva menija, File i Edit. Napravite niz pod nazivom m enubar Koristite GNOMEUIINFO MENU FILE TREE makro za .
6.
i kopiranje.
Definišite File meni sa dve stavke, jednom z a Open, a drugom za exit.
-
-
-
dodavanje menija meni baru, koji postaju elementi niza menubar. Kreirajte toolba r sa j ednim d u g m eto m na zvan im E x i t.
U glavnoj fu nk c ij i kreirajte tri pokazivača n a mehanizme : app, label .
button i
D e fin išit e Application prozor sa fu nkc ij o m gnome_app_new i dodelite nj ego vu adresu p o ka z iva č u app. Ko ris ti t e funkciju gtk_signal_connect z a spajanje delete_event (klik na okvir za zatvaranje) na Application prozoru sa fu nkc ij o m gtk_main_quit za završavanje programa. Krei r aj te labelu s a fu nkc ijo m gtk_labetnew, i dodelite nj enu adresu pokazivaču labe l Postavite labelu na Appli ca tio n p ro z o r s a funkcijom .
9.
gnome_app_set_contents . Ko ris tite gnome_app_create_menus za postavlj anje meni b a r a i nj egovih
me n ij a
(menubar) na Application prozoru (app) .
1 0 . Koristite gnome_app_create_toolbar z a postavljanje toolbara Ctoolbar) na
Application prozoru (app) . 11. 1 2.
Ko ri s tite gtk_widget_show_all (app) za prikazivanje Appl i c a tio n prozora sa njegovim men ij im a i tO show ( ) j c o n n e c t ( b u t t on h i ,
but t o n E x it
=
S I GNAL ( c 1 1 c ked ( J ) , t h i S , SLOT ( myhello ( ) J ) ;
n ew Q P u s h B u t t o n ( ' E x it ' , t h is ) ;
buttonExit - >s etGeometry ( 1 05 , 30 , 50 , 25 ) ; b u t t o n E x it - >s how ( J j
con n ec t ( butto nExit , SIGNAL ( clicked ( » , t h i s , SLOT ( myexit ( » ) ) ;
void H e l l owin : : c l o s e E v e nt ( QClo s e E v e nt
*
)
k a p p - >q u it ( ) ;
v o id H e ll ow i n : : m y h e l l o ( )
KMs g Bo x : : me s sa g e ( 0 , ' I m p o r t a n t ' , ' He l lo Wo r l d ! ' J ;
void H e l l owin : : my e x i t ( ) close t J ;
} int ma in ( int a rgc , c h a r * * a rg v ) KAppl i c a t i o n myapp (
a rgc .
a rgv ,
' He l l o Wor l d l ' ) j
H e ll.ow i n m yw i n ; mywi n _ s e tGeomet rY ( 1 00 . 1 00 . 200 . 1 00 ) ;
m y a p D _ s e t M a i nWid g e t ( &mywi n J j
m yw 1 n _ s h ow ( ) j r e t u r n m ya pp _ e x e c ( J j
}
Meniji Za kreiranje menija kreirate KDE meni bar, a zatim dodajete Qt menije sa njihovim stavkama menija_ Moraćete da uključite qpopupmenu. h fajl zaglavlja za menije, a kmenubar. h fajl zaglavlja za meni bar, kao što je prikazano u sledećem primeru:
289
290
GUI
progra m i ra n ie
# i n c l u d e < q p o p u p m e n u . h> # i n c l u d e < k m e n u b a r . h>
Zatim definišete objekat meni bara, ili pokazivač na njega, a to radite i za menij e . Klasa za meni bar je KMenuBar, a klasa za meni je QPopupMenu. Sledeći pri m e r definiše meni ba r i meni : ,-------/KMe n u B a r * m y m e n u b a r ;
Definisanje pokazivača za KMenuBar tip objekta
QPo p u pM e n u * my f i l e me n u ;
Ako definišete pokazivače, možete da kreirate meni i meni bar objekte sa operacijom new, kao što je ovde prikazano . KMenuBar kao argument uzima svog rodi te lj a . Kada se defi niše klasa poput p ro z o ra , u kojoj želite da klasa bude roditelj sa moj sebi, koristite pokazivač this. mymenuba r myf ileme n u
ntw
=
KMenuBa r ( t h i s ) ;
new
�
QPo p u pM e n u ;
Kreiranje KMenuBar objekta i dodeljivanje njene adrese za mymenubar
da dodajete m e n i u meni bar sa funkcijom članicom meni bara argument je labela koju želite d a prikažete na meni baru za taj Sledeći prim e r dodaje me n i , a drugi argument je adresa o bj e k t a m e n ij a . myfilemenu II mymenubar: Zatim možete
insertItem . Prvi
Umetanje File menija u meni bar
�
m y m e n u h u r - > i n s e r t I t em ( " F ile " , myf i l e m e n u j ;
Zatim, za dodavanj e stavki u poj edinačne menije, možete da koristite funkc i ('lanicu objekta m en ij a insertitem. Kao prvi argument se navo d i labela koj u ju želite da prikažete za tu stavku, a s l ede ć a dva argumenta su refe re nce na s lot funkcij u k oja će da se izvršavaj u kad a stavka e mituje signal. (Ovo je isto kao i slot argumenti u funkciji co nn e ct.) D rugi a rgum e n t za insertItem je adresa obje k ta u kom se čuva slo t funkcija, a treći argument je slot funkcija koj a se izvršava u tom ohjpkm . Sledeći primer kreira Exit stavku u myfilemenu meniju i povezuje je sa myexit slot 'funkeijolTl u tekućem objektu (označena je sa pokazivačem this) :
� ..J
.
I.abela za stavku Exit u File meniju
m y f i1 e m ll n u :> i n 5 I1 r t I t e m ( " Ex it " , t h i s , S LOT ( my e x it ( ) ) ) ;
KDE
Statusna liniia i toolbar
KD E m eh an i za m statusne linije j e
KStatusBar.
Z a kreiranje statusne linije
kreirate KStatusBar objekat i dodeljujete nj e g ovu adresu pokazivaču kojeg želite da k o ri s ti t e za referenciranje tog obje kt a . KStatusBar kao argument uzima
adresu svog roditelja. U sledećem p rim eru , roditeljska klasa je klasa u kojem je d e fini s an, i poziva se specijalnim pokazivačem this ( ob i čno s e ko ris t i za p o d m e hanizme) : s t atus b a r = n ew
KSt atusBa r ( t h is ) j
Za p o s tavlj a nje teksta koj e g želite da inicij alno prikažete na s tatu s noj liniji, prvi a rgu m e nt se koristi tekst
koristite i nse rtIt e m metod klase KStatusBar. Kao
koj i želite da prikažete, a drugi argument je identifikator. na s t a tu s n oj linij i koristite fu n kcij u changeItem. s t a t u s ba r - > i n s e rt l t em ( ' My h e l lo p rog r am ' ,
Za promenu poruke
0) ;
s t a t u s ba r - > c h ang e l t em ( ' My New H e l l o P ro g ram ' ,
0) ;
Z a p rid ru živanje statusne linije objektu pro zora , koristite setStatusBar fun kcij a kao argumente uzima ad re su obj ekta statusne linije i identifikator. fu n kc ij u klase KTMainWindow. Ova
s e t S t a t u s B a r ( s t at u s b a r , 0 ) ; v
Zatim, za pri kazivanje statusne linije
koristite funkciju show.
s t at u s b a r - > s h ow ( ) ;
Za kreiranje toolbara, d e fi n iš e t e KToolBar objekat, dodeljujete njegovu adresu pokazivaču kojeg želite da koristite za referenciranje obj e kta . U ovo m primeru korisnik kreira toolbar obj ekat i dodeljuje njegovu adresu pokazivaču
mytoolbar: my t o ol b a r = new KToo I Ba r ( fh i s ) ;
Kod tool bara Vam je neophodno upravlj anj e ikonicama koje se koriste na njemu. Za učitavanje ikonica koristite KIconLoader objekat kojeg kreirate metodom getIconLoader, kao što je prikazano u sledećem primeru :
l
K l con Loade r * my oade r
=
m y a p p - >g e t l con Loade r( ) j
Objekat KIconLoader učitava i kešira ikonice toolbara pretraživanjem speci fičnog KDE direktorij uma sa ikonicama. Obavezno uključite kiconloader. h fajl zaglavlja. Za dodavanje dugmeta toolbaru koristite metod insertButton. Kao prvi argument se navodi ikonica koju ćete da koristite za to dugme. Za taj argument naj pre morate da učitate
ikoni cu pomoću metoda loadIcon za obj ekat KIconLoader. Ovaj metod za argument uzima naziv ikonice . Sledeći primer
učitava fajl za ikonicu Exit: ' ' loade r - > loadl con( f ilenew . x pm )
291
292
G U I p rog ra m i ra n j e
Drugi argument j e identifikator ikonice, a treći je fleg kqj i ukazuje n a to d a l i je dugme dostupno (enabled) , a poslednji je ToolTip tekst koj i se koristi kao obj ašnjenje name ne dugmeta. Sledeći primer dodaje dugme Exit u toolbar sa uputstvom "Exit program" : myt o o l ba r · > i n s e r t B u t t o n ( load e r · >load I c o n ( ' e xit . x pm ' ) ,
0,
TRUE ,
' E x i t P r o g r am ' ) ;
Ke risno je omog ućiti i nte rnaci ona l n u podršku uvlače n j a Too lTi p teksta u > tra nslate, kao u s l edećem primeru :
klocale
k l o c a l e · > t r a n s l a t e ( E x it P r og ram )
Za poveziva n j e i ko n i ce no toolbaru s a s l ot fu n kc i j o m o b j e kta koristite fu n kc i j u o d d C o n n ection too l b a r objekta . K a o prvi a r gum e n t se uzi m a i d e ntifi kato r ik o n i c e n a too l b o ru . Identifikator j e . broj koji se koristi k ao d ru g i o rg u ment u fu n k c i j i i n sertButto n kojom dodajete i konice na toolbar. Preosta l i a rg u m e nt i su s l i č n i o n i m a koji se novode zC! fu n kciju connect: signal, objekat u kom se n a l a zi slot fu n kcija i slot fu n kci j a . ' : myt o o l b a r . > addCon n e c t ion ( 0 ,
S I GNAL ( c licked (
) ) , t h is , SLOT ( m y e x i t ( ) ) )
;
Za svako d u gme koje želite da dodate se koristi operacija insertButton. Kada dodate dugmad, koristite addToolBar fu nkciju KTMainWindow objekta radi dodavanj a t oo l b a ra prozoru . Zatim koristite funkciju setBarPos t oolb ar objekta, kako oi' &e toolbar pozicionirao i metod show kako bi se prikazao. addTo o l B a r ( t o o l b a r ) ;
toolba r - >setBarPo s ( KTooIBa r :
: To p ) ;
t o o l b a r · > s h ow ( ) ;
J E D t.lO M I N U T N A •
•
VEZBA
Koja se funkcija koristi za kreiranje stavki menija? Šta je slot? •
•
insertItem.
Funkcija članica je objekat namenjen za
izvršavanje u slučaju da
objekat primi
Ovaj projekat ilustruje korišćenje složenih mehanizama. Program hellowin2. cpp kreira prozor sa toolbarom, me n ij e m i statusnom linijom . Toolbar ima dve ikonice, jednu za izlazak iz programa, a drugu za prikazivanje poruke "Hello World". Statusna linija prikazuje op is programa. Na meni baru se nal az i File meni sa ulazi ma za prikazivanje okvira za dijalog "Hello World" i za izlazak iz programa.
KDE
Korak po korak Kreirajte hellowin.h fajl
1.
zaglavlj a
u kom će da se nalaze definicija klase za
Hell owin klasu.
2.
J.
Uključite fajlove zaglavlja u kojima se nalaze definicije klasa za objekte, kao što su prozori, dugmad i okviri za poruke. U ovom sl u čaju uključujete fajl zaglavlja za glavni prozor, ktmainwindow.hj za dugme qpu.shbu.tton.h; i za okvir za p o ruk e kmsgbox.h. Definišite klasu Hellowin tako što čete da je izvedete iz klase KTMainWindow. Hellowin klasa bi trebalo da ima dva slota (funkcije) pod nazivom myhel10 i myexit. Definišite nekoliko pokazivača na KDE objekte, uključujući p ok azivače na dugm ad (buttonhi i buttonExit), pokazivač na meni bar (mymenubar), pokaziva č na meni (filemenu), p okazivač na toolbar (mytoolbar) i p o kazivač na statusnu liniju (mys ta tusbar). Klasa takođe mora da sadrži fu nkc iju konstruktora koja se (Hellowin) i funkciju koja će da završava pro
izvršava kada se definiše
gram (c1oseEvent). 4.
U hellowin.cpp fajlu će da se nalaze definicije funkcija za Hellowin klasu. Uključite faj lo ve zaglavlja i hellowin.moc fajl koji mora posebno da se
5.
Definišite funkciju konstruktora za Hellowin klasu, Hellowin::Hellowin.
6.
Kada se definiše objekat ove klase, ova funkcija se izvršava automatski. U funkciji konstruktoru kreirajte toolbar objekat korišćenjem klase
generiše sa MOC pretprocesorom.
KToolBar. Zatim kreirajte pixmap sliku koja če moči da se koristi za too1bar. Kreirajte objekat KIconLoader sa pokazivačem myloader u kom se p amti adresa objekta. Zatim koristite funkcij u lo�dicon u okviru obj ekt a za 7.
u čitavanje slike (stamp. xpm) u obj ekat QPixmap pod nazivom hellopic. Kreirajte d ug me u myt o ol bar toolbaru korišćenjem sta mp . xp m slike
8.
U funkciji addConnection objekta mytoolbar do delju jete klik miša
sadržane u hellopic. Tekst dugmeta bi trebal o da bude "Hello window". (cli cked) myhello slotu kJ.�se Hellowin i prvom dugmetu toolbara (stamp.xpm). 9.
Sledeća slika, nazvana exit.xpm, se zatim postavlja u exitpic QPixmap objekat. Ovu sliku koristite za kreiranje sledećeg dugmeta na toolbaru, označenog sa "Exit Program". Funkcijom addConnection kojoj je dodeljen signal c1icked i funkcija myexit se izlazi iz programa.
10. Pozicionirajte toolbar kao plivajući toolbar, i dodajte ga Hellowin objektu
sa funkcijom addToolBar. 1 1. Definišite statusnu liniju i dodelite njenu adresu pokazivaču
mystatu sbar.
Ubacite jednostavnu poruku: "My hello program". 12. Kreirajte objekat menija korišćenjem
Q PopupMenu, i dodelite njegovu
adresu pokazivaču filemenu. Ubacite dve stavke, jednu sa oznakom "}Iello", a drugu sa "Exit". Pos tavi te "H" tako da bude podvučeno u Hello stavki, a "x" u Exit stavki. 1 J. Kreirajte meni bar pod nazivom mymenubar. Ubacite objekat filemenu i
označite ga sa "FILE".
293
294
GUI programiranje
, 4. Definišite funkciju cioseEvent, koja poziva kapp->quit za završavanje pro
grama. , 5. Definišite funkciju myhel10 za Hellowin klasu, i postavite je za prikazivan
je posebnog okvira za poruke koji će da prikazuju poruku "Hello World". , 6. Definišite funkciju myexit za Hellowin klasu, i postavite je tako da se
njome zatvara Hellowin prozor. 17. Kreirajte fajl main. epp u kom će da se nalazi glavna funkcija programa.
Počnite ga sa uključivanjem fajlova zaglavlja i hellowin.moe fajla, kojeg je neophodno posebno da generišete MOC pretprocesorom. , 8. U glavnoj funkciji definišite KApplieation objekat pod nazivom myapp. Kreirajte Hellowin objekat nazvan mywin, pozivajući njegovu funkciju konstruktora Hellowin. Postavite veličinu objekta.
Koristite funkciju setMainWidget za myapp i napravite mywin glavni prozor aplikacije. 20. Postavite mywin.show za prikazivanje tog prozora. , 9.
objekat za
21. Koristite myapp.exec za pokretanje aplikacije. Sledi kod za hellowin2.h
fajl. Slika
10.3 prikazuje
prozor kojeg prikazuje ovaj
program, uključujući meni bar sa File menijem, toolbar
ma i statusnu
liniju.
,: � l .t _rI1 - m"rp!!!il llIdllhllll � EtlE,.
'
c: X
:'0
� {Di
My hOlI.prog'aM
Slika 10.3 KDE meni,
�
toolbar i statw;na linija
"Include . #include
#inolude cqpu6hbutton.h� �lnelude #include �klQQlbar.h> "inolude ckstatusbar.h� �inelude class Hellowin
:
public KTMainWindow
Q OBJECT public; Hellowin ( ) j
void closeEvent(QCloseEvent *);
'"
Hallo Worldl
sa
Exit i Hello dugmadi
KDE
public slots: void myhello () j void myexit();
pr ivate:
QPushButton *hellobuttonj QPushButton *exitbutton; KMenuBar *mymenubarj
QPopupMenu *filemenuj KToo lBar *mytoolbar; KStatusBar *mystatusbarj
}j Sledi
kod
za
hellowin2.cpp fajl.
j************* Hellowin.cpp #inc lude
���.*���III*******
I
'hell owin2.moc '
#in clud e < k ms gb o x. h> #include
#include
KTMainWindow( )
Hellowin::Hellowin()
{ mytoolbar
new KToolBar(this);
KlconLoader
* myl oader
QPixmap hel lop i c
=
=
kapp->getlconLoader()j
myloader->loadlcon \
('/opt/kde/share/toolbar/stamp.xpm',
0,
O);
mytoolbar->insertButton(hellopic,1, TRUE ,' H ell o w ind ow',
0)j
mytoolbar->addConnection(1� S IGNAL(cl ic k ed()) , thi s ,
S LOT (myh el l o() )) ;
QPixmap exitpic
O);
=
myl oade r- >l o ad l c on( 'e x it.x pm " ,
mytoolbar->in sertButton(exitpic,0, mytoolbar ->add C onn ec ti on(0,
0,
TRUE,"Exit Program",
S IGNAL(cl ick ed()) , thi s ,
my to ol b ar-> se tBarPo s ( KT o ol B ar: :Floating); addT ool B a r( myto ol b a r,
O);
myt oolb a r- >sh ow() ;
my stat us b ar
=
new KS tat us Bar( thi s) ;
mystatusbar->insertltem("My hello p rogra m' ,
O);
setStatusBa r (my sta tusb ar); my statu sb ar->show(); f i le men u = new QPopupMen u () ;
filemenu->insertltem('&Hello', f il eme n u-> in s ertl tem('E &xi t ',
this, this,
SLOT(myhello())); SLOT(myexit()));
O);
S LOT (myexit()) ) ;
29!i
296
GUI programiranje
mymenubar
=
new KMenuBa r(th i s ) ;
mymenubar-> i n s e rtItem('&FILE', filemenu ) ;
v o id Hellowin::close�v ent(QCloseEvent * )
{ kapp - >qu it ( ) ;
} v oid Hellow in::myhello( )
{ KMsgBox: :me s sage(0, 'Wo rld Me s s age', 'Hello World !' ) ;
} void Hellowin: :myexit()
{
close (
)
j
Konačno, sledi kod za main_c fajl. "�;-
#include #include "hellowin2.h"
#include
int main( int argc, char **argv )
{
KApplication mya15'P( Hellowin *mywin
=
argc, argv,
"Hello World!"
)i
new Hellowin();
mywin·>setGeometry(100,100,200,100) j myapp.setMainWidget( mywin ); mywin.>shOw() ;
myapp.exec(); return
0j
}
Za kompajliranje programa je najbolje da
se
koristi makefile, kao
što će da
bude prikazano.
Primetite način no mckefile.
koji j'l! kreiron MOC fejl
sc
ulazom
za
fajlove zaglavlja u okviru
KDE
main.o hellow i n2 . o hellowin2.moc
Hellowin2; g++
-
L $ KDEDIR / lib -lkdecore -lkdeui ·lqt ·0
hel lowin2 main.o hellowin2.o
hellowin2.o; hellowin2.cpp
g++ -c
- I/$ KD ED I R/ inc l ude .I/$QTDIR/include hellowin.cpp
main .o ; mai n . e p p
g++ ·c
·I/$KDEDIR/include .I/$QTDIR/inelude
main.epp
hellowin2.moc: hellowin2.h moc hellowln2.h
·0
hellowin2.mo�
Qt programiranie
KDE se trenutno oslanja direktno na Qt Toolkit. Korišćenjem Qt objekata možete ela kreirate interfejs koji izgleda i daje sličan utisak pri radu kao KDE. Možete da kreirate Qt apl ikaciju pomoću Qt objekata i Qt biblioteka. Ovaj odeljak Obl"l.hl'dujc osnovni uvod u Qt programiranje. I na sajtu koji se bavi KlJE razvojem, developer.kde.org i na Qt web sajtu na www.trol.com možete da dobijete detaljnu dokumentaciju i tuto rijale za Qt programiranje. Preporučuje se konsultovanje ovog materijala radi d etaljne pre zenta cij e Qt programiranja i AFI referenci.
Qt
aplikacije
Qt program je u s tvari C+ + program. Qt biblioteke obezbeđuju obiman skup defini c ij a Qt klasa sa kojima možete da definišete Qt objekte u Vašem Qt pro gra mu . Ove klase možete da koristite iza krei ranje svojih klasa, koj e će da naslede karakteristike roditeljskih klasa. Tabela 10-3 navodi najčeš će korišćene Qt mehanizme.
Mehanizam
Opis
QCheckBox
Polje za potvrdu za tekstualnom oznakom
QComboBox
KOp1binacija dugmeta i iskačuće liste
QFrame
Osnovna klasa mehanizama koji imaju okvire
QLabel
Labela koja prikazuje statički tekst na pixmap slici
QListBox
Lista sa read-only stavkama koje mogu da se selektuju
Q ListVi ew
Pregled liste/s tabla
Q MainWindow
Tipični prozor apli kacij e , sa m en i barom, nekim toolbarovima i statusnom linijom
QMenuBar
Horizontalni meni bar
QPopupMenu
Mehanizam podižućeg me nija
297
298
GUI programiranje
Mehanizam
Opis
QProgressBar QPushButton QRadioButton QScrollBar QSizeGrip
QTextView
Horizontalna linija progresa Dugme sa tekstom ili pixmap labelom Radio dugme sa tekstualnom oznakom Vertikalni ili horizon talni skrol bar Hvataljka u uglu pomoću koje se menja veličina najvišeg prozora Vertikalni ili horizontalni klizač Horizontalna linija fJrikladna za prikazivanje poruka statusa Teks tu alni pretr a živač za prostu n aviga c ij u Sofisticirani pregled teksta jed n e stranice
QToolbar
Jednostavni toolbar
QSlider QStatusBar QTextBrowser
Za kreiranje Qt aplikacije, morate da definišete QApplication objekat. Svaka plika cij a mora da ima barem jedan QApplication obj e kat . Ovaj objekat se koristi za upravljanje karakteristikama aplikacije kao što je font ili kurzor. Za uključivanje deklaracije klase QApp1ication u Vaš program , morate da uključite qapplication. h fajl. a
#include
Možete da izaberete uključivanje različitih o bj ekata u Vašu aplikaciju, kao što su prozori, dugm a d i men ij i . Za definisanje pojedinačnih o bjeka ta najpre dcfinišete njihove klase; zatim, kao što se tradicionalno deklarišu prom enljive , definišete objekte tih klasa. Posmatrano izvan C++ konteksta, klasa može da se posmatra kao tip, a objekat kao promenljiva tog tip a . Qt obezbeđuje b ro jn e definicije klasa, gde je sva ka smeštena u svom fajlu zaglavlja. Za deklaraciju klase morate samo da uključite njen fajl zaglavlja. Na primer, da bi se deklarisala klasa QPushButton (dugme), uklj učuj e te fajl
qpushbutton.1l.
#lnelude �qpushbutton.h>
Mehanizmi, kao što su dugmad, automats ki imp\cmentiraju podrazumevane sa kojima možete da održavate njihov izgled i utisak pri radu. Ove karakteristike mogu da se modifikuju p romen om aspekata kao što su boja ili karakteristike
prikazani tekst.
objekat mehanizma, takođe mora te da kao argumente koje želite da date objektu, i rod ite lja mehanizma. Ako se ne r adi
Kada definišete obezbedite ime
o delu meha nizma, možete da koristite NULL, 0, za označavanje da ne postoji roditelj. Argumenti se prenose lJ funkciju konstruktora koja se izvršava radi izvođenja odredenih operacija inicijalizacijf' mehanizma. Na primer, sledeća
KOE
definic ij a mehanizma dugm e ta mybutton će da prikazuje "Click Me" i ukazaće na nepostoj anje roditelja: QPushButton mybutton( 'ClicK Me', 0
l;
Qt program je u suštini C++ pro gram , tako da definišete svoje klase i bilo koje funkcij e članice, a zatim defini š e te glavnu funkc ij u sa kojom program startuje. 'lu postavlj ate definicij e Vašeg QApplication objekta. Ova definicijA mom rifi st' jflvi pre bilo koje definicije Qt mehanizma (objekta). Za definicije QApplication mehani zma morate da uključite argumente Cargc i argv) , koji imaju istI'
funkcionalnosti kao u o stalim C+ + pro gra mima . Ostali mehanizmi uzimaju
različite skupove argumenata.
Sledeći primer d e fini š e QApplication me han i z a m mehanizam dugmeta nazvan mybutton.
nazvan
myapp
i
r------,
,-________-+_ Definisanje Qt objekta aplikacije i Qt mehanizma dugmeta QApplication myapp( argc, argv l; QPushButton mybutton (
'Click
Me", 0 ) ;
�
Da bi se mehanizam postavio kao glavni mehanizam aplikacije koris tit e funkci ju čl anicu QApplication obj ekta , setMainWidget. Glavni mehanizam je onaj kojeg koristite za kontrolu zatvaranja aplikacij e . Kada zatvorite glavni mehanizam, zatvarate aplikaciju. Glavni mehanizam je obično glavni prozor aplikacije, tako da se aplikacija zatvara ako zatvorite glavni pro zo r. Argument ove funkcije je adresa mehanizma koju možete da dobijete pomoću operatora &. myapp.setMainWidget( &mybutton
);
Kada de fin išete mehanizme i izmenite sve karakteristike koj e želite da promenite , morate da odredite mehanizam koji će da sc prikazuje. To se radi fu nkcijom članicom show. Sledeći primer prika zuj e dugme mybutton: mybutton.show();
Kada završite sa konstruisanjem apl ikacij e i određivanjem mehanizama koji će da se prikazuju, možete da uključite kontro lu preko Qt za upravljanje i zvršenjem ap likacije sa funkcijom članicom exec za QApplication obj e kat . Ova funkcija pokreće apl ikacij u i prikazuje sve mehanizme. Qt će da upravlja događajima i pozi vaće odgovarajuće mehanizme koji su vezani za te događaje. Kada korisnik zatvori glavni mehanizam aplikacije, kontrola se vraća programu. Tada može da se završi program sa konačnim return iskazom u glavnoj funkciji . myapp.exec(l; return 0;
299
300
GUI
programiranie
Sledeći program ilustruje osnovnu strukturu Qt programa. #include
.
#include
int
main (
int argc, char **argv )
aApplication myapp( argc, argv )i QPushButton mybutton( mybutton.resize(
'Click Me',
0 );
100, 30 );
myapp.setMainWidget( &hello
);
mybutton.show(); return myapp.exec();
Qt signali islotovi
Tradicionalno, GUI kompleti alatki kori ste tip događaja koji aktivira funkcije povratnog poziva. Kada se događaj pojavi, izvršava se nj emu pridružena funkci
ja povratnog poziva. Qt zame nj uj e ovaj
pristup sa sistemom signala i slotova. Aktiviranje proc e sa događajem je rcforrnu1isano u pro ce s razmene poru ka između dva objekta. Kako oni dosta razmenjuju po ruke, signali i slotovi mogu da b udu veo ma glo mazni. Mogu da imaju različit broj argumenata različitog tipa, a mog u, da p ove zuj u različit b roj signala i slotova. S ignali i s l ot o vi mogu da se koriste u svim klasama koje su nas!eđem' iz QObject klase, kao što je QWidget. Obj e kat može da sad rž i i signale za slanj e poruka i s l o tove preko kojih se poruke primaju. Kada se Ild TTlehanizmu pojavi događaj, on emituje signal. To je sve što radi. On ne postavlja vezu sa drugim objektom. Da bi rnogao da primi poruku iz signala, objekat mora da ima postavljen slot. Slot je funkcija članica koja se jzvršava kada ohjekat primi signal. Konceptualno, slotovi se koriste za dobijanje informacija o promenama na drugim objektima Slot ne zna da li postoj e signali koji su povezani sa njim, d signal ne zna da li postoje slotovi koji će da ga prime. funkcija connect se kor i s t i za p os t avlj a nje veze između signala j e d nog obje kta i sint;] drugog ohjekta Možete da povež e te proizvoljan broj s i gnala sa jednim sImom, a možete d a povežete i je d an signal sa više slotova. Svaki objekat ima signale za slanje poruka i slotove preko kojih se poruke primaju. Funkcija connect postavlja ve zu između dv a objekta, signala iz jednog i slota drugog
objekta.
U slpdećem primC'ru sc s i gnal sIorom quit za objekat myapp:
dicked za objekat mybutton povezuje sa
OObject;;connect( &mybutton, SIGNAL(clicked()), &myapp, SLOT(quit(ll l; Kada se na objektu pojavi dogadaj, funkcija emit koristi funkciju signal za slanje poruke. Kada je emitovan signal iz objekta, svi slotovi koji su pove zani sa
KDE
njim
se au to matski
i zvrš avaju . Slotovi
razlikuj u samo po tome što
su
su proste funkcije članice u klasi koje se
povezane sa signalom. Slotove pravite kao
zaštićene, privatne ili javne (protected, private
ili public), i tako
se
odreduje
k oji o bjek ti mogu da imaju signale povezane sa njima. private signals: void my signal(); p rivate slots: void myslot1()j
void myslot2()j Termini signali i slotovi se u dcfinicijama klasa zamcnjuju kodom prihvatljivim C+ + kompajle r sa MaC pretproce sorom . Svi fajlovi sa izvornim kodom koji sadrže klase sa definicij ama signala i slotova moraj u da se najpre pretprocesiraju sa MOC pretprocesorom. Osim toga, sve klase sa slotovima i signalima moraj u da uključe termin Q_OBJECT u deklaraciju klase - ovo koristi MOC. MOC takođe generiše kod koj i inicijalizuje me ra- objekte . Meta-objekti sadrže i me na svih signala za
i
slotove članica, zajedno sa pokazivačima na ove funkcije.
Prozori Za kre i ranj e
pr o z ora apli ka cij e koristite klasu QMainWindow. Sledeći primer
kreira novi prozor ap li kacij e i dodelj uje OMainWindow
*
my w i n
njegovu adresu pokazivaču
mw;
= new OMainWindow;
QMainWindow mehanizam uključuje nekoliko funkcija članica za postavlj anje možete da postavite naslov prozora.
različitih karakteristika. Sa članicom setCaption mywin - >se tCaption( "My Document"
)j
Da bi se Vaša ap likacij a zatv9ri 1a kada zatvorite poslednji otvoreni prozor, povezujete signal mehanizma apl ikacij e lastWindowClosed sa njegovim slotom
quit, kao što je ovde prikazano. myapp.connect( &myapp, SIGNAL(lastWindowClosed()), &myapp,
Sledeći program prikazuje implementa ciju
SLOT(quit())
Qt prozora:
#include #include int main( int ar gc ,
char **argv)
QAppl i cation myapp( argc, argv); OMainWindow mywin; mywin. setCaption( "Document 1" ); myapp.c onnect( &myapp,
SIGNAL(lastWindowClosed()),
SLOT(quit ()) ); myapp.setMainWidget( &mywin );
&myapp,
);
301
302
GUI
programiranje
mywin.
show( l;
return myapp.exec(l;
Objekti roditelj-dete Qt interfejs se konstruiše kor išćenjem objekata koje postavljate' u hijerarhijsku strukturu, sa sporednim objektima koji zavise od glavnog objekta. Na primer, prozor
će
da bude gla vni objekat koji će da ima sporedne objekte kao što su
men ij i toolbarovi i klizači, a koji zavise od nj e ga ,
sporedni objekti su deca.
.
Glavni
objekat je roditelj, a
Kada kreirate glavni mehanizam kao što je prozor, Vi kreirate i s poredn i mehanizam toolbara koji zatim može da se pri dru ž i prozoru. To se postiže tako što se sp oredni mehanizam postavlja kao dete glavnog mehanizma Dete meha nizam može da ima i svoj u decu mehanizme. Prilikom konstrukcij e interfejsa Vi postavljate mehanizme u hijerarhijsku strukturu roditeljskih meh ani z a m a kao nj ih ovu de cu Za kre i ra nj e složenog meh a nizm a kao što je prozor sa njegovom decom, najpre definišete roditeljski mehanizam. Zatim, kada definišete mehanizam kojeg želite da postavite kao dete tom roditelj skom mehanizmu, postavljate adresu roditeljskog meh a niz ma kao argument u definiciji mehanizma d eteta Sledeći primer definiše mehani z am dugmeta nazvanog quit i čini ga detetom mehanizma prozora. Mehanizam prozora sada uključuje mehanizam dug m eta Primetite da se kor isti operator & za dobijanje adre se ro dite ljskog meh a nizma .
.
,
.
.
.
QPushButton mybutton(
"Quit"
,
&mywin l;
Kada prikazujete roditeljski mehanizam, automatski se prikazuju i svi mehani zmi postavljeni kao deca. U sledećem primeru, funkcij a članica show za me hanizam prozora takođe prikazuje i dugme mybutton: my�pp.$etMainWidQet( &mywin l; mywin. show() ;
Sledeći p rogra m prikazuje dva dugmeta kao decu prozora. slika 10.4 prikazuje prozor koje g daje program zajedno sa Click Me dugmetom
- mJ.lIIg!lUI:lM Click Me
Slika 10.4
Qt prozor i dugme
I.
.
D
X
.
KDE
#include #include #include #include int main(
int argc, char **argv l
QAPplication myapp( argc, QMainWindow *mywin
=
QPushButton mybutton(
argv l;
new QMainWindowj
"Click Me", mywin l;
mywin·>setCaption( " My Document"
l;
myapp.connect( &myapp, SIGNAL(lastWindowClosed(ll, SLOT(quit (
)l )
&myapp,
j
myapp.setMainWidget(mywinlj mybutton.setFont( QFont(
"Times",
14, QFont: :Bold
)
l;
mywin· >show( l j return myapp.exec(l;
Layout mehanizmi za razmeš taj) mol-ete lako da pozi postavljeni kao deca (kao što su d ugmad ih tekst) na roditeljskom meh ani zmu (kao što je prozor). Osim pozicioniranja, layout mehanizmi obezbeđuju podrazumevane ve lič ine promenu veličine i ažuriranje prikaza mehanizma. Postoji ne ko l iko raspoloživih mehanizama koji se lako upotrebaljavaju. QHBox pozicionira meh anizme u horizontalnoj vrsti, QVBox ih pozicioni ra u koloni, a QGrid u tatfeli. Za detaljniju ko ntrolu možete da koristite Sa layout mehanizmima (mehanizmima
cion i rate mehanizme
koji
su
,
QGridLayout, QHBoxLayout i QVBoxLayout.
JEDNOMINUTNA VEŽBA ..
..
Može li da se kreira korisnički interfejs samo pomoću Qt kompleta altki?
U kakvoj su vezi Qt mehanizmi koji se koriste u programima?
.. ..
Da H(ierarhijska veza roditelj-dete
303
304
GUI programiranje
Kreiranie sopstvenih
mehanizama Kreiranje sopstvenih mehanizama u stvari predstavlja de finisanje Qt-saglasnih klasa i kreiranje obj e ka ta tih klasa. Ove klase mo gu da s e izvode iz osnovne Qt klase, kao što je QWidget. Ovo izvođenje pravite tako što Qt postavljate kao osnovu nove klase. U sledećem primeru korisnik kreira klasu MyWidget, i z vode ći je iz klase QWidget. MyWidget nasle đuj e funkcije članice i p ro menlj i v e iz klase QWidget. class MyWidget : public QWidget
};
Možete da deklarišete bilo
je
i promenljive,
postavljaju
koje javne ili privatne čla n ice,
po sopstvenom i zbo ru
.
Definicij e funkcija
uključujući fu nkci član i c a se obično
posle definicije klase.
većine klasa sreću u konstruktoru. funkcija ima isto ime kao i klasa i automatski sc po ziva svaki put kada se definiše objekat te klase. Konstrukror možeTe da smatrate nekom vrstom funkci je za inicijalizaciju koj a vodi računa o svim inicijalnim postavkama koje želite da izvršite za novi objekat te klase. U sledećem primeru, funkcija konstruktora je Najuobičajenije funkcije članice se kod
Ova
deklarisana u MyWidget klasi. . class MyWidget
:
public QWidget
{ public � MyWidget( QWidget *parent=0, ennst char *name=0 ); };
u funkcijama konstruktora za Vaše Qt mehanizme morate da kao argument uključite adresu mehanizma koji će da bude roditelj. Podrazumeva se NULL, O. Ako je roditelj NUll, on automatski postaje najviši mehanizam, a ne dete nekog drugog mehanizma. Drugi argument je ime koje će da bude dodeljeno pojedinačnom mehanizmu te klase kada se \upira. Umesto pisanja koda za upravljanje roditelj om i imenom, prosto ih prenosite u QWidget konsmlktor koj i je nasleđen za Vašu klasu. Da biste rD izveli, postavljate argumente QWidget konstruktora u funkciju konstruktora Vaše klase, pridružujući ih iza argumenata funkcije. MyWioget; ;MyWidget( QW'dg�t 'parent, const char "name) : QWidget( parent, nam€ )
U funkciji konstruktora ćete da postavite definicije svih objekata koji će u Vašem mehanizmu da budu postavljeni kao deca. Na primer, ako kreirate meha nizam prozora, napisaćete funkciju konstruktora za njega, i II njoj ćete da defi nisete komponente kaO�TO su meniji, toolbarovi ili statusne linije, Možete da postavite karakteristike ovih ohjekma, kao što su veličina i boja, kao i da postavite sve signale i slotove koji Sl] Vam neophodni za njih.
KDE
Sledeći p ri me r prikazuje de fi n i c iju funkcije konstrukto ra za mywidget: MyWidget: : MyWidget( QWidget ·parent,
: QWidge t (
par�nt, nam e
const
char
·nam� l
l
{ QPushButton *quit
•
new QPushButton( "Quit", this,
quit.>setFont( QFon t(
connect(
"Times" j 18, QFont::Bold
"quit" l;
I l;
quit, SIGNAL(clicked()), qApp, SLOT(qUit()) );
Pretpostavimo da želite da konstruišete svoj prozor aplikacije sa menijima i toolbarovima koje ste projektovali. QMainWindow obezbeđuje samo ogoljeni pro zor. Za kreiranje prozora aplikacije sa Vašim menij ima, toolbarovima i ostalim mehanizmima, morate da definišete novu klasu prozora koja je na sleđena iz QMainWindow klase.
Vaša nova klasa prozora će da uključi članice QMainWindow sve nove klase koje definišete u njoj. Sledeći p r ime r kreira novu klasu prozora na zvanu MyAppWindow, zas n o
kao i
vanu na klasi QMainWindow: #include class QToolBar; class apopupMenuj class MyAppWindow:
public
QMainWindow
{ Q OBJECT p u b li c : MyAppWindow () j -
M yAppWindow (lj
protected: void closeEven t( QCloseEven t*
lj
private slots: void n ewfile() j void openfile()j private: QToolBar *mytoolbarj
QM enu Ba r *mymenubarj
}; Klasa MyAppWindow je zasnovana na QMainWindow i nasleđuje sve njene javne članice. Ova klasa uključuje konstruktor i destruktor za postavljanje i zatvaranje prozora. Takođe, ima toolbar i meni bar, deklarisane kao privatne članice. Ova definicija klase uključuje slotove koji će da se izvršavaju kada određeni objekti emituju signal. Na primer, kada korisnik selektuje stavku New na meniju ili klikne na dugme New na toolbaru, izvršava se funkcija (slot) newfile.
305
306
GUI programiranje
Oznaka "private slots:" nije C++ termin, pa mora da se pretprocesira sa MOC pretprocesarom kako bi se generisao C+ + čitljiv kod. Da bi se naznačilo da se u kla s i nalaze MOC termini, u definiciji klase se postavlja termin Q_OBJECT.
Možda ćete u glavnom mehanizmu aplikacije morati da pozivate akcije. Na primer, ako je glavni mehanizam Vaše aplikacije prozor, možda ćete hteti da imate mogućnost zatvaranja aplikacije klikom na Quit dugme na toolbaru prozora. Da biste to izveli, morate da povežete Quit dugme toolbara sa quit funkcijom aplikaci je. Ovo zahteva povezivanje clicked signala dugm eta sa quit slotom aplikacije. Međutim, mehanizam prozora zna ime mehanizma aplikacije. Da bi se rešio ovaj problem, Qt kreira specijalni pokazivač qApp koji poziva prograrnov mehanizam aplikacije. Mehanizam prozora će da koristi qApp za pozivanje mehanizma aplikaci
je i njegove funkcije quit. U sledećem primeru
se
fu nkci jom
connect povezuje
signal clicked Quit
dugmeta na toolbaru prozora sa quit fu n kcijom (slotom) aplikacije.
klikne na dugme Qu it connect(quit,
Okviri za
na toolbaru
Kada korisnik
prozora, zatvara se cela aplikacija.
SIGNAL(clicked()),
qApp, SLOT(quit()) );
dijalog
Za kreiranje prostog okvira za dijalog, m ožete da koristite QMessageBox meha nizam. Zatim, možete da gcncnšete okvire za dijalog sa različitim karakteristikama pomoću QMessageBox funkcija članica (metoda). Na primer, ako želite samo da prikažete poruku, bez primanja povratnih inforamacija od korisnika, možete da koristite about funkciju QMessageBox mehanizma Kao sv oje argumente ona prosto uzima roditeljski objekat, naslovnu poru ku i poruku Možete da koristite sekvence prelaska u novu liniju Itabulatore: \n i \t. .
.
QMessageBox::about( thjs,
"Qt Message box example",
"This example demonstrates simple
use
of
"The message bOX.");
Za okvire za dijalog u kojima želite da korisniku date mogućnost izbora jednog ili više dugmndi, korisl ite funkcij u information za QMessageBox objekat. Ona ima nekoliko argumenata: roditeljski objekat, naslov, tekst poruke i du gm ad knju želilc da pril