138
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA Zoran Kalafatić SKRIPTNI JEZICI Materijali za predavanja Zagreb, 2012

Skriptni jezici

  • Upload
    kaykoa

  • View
    66

  • Download
    10

Embed Size (px)

DESCRIPTION

Skriptni jezici

Citation preview

  • SVEUILITE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RAUNARSTVA

    Zoran Kalafati

    SKRIPTNI JEZICIMaterijali za predavanja

    Zagreb, 2012

  • Sadraj

    1 Uvod 11.1 Primjena skriptnih jezika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Ciljevi predmeta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3 Osobine skriptnih jezika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4 Klasifikacija programskih jezika . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2 Ljuska operacijskog sustava 72.1 Ljuska bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2 Datoteke i kazala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2.2.1 Operacije nad datotekama . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.2 Ureivanje datoteka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2.3 Preusmjeravanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.3 Varijable ljuske . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3.1 Varijable okoline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    2.4 Koraci obrade naredbenog retka . . . . . . . . . . . . . . . . . . . . . . . . . . 122.4.1 Navodnici i uloga u tumaenju naredbi . . . . . . . . . . . . . . . . . . 122.4.2 irenja u naredbenom retku . . . . . . . . . . . . . . . . . . . . . . . . 13

    2.5 Sloeniji Unix alati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.5.1 Brojanje rijei, znakova i redaka . . . . . . . . . . . . . . . . . . . . . . 162.5.2 Pretraivanje tekstnih datoteka . . . . . . . . . . . . . . . . . . . . . . 172.5.3 Regularni izrazi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.5.4 Sortiranje teksta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.5.5 Pronalaenje ponovljenih redaka . . . . . . . . . . . . . . . . . . . . . 202.5.6 Manipulacija tekstom . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5.7 Traenje datoteka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    2.6 Pisanje i pokretanje skripti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.6.1 Argumenti naredbenog retka . . . . . . . . . . . . . . . . . . . . . . . 242.6.2 Ispitivanje uvjeta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.6.3 Izlazak iz skripte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.6.4 Naredba case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.6.5 Programske petlje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.6.6 Preusmjeravanje u petlji . . . . . . . . . . . . . . . . . . . . . . . . . . 322.6.7 Uitavanje i ispis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    3 Programski jezik Perl 353.1 Pisanje i pokretanje Perl programa . . . . . . . . . . . . . . . . . . . . . . . . . 353.2 Skalarni podaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    3.2.1 Brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.2.2 Znakovni nizovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.2.3 Automatska pretvorba izmeu brojeva i nizova . . . . . . . . . . . . . 38

    i

  • ii SADRAJ

    3.2.4 Skalarne varijable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.2.5 Operatori i redoslijed primjene . . . . . . . . . . . . . . . . . . . . . . 403.2.6 Operatori usporedbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.7 Ispitivanje uvjeta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.2.8 Uitavanje podataka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.2.9 Petlja while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.2.10 Nedefinirana vrijednost . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    3.3 Liste i polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.3.1 Pridruivanje vrijednosti listi . . . . . . . . . . . . . . . . . . . . . . . 453.3.2 Referenciranje polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.3.3 Interpolacija polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.3.4 Petlja foreach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.3.5 Izmjena redoslijeda elemenata liste . . . . . . . . . . . . . . . . . . . . 483.3.6 Skalari i liste ovisno o kontekstu . . . . . . . . . . . . . . . . . . . . . 49

    3.4 Potprogrami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.4.1 Argumenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    3.5 Uitavanje pomou operatora . . . . . . . . . . . . . . . . . . . . . . . . . . 543.6 Ispis na standardni izlaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.7 Datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    3.7.1 Otvaranje datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573.7.2 Koritenje datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    3.8 Asocijativna polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593.8.1 Pristup elementima asocijativnog polja . . . . . . . . . . . . . . . . . . 593.8.2 Asocijativno polje kao cjelina . . . . . . . . . . . . . . . . . . . . . . . 603.8.3 Operacije s asocijativnim poljima . . . . . . . . . . . . . . . . . . . . . 60

    3.9 Regularni izrazi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.9.1 Operacije s regularnim izrazima . . . . . . . . . . . . . . . . . . . . . . 633.9.2 Operator povezivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.9.3 Interpolacija u regularnim izrazima . . . . . . . . . . . . . . . . . . . . 653.9.4 Varijable podudaranja . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.9.5 Povezivanje unazad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    3.10 Perl programi u naredbenom retku . . . . . . . . . . . . . . . . . . . . . . . . . 67

    4 Python 694.1 Izvoenje programa u Pythonu . . . . . . . . . . . . . . . . . . . . . . . . . . . 694.2 Moduli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.3 Ugraeni tipovi podataka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    4.3.1 Brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734.3.2 Dinamiko upravljanje tipovima . . . . . . . . . . . . . . . . . . . . . 784.3.3 Znakovni nizovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804.3.4 Nizovi binarnih znakova . . . . . . . . . . . . . . . . . . . . . . . . . . 904.3.5 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914.3.6 Rjenici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974.3.7 n-torke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024.3.8 Skupovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034.3.9 Datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

    4.4 Usporedbe objekata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104.5 Naredbe u Pythonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104.6 Funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    4.6.1 Definiranje i pozivanje funkcija . . . . . . . . . . . . . . . . . . . . . . 117

  • SADRAJ iii

    4.6.2 Prenoenje argumenata u funkcije . . . . . . . . . . . . . . . . . . . . 1214.6.3 Bezimene funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    4.7 Jo malo o modulima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1254.7.1 Moduli i prostori imena . . . . . . . . . . . . . . . . . . . . . . . . . . 1254.7.2 Skrivanje podataka u modulu . . . . . . . . . . . . . . . . . . . . . . . 127

    4.8 Razredi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1284.8.1 Stvaranje razreda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1284.8.2 Stvaranje primjerka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294.8.3 Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294.8.4 Nasljeivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

  • iv SADRAJ

  • 1. UvodOvi materijali su prireeni za kolegij Skriptni jezici, koji se nudi kao izborni predmet na ne-koliko modula preddiplomskog studija na Fakultetu elektrotehnike i raunarstva Sveuilita uZagrebu. Preduvjet mu je predmet Programiranje i programsko inenjerstvo, pa ste se zasi-gurno ve susreli s nekom programskim jezicima, kao i s postupcima oblikovanja i prevoenjaprograma.

    Tema ovog kolegija su jezici koji ne zahtijevaju eksplicitan korak prevoenja programa,to ubrzava ciklus razvoja programa. Radi se o interpretiranim jezicima, a kako se takvi jezicinajee koriste za pisanje relativno kratkih programa visoke razine (skripti), nazivaju se iskriptnim jezicima. Pisanje programa visoke razine znai da se programer udaljava od detaljaizvedbe programa na ciljnoj platformi, odnosno koristi gotove komponente koje se brinu otim detaljima. Naravno, to se u nekoj mjeri plaa performansom, no u veini primjena to nijepresudno. Stoga su skriptni jezici zauzeli vrsto mjesto u paleti programskih jezika.

    Danas se koristi mnotvo razliitih jezika ove kategorije (JavaScript, VB Script, Ruby,Lua,...), no mi smo se za potrebe ovog kolegija odluili za tri karakteristina predstavnika:ljuska operacijskog sustava bash, Perl i Python.

    1.1 Primjena skriptnih jezikaDa bismo ilustrirali neke primjene skriptnih jezika, posluit emo se s nekoliko jednostavnihprimjera. Oni pokazuju kako se neke tipine operacije s kojima se zacijelo susreete u radu naraunalo mogu uinkovitije obaviti pisanjem jednostavnih skripti.Primjer 1

    Kao prvi primjer, zamislimo da elimo preimenovati poveu skupinu datoteka koje imajukarakteristian oblik imena, primjerice fotografije s ljetovanja. Recimo da je u imenu datotekes fotografijom zapisan datum snimanja, te redni broj fotografije, u obliku:DSC_YYYY-MM-DD_NNNN.JPG.Pretpostavimo da elimo preimenovati fotografije iz srpnja i kolovoza 2011. godine, uz elimi-niranje datuma, u oblik: Ljeto_YYYY_NNNN.JPG.

    Prvo rjeenje koje nam vjerojatno pada na pamet je koritenjem grafikog korisnikog sus-tava (GUI) na koji smo navikli. Meutim, to bi znailo oznaavanje svake pojedine datoteke(desni klik mia) i aktiviranje akcije Rename. ini se da je to rjeenje vrlo neprikladno jer zah-tijeva ogromnu koliinu interakcije uz stalno ponavljanje jednostavnih mehanikih operacija.

    Alternativa bi bila koritenje nekog programa za obradu fotografija koji nudi mogunostgrupnog preimenovanja datoteka (engl. batch rename). Meutim, ako i nemamo na raspola-ganju takav program, moemo se posluiti ljuskom operacijskog sustava koji koristimo. Onaomoguuje unoenje naredbi u obliku teksta u naredbenom retku, te zapisivanje takvih na-redbi u datoteku pisanje skripti. Primjerice, ako koristimo operacijski sustav Unix ili Linux,za preimenovanje datoteka primijenit emo naredbu mv. U najjednostavnijem obliku, naredbise zadaju izvorno i eljeno ime datoteke:

    $ mv DSC_2011 -07-22 _1234.JPG Ljeto_2011_1234.JPG

    1

  • 2 POGLAVLJE 1. UVOD

    Sada bismo to isto mogli napraviti za svaku od datoteka, uz odgovarajuu prilagodbuimena, no oito bi to bio zamoran posao. No, moemo se posluiti programskim mogunos-tima ljuske, tako da napiemo petlju u kojoj e se pozivati naredba mv za svaku od datotekakoje zadovoljavaju na kriterij.

    #!/bin/bash

    # preimenovati DSC_YYYY -MM -DD_NNNN.JPG# u Ljeto_YYYY_NNNN.jpg

    for ime1 in DSC_2011 -07-*.JPG DSC_2011 -08-*.JPG; dopom=${ime1 /-??-??/} # brisem nepotrebni dio

    ime2=${pom/DSC/Ljeto} # zamjenjujem prefiksmv $ime1 $ime2done

    Za sada nemoramo ulaziti u detalje skripte, njih emo upoznati kasnije. No, moemo uoitida se koristi petlja for koja prolazi kroz listu datoteka u tekuem kazalu ije ime sugerira dase radi o fotografijama snimljenima tijekom srpnja i kolovoza 2011. Nakon toga koriste senaredbe koje isijecaju informacije koje elimo zadrati, te kombiniraju novo ime. Konano,obavlja se preimenovanje svake od datoteka. Na ovaj nain je vrlo lako obaviti i relativnosloeno preimenovanje datoteka, neovisno o tome koliko ih je.Primjer 2

    Pretpostavimo da elimo prirediti web stranicu s popisom diplomskih radova, u nekomzadanom formatu. Pritom su podaci o tim radovima zapisani u excel tablici. Za potrebe ovogprimjera to mogu jednostavno biti prezime i ime studenta, naslov rada, te godina obrane.

    Prvo rjeenje koje nam pada na pamet bi bilo kopirati podatke u program za obradu teksta(npr. MS Word), a zatim ureivati polje po polje teksta. Na kraju tekst moemo pohraniti udatoteku u html obliku. Ako lista diplomskih radova nije dugaka, taj posao nije prezahtje-van. No, postavlja se pitanje hoemo li taj posao morati ponoviti ako se odluimo za izmjenuformata pojedinih polja.

    Drugo rjeenje je slino, s tim da podatke umjesto u programu za obradu teksta ureujemou jednostavnom editoru, izravno u html obliku.

    No, rjeenje koje bismo zasigurno odabrali ako poznajemo neki od skriptnih jezika je mo-gunost automatiziranog generiranja dokumenata. Jezik koji je za to naroito pogodan (s tak-vom je namjenom izvorno i oblikovan) je Perl. U toj varijanti bismo podatke iz tablice ekspor-tirali u nekom od tekstnih formata, od kojih je najuobiajeniji CSV (Comma-Separated Values).Na takvu bismo datoteku primijenili skriptu u Perlu, koja e uitavati redak po redak datoteke,izrezivati polja s podacima i generirati odgovarajue zapise u html formatu.

    #!/usr/bin/perl -w

    # diplomski u html ...# Ime Prezime , Naslov , godina ...

    print " \n";while (){

    if(/(.*) , (.*), (.*), ([0 -9]{4})/){print " $2 $1, $3 , $4 \n";}}

    print " \n";

  • 1.2. CILJEVI PREDMETA 3

    Ni ovdje se neemo zamarati detaljima iz skripte, Perl emo upoznati kad za to doe vri-jeme, pa e ovi kriptini konstrukti postati jasnima.Primjer 3

    Kao jo jednu ilustraciju problema koje je prikladno rjeavati skriptnim jezicima pretposta-vimo da bismo eljeli pristupati nekim web stranicama i prikupljati podatke. Primjerice, moglibismo poeljeti prikupiti linkove na slike koje se pojavljuju na analiziranoj web stranici, a kojisu obino oblika: .

    Ne ulazei u razmatranje kako bismo to mogli napraviti runo, odmah emo predloitiskriptu napisanu u jeziku Python. Vidjet emo da nam Python nudi jednostavne mehanizmeza pristup i analizu web stranica.

    # Python 3.ximport re, sysfrom urllib.request import urlopen

    # adresu stranice prenosimo kao argument skripteadr = sys.argv [1]. rstrip ()

    page = urlopen(adr).read (). decode('utf8')

    # naimo slikeslike=re.findall('

  • 4 POGLAVLJE 1. UVOD

    u tome im pomau programeri koji moraju oblikovati uinkovita rjeenja. Ti su podaci obinou obliku teksta, a vaan element obrade je pronalaenje zadanih uzoraka teksta, te njihovaanaliza ili pretvaranje u oblik prikladan za daljnju obradu. Stoga emo se upoznati s osnovnimkonceptima i alatima za obradu teksta u skriptnim jezicima, primjerice s primjenom regularnihizraza.

    Upravo u podruju automatizirane obrade teksta, vrlo rairen alat je programski jezik Perl(Practical Extraction and Report Language), pa emo s upoznati i s njegovim osnovama. Nje-gova rairenost se posebno poveala s razvojem Interneta, jer je vrlo prikladan za generiranjeHTML dokumenata i oblikovanje dinamikih web stranica. Perl je jezik specifine sintakse,koji nudi brojne pokrate kojima se esti programski konstrukti mogu saeto zapisati. No, toistovremeno programe ini manje itljivima, posebno za programere koji mu nisu vini. I ovdjenam je cilj osposobiti se za pisanje jednostavnijih skripti, te moi proitati (jednostavniji) tuikd. Ograniavamo se na jednostavnije programe, jer Perl omoguuje pisanje sasvim funk-cionalnih programa koje ni sam autor nakon nekoliko dana nee razumjeti. Naravno, nastojatemo ne pisati takve programe, ve se drati pravila preglednog i itljivog programiranja.

    Konano, trea cjelina obrauje Python, koji je jedan od najpopularnijih programskih jezikadananjice. Radi se o jeziku koji omoguava brzo i izraajno pisanje kratkih skripti, ime lakomoe posluiti i kao zamjena za ljusku operacijskog sustava ili Perl, no istovremeno se radi osnanomobjektno orijentiranom jeziku koji omoguuje oblikovanje najsloenijih programskihprodukata.

    Python je zanimljiv i zbog svoje jasne i izraajne sintakse, koja je razliita od C-a (odnosnonjemu slinih jezika C++, Java, C#, Perl itd.). Stoga je za iskusnog programera u nekom odtakvih jezika ispoetka malo neobian, no izuzetno se lako i brzo ui jer je vrlo dosljedan.Uz to, specifinost sintakse je i to to tjera programera na urednost i pregledno pisanje koda,ime su programi pisani u Pythonu inherentno itljivi. Zbog tih svojih svojstava, Python se sveee preporuuje kao prvi programski jezik. Takoer, u mnogim kolegijima i udbenicima svese ee, na mjestima gdje se prije obino koristio pseudokd, pojavljuju programski primjeripisani u Pythonu.

    1.3 Osobine skriptnih jezikaSkripta je program vrlo visoke razine, najee vrlo kratak, napisan u skriptnom jeziku. Visokarazina programiranja podrazumijeva da se u programer ne bavi detaljima bliskim arhitekturiraunala na kojoj se program izvodi. Vana osobina skriptnih jezika je da se ne prevode prijeizvoenja (barem ne eksplicitno), odnosno da se interpretiraju. Neke primjere skriptnih jezikasmo ve spomenuli, a tu ubrajamo ljuske operacijskih sustava, Tcl, Perl, Python, Ruby, Lua,Scheme, Rexx, JavaScript, VBScript i mnoge druge.

    Skriptni jezici tipino se koriste za povezivanje vie samostalnih programa u cjelinu lijep-ljenjem (engl. glue language). Obino imaju ugraenu podrku za intenzivnu obradu teksta, anajee se koriste za pisanje programa usmjerenih specifinim potrebama korisnika. Tipinose ne radi o sloenim programima, to povlai relativno jednostavan razvoj.

    esto se skriptni jezici usporeuju s tzv. sustavskim jezicima, u koje se ubrajaju C/C++,Java i slini, a koji omoguavaju upravljanje resursima bliskima arhitekturi raunala na ko-jemu se program izvodi. Prednost skriptnih jezika se prije svega odnosi na tipinu kratkoui saetost programa, zbog ega je razvoj bri i s manje mogunosti pogreke. S obzirom da jeizostavljen eksplicitan korak prevoenja i povezivanja programa, ciklus provjere programa jekrai (naprosto se izmjene sporne naredbe i ponovno pokrene program). U skriptnim jezicimatipino nema deklaracije varijabli, odnosno one se uvode u program kada nam zatrebaju. To jeosobina koja olakava programiranje, no na taj nain su izbjegnute provjere koje tipino obav-lja program za prevoenje, pa je odgovarajue provjere potrebno provoditi tijekom izvoenja

  • 1.4. KLASIFIKACIJA PROGRAMSKIH JEZIKA 5

    programa.Naravno, ove prednosti ne znae da nam vie ne trebaju sustavski jezici. Svaka od ovih

    kategorija jezika ima svoje podruje primjene. Skriptni jezici ciljaju na im bru i jednostavnijuizgradnju programa, pri emu se koriste bogate biblioteke gotovih komponenti koje se povezujuu cjelinu (komponentno programiranje). S druge strane, sustavski jezici nastoje osigurati imveu uinkovitost konanog kda. Stoga nude mogunost upravljanja svim detaljima izvedbe.Oni su prikladni za izradu komponenti koje e se zatim povezati u skriptnom jeziku, pogotovoza raunski zahtjevne dijelove funkcionalnosti.

    Ovakav pristup programiranju moemo ilustrirati jednim primjerom. Recimo da elimonapisati program koji uitava niz slika neke video snimke i postupcima raunalnog vida pro-nalazi i prati objekte. Budui da su postupci raunalnog vida raunski intenzivni, a vano jeda obrada pojedine slike bude brza (za tipini video pojavljuje se 25 slika u sekundi, to znaida bismo za rad u stvarnom vremenu svaku sliku trebali obraditi u 40 ms). Stoga emo kompo-nentu za analizu slike napisati u programskom jeziku C. Pritom program moe slike uitavatisa standardnog ulaza, na koji se pak moe preusmjeriti sadraj niza slikovnih datoteka ili pakslike dobivene s digitalizatora slike. Rezultat (slika s oznaenim objektom) moe se zapisati nastandardni izlaz, koji se po potrebi moe preusmjeriti u datoteku ili u program za prikaz slike.Kako bismo olakali pokretanje programa, moemo napisati kratku skriptu:cat slika*.ras | prati_objekt | displaykoju moemo pozivati s:$ ./pokreni_pracenje

    Za pristupanje digitalizatoru slikemoemo takoer napisati program (u C-u). Program e izdigitalizatora slike preuzimati sliku po sliku, te e ih u odgovarajuem formatu prosljeivati nastandardni izlaz. Nakon toga je, koritenjem ljuske operacijskog sustava, jednostavno ulanatiprogram za digitalizaciju s ulazom programa za praenje objekata:grab | prati_objekt | display

    U ovom pristupu, moemo napisati i dodatne komponente za obradu slike, kao programeu C-u. Primjerice, moemo napisati komponentu za glaenje slike Gaussovim filtrom zadanogparametra , koja sa standardnog ulaza ita sliku, a glaenu sliku zapisuje na standardni izlaz:grab | gladixy -s 1.5 | prati_objekt | display

    Ako se pojavi potreba za demonstracijom programa, lako je pripremiti skriptu koja uitavanekoliko karakteristinih sekvenci iz datoteka, i pokree program za praenje s odgovarajuimparametrima, te ispisuje na ekranu odgovarajue poruke. Takoer, moemo dodati i grafikokorisniko suelje, koje moemo jednostavno oblikovati u Pythonu.

    1.4 Klasifikacija programskih jezikaDo sada smo ve spomenuli podjelu programskih jezika na skriptne i sustavske jezike. Takoersmo spomenuli prevoene i interpretirane jezike. Razredba se moe temeljiti na razliitimkriterijima, pa je se esto u obzir uzima upravljanje tipovima podataka. Razlikujemo jezike sastatikim (engl. statically typed) i dinamikim (engl. dynamically typed) dodjeljivanjem tipova.

    Kod dinamiki tipiziranih jezika, kojima tipino pripadaju skriptni jezici, dodjeljivanje tipavarijablama zbiva se tijekom izvravanja programa. Stoga varijabla moe u razliitim dijelo-vima programa sadravati objekte razliitih tipova. Primjerice u sljedeem fragmentu pro-grama u Pythonu, varijabla c u jednom trenutku pokazuje na cijeli broj, dok joj je u sljedeojnaredbi dodijeljena lista.

    c = 1 # c je integerc = [1,2,3] # c je lista

  • 6 POGLAVLJE 1. UVOD

    U statiki tipiziranim jezicima to nije mogue. Tip varijable odreuje se pri prevoenjuprograma i samim time ne moe se mijenjati. Stoga e sljedei programski odsjeak u C-uizazvati pogreku pri prevoenju.

    double c; c = 5.2; /* c prima samo double */c = "a string ..."; /* compiler error */

    Sljedea podjela je na slabo (engl. weakly typed) i strogo (engl. strongly typed) tipiziranejezike. Ta razlika se odnosi na mogunost mijeanja tipova u izrazima i njihovu implicitnupretvorbu, a manifestira se i kod razliitih skriptnih jezika. Primjerice, Perl je slabo tipiziran,pa se mijeanje tipova dozvoljava:

    $b = '1.2'$c = 5*$b; # implicitna pretvorba tipova:

    # '1.2' -> 1.2

    U gornjem primjeru, znakovni niz '1.2' pojavljuje se na mjestu na kojem se oekuje broj. Perlobavlja odgovarajuu pretvorbu i izraunava izraz. Nasuprot tome, Python je strogo tipizirani ne dozvoljava ovakve zamjene. Slian programski fragment e u Pythonu izazvati drugaijirezultat:

    b = '1.2'c = 5*b # nema implicitne pretvorbe tipova

    # rezultat je ponavljanje niza# '1.21.21.21.21.2 '

    Zapravo, u ovom primjeru se radi o polimorfizmu operatora mnoenja, koji kod Pythonau sluaju da su oba operanda brojevi doista obavlja mnoenje, dok za kombinaciju znakovnogniza i broja obavlja ponavljanje znakovnog niza. Stoga je rezultat gornjeg izraza znakovni niz'1.21.21.21.21.2'.

    Ako pak pokuamo u Pythonu izraunati izraz: '5'*'1.2', dogodit e se iznimka. U Perlue rezultat evaluacije tog istog izraza biti 6.

    Ponekad se jezici dijele na jezike visoke i jezike niske razine. Ta se podjela odnosi na uda-ljenost programera od implementacijskih detalja vezanih za arhitekturu raunala na kojemse program izvodi, odnosno na razinu apstrakcije tih detalja. Tako programer u C-u moeizravno pristupati memorijskim lokacijama, ali zato mora i voditi brigu o upravljanju memo-rijskim prostorom kako bi zauzete resurse uredno vratio sustavu. S druge strane, programeru Pythonu nema na raspolaganju takve mehanizme, ali im se zato ne mora ni optereivati o tome brine sam Python. Naravno da automatska briga o resursima predstavlja i odreenoraunsko optereenje sustava, pa su programi pisani u jeziku visoke razine neto sporiji nego ujeziku niske razine. K tome, ako je programer u jeziku niske razine vrlo vjet, moe ugaanjemdetalja izvedbe postii znatno ubrzanje programa za neki konkretan problem. Naravno, takavje problem znaajno tee napisati, a u velikom broju primjena brzina izvoenja nije kritina,ve je puno vanija brzina implementacije (engl. time-to-market).

  • 2. Ljuska operacijskog sustavaLjuska operacijskog sustava predstavlja fleksibilno tekstualno suelje prema operacijskom sus-tavu. Danas operacijski sustavi dolaze s dopadljivim grafikim korisnikim sueljima (GUI ),no ranije je osnovni nain pokretanja operacija bio upravo kroz ljusku operacijskog sustava.To vrijedi ne samo za Unix, ve i za ostale ranije operacijske sustave kao to su bili MS-DOS,CPM i VMS. Primjeri operacija koje su se pokretale kroz ljusku su pristupanje datotenomsustavu (kreiranje mapa, pregledavanje sadraja mapa, kopiranje datoteka), pokretanje ko-risnikih programa i raznih ugraenih alata. Bez obzira na rairenost grafikih korisnikihsuelja, i danas svi operacijski sustavi nude neku vrstu ljuske. Koritenjem naredbenog retka(engl. command line interpreter), iskusan korisnik moe traenu operaciju pokrenuti bre negotraenjem odgovarajue naredbe ili opcije u menijima. U sluaju velikog broja naredbi, te bo-gatog skupa opcija, dobitak u uinkovitosti moe biti i znaajan. Uz to, niz naredbi moe sezapisati u tekstualnu datoteku iz koje se zatim pokreu (engl. batch obrada).

    U osnovi, ljuska je program koji posreduje izmeu korisnika i operacijskog sustava. Onanije dio jezgre operacijskog sustava ve korisniki program koji koristi pozive prema jezgriOS-a. Ljuska naprosto prihvaa naredbe koje korisnik unosi u naredbenom retku i prevodi ihu pozive jezgre OS-a. To bi znailo da bi svatko mogao napisati svoju ljusku. Meutim, radikompatibilnosti s drugim korisnicima i drugim sustavima, jasno je da je puno bolje koristitineku standardnu ljusku.

    Jedna od najvanijih znaajki Unix-a je velika zbirka programa standardno se isporuujevie od 200 osnovnih naredbi (alata). Meutim, jo je i vanija lakoa kojom se te naredbemogukombinirati za obavljanje sofisticiranih zadaa, u emu je ljuska presudna. Tipina ljuskapodrava programske konstrukte koji omoguavaju ispitivanje uvjeta, formiranje programskihpetlji, te koritenje varijabli za pohranu vrijednosti.

    Standardne ljuske koje se isporuuju s Unix/Linux sustavima izvedene su iz ljuske sh kojuje 1978. razvio Stephen Bourne u AT&T Bell Labs. Najpoznatiji sljednici su ljuske ksh i bash.Druga grana standardnih Unix ljuski je izvedena iz ljuske csh, koju je 1979. predstavio BillJoy sa sveuilita Berkeley, a sintaksno je slina programskom jeziku C. Inenjerska udrugaIEEE je razvila standard temeljen na Bournovoj ljusci sh i ostalim novijim izvedbama, Shelland Utilities volume of IEEE Std 1003.1-2001, poznatiji kao POSIX standard.

    2.1 Ljuska bashU okviru predmeta emo se baviti ljuskom bash (Bourne Again Shell). To je najrairenija ljuska,koja se standardno isporuuje s distribucijama Linuxa, kao i s Mac OS X. Moemo je koristitii u okviru okoline Cygwin na MS Windowsima, koja je zapravo implementacija skupa Unixalata.

    Kako bismo zapoeli s radom u ljusci, potrebno ju je najprije pokrenuti. Ako koristimoLinux ili Mac OS X, potrebno je pokrenuti program Terminal, a ako koristimo MS Windows,potrebno je instalirati okolinu Cygwin i pokrenuti je. U svakom sluaju, otvara se prozor snaredbenim retkom u koji moemo upisivati naredbe. Ukoliko u naredbenom retku nije po-krenuta ljuska bash, moemo je pokrenuti kao program (oznaka $ je odzivni znak (engl.

    7

  • 8 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    prompt): $ bash Kada poelimo napustiti ljusku, jednostavno upiemo naredbu: $ exit. Lju-ska bash nudi mogunost ureivanja naredbe, ponavljanja prethodno unesenih naredi (kori-tenjem strelica prema gore odnosno prema dolje prolazimo kroz listu prethodnih naredbi),automatskog nadopunjavanja (tipka Tab), te pretraivanja liste prethodnih naredbi (kombina-cija tipki ctrl-R.

    Na raspolaganju nam je i sustav pomoi. Dodatne informacije o pojedinoj Unix naredbimogu se dobiti navoenjem parametra --help. Primjerice, informacije o naredbi ls dobit emos: $ ls --help. Primijetit emo da je tekst dulji od jednog ekrana, pa e nam poetak pobjei.Listanje stranicu po stranicu moemo postii kombinacijom s naredbom less:$ ls --help | less

    Jo jedan izvor informacija o Unix naredbama su man stranice (engl. manpages). Odgova-rajuu stranicu dobit emo pokretanjem naredbe man kojoj se kao argument navodi naredbakoja nas zanima:$ man lessKako bismo se lake snali unutar teksta koji je esto vrlo opsean, na raspolaganju nam stojii mogunost pretraivanja. To se postie upisivanjem znaka / nakon kojega se upisuje tekstkoji elimo pronai. Taj tekst moe biti i regularni izraz (o regularnim izrazima bit e rijeikasnije). Sljedeu pojavu traenog teksta moemo dobiti upisivanjem slova n, a prethodnuslovom N. Izlaz iz pregleda stranice dokumentacije postie se upisom slova q.

    Osim navedenih, postoje i jo neki alati za dobivanje dodatnih informacija kao to su info,apropos i whatis, no itatelju ostavljamo da istrai na koji se nain koriste. Uz to, danas je do ko-risnih informacija o pojedinim naredbama i nainu njihovog koritenja lako doi koritenjemweb trailica.

    2.2 Datoteke i kazalaUnix koristi hijerarhijski datoteni sustav. Nakon pristupanja sustavu, korisnik se nalazi usvom osobnom kazalu datoteka (engl. home directory).Unutar svog kazala korisnik moe stva-rati nove datoteke, kao i oblikovati nova kazala. Rezultat je stablasta struktura, s korijenom(engl. root directory), ija je oznaka /.

    2.2.1 Operacije nad datotekamaStvaranje novog kazala postie se naredbom mkdir: $ mkdir naziv_kazala

    Sadraj tekueg kazala moe se prikazati naredbom ls, pri emu se opcijama moe defini-rati nain prikaza liste datoteka: $ ls, $ ls -l, $ ls -al

    Naredba pwd omoguuje prikaz oznake tekueg kazala:$ pwd/home/korisnik/SkriptniJezici/ciklus1

    Premjetanje u drugo kazalo, odnosno promjena tekueg kazala postie se naredbom cd:$ cd naziv_kazalaPremjetanje u kazalo prve vie razine hijerarhije postie se koritenjem oznake ..:

    $ cd ..$ pwd/home/korisnik/SkriptniJezici

    Slina oznaka . oznaava trenutno kazalo, dok se za premjetanje u osobno kazalo korisnikakoristi oznaka ~:

  • 2.2. DATOTEKE I KAZALA 9

    $ cd ~/ SkriptniJezici/ciklus1$ pwd/home/korisnik/SkriptniJezici/ciklus1

    Ponekad je potrebno obrisati neku datoteku, a to se postie naredbom rm: $ rm ime_datotekeZa brisanje kazala koristi se naredba rm, pri emu se ne moe obrisati kazalo koje nije prazno:$ rmdir ime_kazalaAko bismo htjeli obrisati sadraj kazala i njihovih podkazala (rekurzivno) moemo primijenitinaredbu rm s opcijom -r. No, pritom treba biti vrlo oprezan, jer bismo nepanjom mogli obri-sati i datoteke koje ne elimo:$ rm -r ime_kazala

    Kopiranje datoteke postie se naredbom cp, uz navoenje imena poetne i odredine dato-teke: $ cp datoteka1 datoteka2, a preimenovanje (premjetanje) datoteke naredbom mv:

    $ mv ime_prije ime_poslije$ mv ime_prije ~/ SkriptniJezici/ciklus1/ime_poslije

    2.2.2 Ureivanje datotekaKada budemo pisali skripte ili pripremali datoteke s ulaznim podacima, bit e nam potrebanureiva teksta (engl. text editor). Moemo odabrati neki od popularnih editora, ve premaraspoloivosti na sustavu koji se koristi: vi, emacs, joe, nedit, nano i slino.

    Alternativni nain, prikladan jedino za vrlo kratke i jednostavne skripte ili probne datotekeje koritenjem naredbe cat. Tu je mogunost popravljanja unosa ograniena samo na jedanredak, pa je na taj nain vrlo nezgodno pisati sloenije tekstove. Postupak zapoinjemo po-kretanjem naredbe cat > ime_datoteke. Potom upisujemo redak po redak teksta, a zavretakunosa oznaava se kombinacijom tipki ctrl-D. Istu naredbu moemo primijeniti i za prikazsadraja datoteke. Ako se pritom navede i opcija -n, svaki prikazani redak se numerira:

    $ cat ime_datoteke$ cat -n ime_datoteke

    Za dulje datoteke, prikladno je imati mogunost listanja sadraja, pa se za to koristi na-redba more ili naredba less koja omoguuje i listanje teksta prema poetku. Obje naredbe sezavravaju upisivanjem slova q, dok se listanje postie tipkama PgUP/PgDN.

    $ more ime_datoteke$ less ime_datoteke

    2.2.3 PreusmjeravanjeUnix omoguava preusmjeravanje (redirekciju) izlaza programa koji se uobiajeno ispisujena standardni izlaz stdout (ekran) u datoteku. Slino se i standardni ulaz stdin umjesto stipkovnice moe preuzimati iz datoteke. Takoer se moe postii i povezivanje dva programana nain da izlaz jednoga bude proslijeen na ulaz drugoga. Za preusmjeravanje se brineljuska, a zadaje se koritenjem posebne notacije.

    Preusmjeravanje izlaza programa oznaava se operatorom >:$ ls > ime_datoteke

    Svi ispisi koji bi se bez preusmjeravanja pojavili na ekranu, nakon preusmjeravanja zavravajuu navedenoj datoteci. Dijagnostiki ispisi (poruke o pogrekama) obino se ispisuju na odvo-jeni izlazni tok stderr. Ako nije preusmjeren, i on se kao i stdout pojavljuje se na ekranu. Da

  • 10 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    bismo dijagnostike ispise preusmjerili, potrebno je uz operator izlazne redirekcije navesti ioznaku 2. To je deskriptor izlaznog toka stderr. Izlazni tok stdout ima deskriptor 1, ali njegane treba pisati.

    $ program 2> ime_datoteke

    U nekim sluajevima zgodno je stderr preusmjeriti na stdout, kako bismo omoguili ulan-avanje s nekim dodatnim programom. Primjerice, ako elimo omoguiti listanje dijagnosti-kih poruka prevoditelja:

    $ 2>&1$ gcc x.c 2>&1 | less

    Primjena operatora izlazne redirekcije stvara novu datoteku, odnosno sadraj postojeedatoteke istog imena se brie. Ukoliko elimo zadrati stari sadraj, te u datoteku nadopisatiizlaz programa, koristimo operator nadodavanja (engl. append) >>:

    $ ls >> ime_datoteke

    Preusmjeravanjem standardnog ulaza (stdin, deskriptor 0, ne treba ga pisati) programumjesto s tipkovnice ulazne podatke ita iz navedene datoteke. Operator ulazne redirekcijeje kratka.txt

    2.3 Varijable ljuskeJedan od osnovnih programskih elemenata su varijable, koje omoguavaju pohranjivanje po-dataka i rezultata. Stoga i ljuska omoguava koritenje varijabli. Razliite ljuske imaju razliitusintaksu dodjeljivanja vrijednosti varijablama i njihovog koritenja. U ljusci bash, vrijednostse dodjeljuje na sljedei nain:X="abcd" ili X=abcdU oba sluaja varijabli X pridruen je isti znakovni niz. Ovdje treba posebno uoiti da je bashosjetljiv na razmake prije i poslije znaka jednakosti. Tonije, ne smije ih biti. Ako se sluajnoumetne razmak, bash e ime varijable tumaiti kao naredbu ili ime programa i pokuat e gaizvriti.

    $ y = 23bash: y: command not found

    U prethodnom uspjenom primjeru dodjele vrijednosti varijabli primijetili smo da navod-nici oko znakovnog niza nisu nuni. No, u nekim ih situacijama moramo koristiti. Naime, akose znakovni niz sastoji od vie rijei, odnosno ako sadri praznine, bez navodnika e niz bitirazlomljen i pogreno interpretiran. Stoga je ispravno napisati:

  • 2.3. VARIJABLE LJUSKE 11

    $ S="idemo na rucak"

    dok e izraz bez navodnika izazvati pogreku.Kada se varijabla koristi, potrebno ju je predznaiti znakom $. Primjerice, vrijednost

    varijable X iz ranijeg primjera moemo ispisati:$ echo $X

    abcd

    Ako zaboravimo prefiks, X e se tumaiti kao znakovni niz:$ echo XX

    Imena varijabli sastoje se od slova, brojeva i znaka _, pri emu se razlikuju velika i malaslova.

    $ x=1234$ echo $X : $x

    abcd : 1234

    2.3.1 Varijable okolinePosebna vrsta varijabli ljuske su varijable okoline (engl. environment variables). Varijable oko-line koje postavimo u ljusci nasljeuju se u programima (procesima) pokrenutima iz ljuske,odnosno pod-ljuskama. Pod-ljuska nastaje pokretanjem nove ljusku kao programa, sjeamose ljuska je normalan program. I postavljanje varijabli okoline specifino je za svaku ljusku.U ljusci bash, varijabla postaje varijablom okoline tako da joj se postavi odgovarajui atributnaredbom export. To se moe obaviti prilikom inicijalizacije varijable, ali i naknadno.

    export varijabla=vrijednost

    Popis varijabli okoline moemo dobiti naredbom env ili naredbom export -p. Varijablekoje nisu eksportirane, program ili skripta pokrenuta iz ljuske nee vidjeti.

    Jo jedna specijalizacija su ugraene (engl. built-in) varijable okoline, koje se nazivaju ivarijablama sustava (engl. system variables). To su varijable koje imaju posebno znaenje zaoperacijski sustav. Primjerice, varijabla $PATH sadri listu kazala (odvojenih dvotokom) u ko-jima se trae izvrne datoteke kada se ljusci zada naredba. Redoslijed kazala u listi odreujeredoslijed pretraivanja.

    $ echo $PATH/usr/local/bin:/usr/bin:/bin

    Jo neke vanije varijable sustava su $HOME, koja odreuje matino kazalo korisnika; $SHELL,koja sadri ime pokrenute ljuske (ukljuujui put); $USER, koja sadri korisniko ime; $TERM, kojasadri tip terminala, itd. Kao jedan zgodan primjer moemo navesti i podeavanje varijable$PS1, koja pohranjuje oznaku koja se ispisuje na poetku naredbenog retka. U tu varijabluse mogu upisati i neke specijalne sekvence koje e izmijeniti izgled ispisa, primjerice boju.Moemo isprobati sljedei programski odsjeak:

    Green="\[\033[32m\]"Brown="\[\033[33m\]"White="\[\033[0m\]"

    export PS1="$Green\u@\h:$Brown\w$White\n\$ "

  • 12 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    Uoavamo da se na poetku definiraju varijable koje sadre specijalne sekvence za uprav-ljanje terminalom tako da se dobije zeleni, smei ili bijeli ispis. Zatim se definira sam odzivniniz, na nain da se najprije ukljui zeleni ispis, zatim se ispie ime korisnika (oznaka \u), zatimznak @, pa ime raunala (oznaka \h) i dvotoka. Nakon toga se ispis prebacuje u smeu bojui ispisuje se radno kazalo (oznaka \h). Konano, ukljuuje se bijeli ispis, prelazi se u novi redi ispisuje oznaka $. Nakon izvravanja tog programskog odsjeka, naredbeni redak bi trebaoizgledati otprilike ovako (boja je zanemarena):

    zkalafatic@MAGELLAN :~/ Work/SkriptniJezici$

    2.4 Koraci obrade naredbenog retkaKada se naredba upie u naredbeni redak, ljuska je analizira obavljajui pritom cijeli niz koraka.Te emo korake najprije pobrojati, a zatim postupno objasniti.

    1. ljuska ita sadraj ulaznog retka;2. ulazna linija razlae se u niz simbola (engl. tokens): rijei i operatora;3. niz simbola se parsira prepoznaju se jednostavne i sloene naredbe;4. obavlja se irenje (engl. expansion) pojedinih dijelova svake naredbe (rijei) rezultat je

    lista imena putanja, te polja koja predstavljaju naredbe i argumente;5. obavlja se preusmjeravanje, te uklanjaju operatori preusmjeravanja i njihovi operandi;6. pokree se funkcija, ugraena naredba, izvrna datoteka ili skripta, pri emu se proslje-

    uje i lista argumenata;7. ljuska eka da naredba zavri, te prikuplja njen izlazni status.

    2.4.1 Navodnici i uloga u tumaenju naredbiPrilikom tumaenja naredbenog retka, neki znakovi imaju posebna znaenja. To su prije svegarazmak, tabulator i prelazak u novi red, ali tu su i znakovi koji se koriste za redirekciju (< i >),te znakovi | & ; ( ) $ ` \ " ' .

    Kako bi se specijalni znak (metaznak) tumaio doslovce (bez svog specijalnog znaenja),potrebno ga je predznaiti (engl. escape) znakom \.

    Koritenje navodnika takoer mijenja ponaanje ljuske pri interpretaciji naredbenog retka.Tako se niz znakova uokviren jednostrukim navodnicima (' ') ne tumai u ljusci, ve se samoprosljeuje kao niz. To moemo ilustrirati primjerom u kojem se pojavljuje ime varijable.Jednostruki navodnici e sprijeiti zamjenu imena varijable njenom vrijednou:

    $ echo 'Tekuce kazalo je $PWD'Tekuce kazalo je $PWD

    Nasuprot tome, dvostruki navodnici (" ")uokviruju niz kao cjelinu, ali pritom se obavljairenje (engl. expansion) argumenata oznaenih posebnim znakovima ljuske. Primjerice, imevarijable se zamjenjuje njenom vrijednou:

    $ echo "Tekuce kazalo je $PWD"Tekuce kazalo je /home/zkalafatic/Skriptni/ciklus1

    Jo se jedna vrsta navodnika koristi, ali njihovo je znaenje bitno drugaije. Radi se oobrnutim jednostrukim navodnicia (engl. backquotes) (` `), koji oznaavaju zamjenu naredbi,o kojoj e kasnije biti malo vie rijei.

  • 2.4. KORACI OBRADE NAREDBENOG RETKA 13

    2.4.2 irenja u naredbenom retkuNakon dijeljenja naredbenog retka u rijei, obavlja se niz transformacija koje se nazivaju ire-njima (engl. expansion). Te transformacije obavljaju se u sljedeim koracima:

    irenje vitiastih zagrada; irenje znaka ~; irenje parametara i varijabli; zamjena naredbi; aritmetiko irenje; dijeljenje rijei; irenje imena datoteka (engl. pathname expansion).

    irenje vitiastih zagradairenje vitiastih zagrada (engl. brace expansion) je mehanizam kojim se mogu generirati zna-kovni nizovi, iji se uzorci mogu prikazati prefiksom, slijedom znakovnih nizova odvojenihzarezima ili izrazom za generiranje sekvence, koji se navode unutar vitiastih zagrada, te su-fiksa. Primjerice, izraz a{d,c,b}e iri se u 'ade ace abe'.

    Slino:$ echo ab{c,d,e,f}oooo

    abcoooo abdoooo abeoooo abfoooo

    Unutar vitiastih zagrada moe se primijeniti i izraz za generiranje sekvenci. Takav izrazje oblika {x..y}, gdje su x i y brojevi (ire se numeriki) ili znakovi (ire se leksikografski):

    $ echo ab {1..4} ijab1ij ab2ij ab3ij ab4ij

    Valja biti svjestan da se irenje vitiastih zagrada obavlja prije svih ostalih ekspanzija, apritom znakovi za ostale ekspanzije ostaju ouvani.

    Jo jedan primjer primjene irenja vitiastih zagrada:$ mkdir projekt /{old ,new ,dist ,bugs}

    irenje oznake korisnikog kazalaPosebna vrsta irenja odnosi se na oznaku korisnikog kazala, a poznata je i pod imenomtilda-ekspanzija. Naime, znak koji se koristi kao oznaka korisnikog kazala ~ naziva setilda. Ovo se irenje obavlja po jednostavnim pravilima.

    Ako rije poinje znakom tilda, svi znakovi do prvog znaka / ili kraja rijei smatraju setilda-prefiksom. Ako tildu slijedi rije bez navodnika, ona se smatra moguim korisnikimimenom. Ako korisnik tog imena ne postoji, ekspanzija se ne obavlja:

    $ echo ~sgros/home/zemris/sgros

    $ echo ~francek # ne postoji ovo korisniko ime~francek

    Ako je tilda-prefiks samo tilda, ona se zamjenjuje varijablom $HOME, odnosno matinimkazalom korisnika koji je pokrenuo ljusku:

  • 14 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    $ echo ~/home/zemris/zkalafatic

    irenje varijabli i parametaraU nekoliko prethodnih primjera vidjeli smo kako se u ljusci bash koriste varijable. Podsjetimose: ime varijable predznaava se znakom $. Zamjena varijable njenom vrijednou naziva seirenjem varijable.

    U nekim sluajevima pojavit e se potreba za umetanjem vrijednosti varijable neposrednoprije sljedeeg znaka, to bi moglo dovesti do pogrene interpretacije imena varijable. Pri-mjerice, ako bismo htjeli konstruirati ime datoteke u kojem se pojavljuje broj pohranjen uvarijabli, mogli bismo napisati sljedei niz naredbi.

    $ godina =2011$ ime=ispit_$godina_c.tex$ echo $ime

    ispit_.tex

    Kontrolni ispis pokazuje da ime datoteke nije ispravno konstruirano. Naime, ljuska jenakon znaka $ pokupila niz znakova do prvog znaka koji se ne koristi u imenima varijabli, ato je u ovom sluaju toka, i taj niz je upotrijebila kao ime varijable. Kako varijabla $godina_cnije definirana, ona se zamjenjuje praznim nizom, pa je rezultat sasvim razumljiv. Kako bismodoskoili ovom problemu, ime varijable moemo okruiti vitiastim zagradama:

    $ godina =2011$ ime=ispit_${godina}_c.tex$ echo $ime

    ispit_2011_c.tex

    U naslovu smo spomenuli i pojam irenja parametara. Parametri su zapravo specijalnavrsta varijabli, ija imena su brojevi koji oznaavaju njihov redoslijed. Pozicijski parametripojavljuju se prilikom prijenosa argumenata iz naredbenog retka u skriptu, pa emo ih detalj-nije obraditi kasnije.

    Osim osnovne zamjene (irenja) varijabli, bash podrava i neke sofisticiranije inaice. Kaoilustraciju, ovdje emo navesti par primjera, a zainteresirani itatelj moe detaljnije prouitidokumentaciju.

    Oblik ${varijabla:-default} oznaava da se u sluaju da varijabla nije inicijalizirana upo-trijebi navedena pretpostavljena vrijednost.

    $ echo ${nepostojeca:-podrazumijevana}podrazumijevana

    Varijanta ${varijabla:=default} se ponaa slino, s tim da se u sluaju neinicijaliziranevarijable ona i postavlja u zadanu pretpostavljenu vrijednost.

    Zamjena naredbeZamjena naredbe (engl. command substitution) omoguuje da se navedeni tekst protumai iizvede kao naredba, te se zatim zamijeni generiranim izlazom izvrene naredbe. Sintaksno,koriste se dva oblika ove vrste irenja. Jedan smo spomenuli u odjeljku vezanom za navod-nike, a tu se naredba zapisuje unutar obrnutih jednostrukih navodnika: `naredba`. Meutim,jednostruki navodnici su prilino neuoljivi u kdu, pa je preporuljivije koristiti drugi oblik,u kojemu se naredba zapisuje unutar oblih zagrada kojima prethodi prefiks $.

  • 2.4. KORACI OBRADE NAREDBENOG RETKA 15

    Kao primjer, moemo iskoristiti ispis koji generira Unix naredba date. U primjeru se po-sebnim formatnim nizom definira oblik ispisa.

    $ echo "Danas je $(date "+%A, %d.%m.%Y")"Danas je Wednesday , 22.02.2012

    Slian primjer, samo uz koritenje alternativne sintakse:$ Datum=`date `$ echo $Datum

    Wed Feb 22 15:38:24 CEST 2012

    Aritmetiko irenjeAritmetiko irenje omoguuje evaluaciju aritmetikih izraza i njihovu zamjenu u naredbenomretku rezultatom izrauna. Ovo irenje je sintaksno dosta slino zamjeni naredbe, pa trebapripaziti da se ne pobrkaju. Ovdje se koriste dvostruke oble zagrade: $((aritmetiki izraz)).

    $ echo $((3*7+15/3))26

    Prije evaluacije aritmetikog izraza obavljaju se sva ranije navedena irenja, pa u izrazimamoemo koristiti varijable.

    $ a=5$ echo $(($a *3%4))3

    Aritmetiki izrazi mogu se gnijezditi, a za neispravne izraze ispisuje se obavijest o pogreci.

    Dijeljenje rijeiNakon to se obavi niz prethodno prikazanih zamjena i irenja u naredbenom retku, obavljase podjela retka na rijei. Pritom valja napomenuti da se nad znakovnim nizovima koji suzapisani unutar navodnika (jednostrukih ili dvostrukih) dijeljenje na rijei ne obavlja.

    Dijeljenje na rijei koristi sadraj posebne sustavske varijable IFS, iji sadraj odreujelistu znakova na kojima se redak dijeli na rijei. Uobiajeno su u toj varijabli znakovi razmak,tabulator i prelazak u novi red, pa se dijeljenje obavlja upravo na tim znakovima. Jo je ee tavarijabla neinicijalizirana, to izaziva dijeljenje na upravo tim, podrazumijevanim, znakovima.

    irenje imena datotekaNakon dijeljenja ulaznog retka na rijei, pristupa se irenju imena datoteka, koje je poznatoi pod imenom globbing. U svakoj rijei trae se znakovi *, ? i [, te ako se pronae neki odtih znakova, rije se smatra uzorkom (engl. pattern) i zamjenjuje se abecedno poredanom lis-tom imena datoteka koje odgovaraju uzorku. Uzorak je donekle slian regularnim izrazima, okojima e kasnije biti rijei, no radi se o neto jednostavnijem mehanizmu. Svakako te dvijenotacije za podudaranje uzoraka teksta treba razlikovati i zapamtiti da se kod irenja imenadatoteka koristi jednostavnija.

    U uzorku svaki znak (osim posebnih) predstavlja sam sebe, specijalni znakovi koji se eledoslovno podudarati moraju biti predznaeni znakom \. Znaenja posebnih znakova su:

    * predstavlja proizvoljan (pod)niz znakova, ukljuujui i prazan niz; ? predstavlja jedan proizvoljan znak;

  • 16 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    izraz [: : :] podudara se s jednim znakom iz skupa znakova navedenih unutar zagrada.

    Izraz koji se navodi unutar uglatih zagrada predstavlja listu znakova koji se pri poduda-ranju mogu nai na specificiranom mjestu. Unutar zagrada moe se zadati i raspon znakova,primjerice [a-z] predstavlja mala slova engleske abecede, a [0-5] se moe podudariti sa zna-menkom izmeu 0 i 5. Lista znakova moe se i negirati, tako da se kao prvi znak navede^. Tako izraz [^012] oznaava da na zadanom mjestu moe stajati bilo koji znak koji nijeznamenka izmeu 0 i 2.

    Standard POSIX.2 definira i oznake za posebne klase znakova, koje se oznaavaju u formatu[:klasa:], pri emu su predviene oznake za klase:alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit

    Prilikom koritenja klasa znakova u uzorcima za irenje imena datoteka, one se morajunavesti unutar liste znakova, pa konani izraz obino sadri dvostruke uglate zagrade! To jeilustrirano sljedeim primjerom.

    $ ls [[: alpha :]]*[[: digit :]]*}skriptni_P2.pdf skriptni_P2.ps skriptni_P2.tex

    Valja napomenuti da se ni ova vrsta irenja ne obavlja nad nizovima zapisanima unutarjednostrukih ili dvostrukih navodnika. Ilustrirajmo to primjerom izraza koji trai datoteke utekuem kazalu iji drugi znak imena je P.

    $ echo ?P*MP3katalog MP3rename1 MP3rename2

    Ako taj izraz napiemo unutar navodnika, irenje se nee obaviti i ispisuje se upravo taj izraz.$ echo "?P*"?P*

    Ukoliko u tekuem kazalu nema niti jedne datoteke koja bi zadovoljila zadani izraz, irenjese ne obavlja i umjesto praznog znaka (to bismo vjerojatno oekivali) ispisat e se zadani izraz.U sljedeem primjeru izraz je primijenjen u kazalu unutar kojega ime niti jedne datoteke nijezapoinjalo znakom Y.

    $ echo Y*Y*

    2.5 Sloeniji Unix alatiU Unix/Linux distribucijama standardno se isporuuje niz vrlo korisnih alata. Mi emo ihupoznati nekoliko koji se esto koriste. To su alati za brojanje rijei, redaka i znakova (wc),pronalaenje redaka teksta u kojima se nalazi zadani uzorak (grep), manipulacija tekstnimtokom (sed), sortiranje (sort), manipulacija ponovljenim retcima (uniq), te traenje datoteka(find).

    2.5.1 Brojanje rijei, znakova i redakaNaredba wc (engl. word count) broji rijei, retke i znakove u zadanoj datoteci ili na standardnomulazu. Naredbi se opcijama moe zadati podatak koji nas zanima, a ako se ne navede imedatoteke, ita se standardni ulaz.

    wc [opcije] []

  • 2.5. SLOENIJI UNIX ALATI 17

    Mogue opcije su w (ispisuje se broj rijei), l (ispisuje se broj redaka) i c (ispisuje se brojznakova). U nastavku je nekoliko primjera.

    $ wc /etc/passwd # retci , rijei , znakovi40 60 1873 /etc/passwd

    $ wc -c /etc/passwd # samo znakovi1873 /etc/passwd

    $ wc -wc /etc/passwd # rijei i znakovi60 1873 /etc/passwd

    $ ls -l /usr/include | wc -l # ita se stdin

    2.5.2 Pretraivanje tekstnih datotekaZa pretraivanje sadraja tekstnih datoteka koristimo naredbu grep. Uzorak zadan regularnimizrazom trai se u zadanoj datoteci ili u podacima sa standardnog ulaza, redak po redak. Svakiredak u kojem se pronae zadani uzorak ispisuje se na standardni izlaz.

    Naredba podrava zadavanje mnotva opcija kojima se odreuje njeno ponaanje. Ovdjeemo navesti samo neke vanije opcije. Oblik naredbe je:

    grep [opcije] trazeni_uzorak []

    a neke ee opcije su:-v ispisuju se linije koje ne sadre zadani uzorak-i pretraivanje bez razlikovanja malih i velikih slova-c ne ispisuju se retci teksta, ve samo broj redaka u kojima je uzorak pronaen-E trazeni_uzorak predstavlja regularni izraz s proirenom sintaksom-q nema ispisa, izlazni status oznaava je li uzorak pronaen

    Uzorak se zadaje regularnim izrazom, a to je posebna notacija koja omoguava definiranjeskupova znakovnih nizova. Oni koji su sluali predmet Uvod u teoriju raunarstva, sjetite se da je skup znakovnih nizova jezik, te da su regularni izrazi notacija koja omoguujedefiniranje regularnih jezika. Kako se regularni izrazi koriste puno ire od same naredbe grep,posvetit emo im sljedei odjeljak. Spomenimo da grep prihvaa dvije sintakse regularnihizraza (osnovnu i proirenu), a kako je proirena sintaksa neto elegantnija i danas rairenija,koristit emo nju. Stoga emo obino zadavati opciju -E.

    Regularni izraz moe biti i obian znakovni niz, bez specijalnih operatora, pa najjednostav-nija uporaba grepa za jednostavno pronalaenje nekih podnizova. Primjerice, mogli bismo unaim programima pisanima uC-u potraiti datoteke u kojima smo koristili bibliotekuOpenCV,odnosno programe koji ukljuuju datoteku zaglavlja cv.h.

    $ grep "" *.c

    Uoite da e u ovom retku doi do irenja imena datoteka, pa e grep kao argumente dobililistu datoteka. Ispisat e se retci u kojima se pojavio zadani uzorak, a uz svaki takav redak bite ispisano i ime datoteke u kojoj se taj redak nalazi.

    Slino, moemo saznati podatke o korisniku koji su zapisani u datoteci /etc/passwd.$ grep zekoslav /etc/passwd

    esto je prikladno grep primijeniti nad izlazom neke druge naredbe. Primjerice, popisvarijabli ljuske moemo dobiti naredbom set. Kako je obino taj popis dugaak, neprikladnoje u njemu traiti neku varijablu koja nas zanima. Ako bismo htjeli pogledati koji je sadrajvarijable IFS, mogli bismo to postii i na sljedei nain.

  • 18 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    $ set | grep IFSIFS=$' \t\n'

    2.5.3 Regularni izraziKao to smo ve spomenuli, regularni izraz je uzorak zadan u posebnoj notaciji, koji opisujeskup znakovnih nizova. Regularni izrazi grade se od jednostavnijih regularnih izraza primje-nom posebnih operatora., pri emu je osnovni graevni blok je regularni izraz koji predstavljapojedinani znak. Veina znakova (npr. sva slova i znamenke) predstavljaju sami sebe, a po-sebni znakovi (metaznakovi) se mogu tumaiti doslovno tako da ih se predznai znakom \.

    Kao i kod izraza za irenje imena datoteka (globbing), i u regularnim izrazima mogu senavoditi liste znakova. Sintaksa je praktiki jednaka. Ponovimo, unutar uglatih zagrada [ ]navodi se lista znakova s kojima se moe podudarati (jedan) znak na odgovarajuem mjestutraenog uzorka. Ako je prvi znak unutar zagrada ^, lista se tumai kao negacija, tj. nave-deni znakovi se na tom mjestu ne smiju nalaziti. Unutar zagrada moe se definirati i raspon,odreen s dva znaka izmeu kojih je znak -. Takoer, mogu se koristiti i POSIX klase zna-kova navedene u odjeljku 2.4.2 Mogu se koristiti i sinonimi za alfanumerike znakove i njihovunegaciju. Oznaka \w je sinonim za [[:alnum:]], a \W sinonim za [^[:alnum:]].

    Unutar liste veinametaznakova gubi svoje specijalno znaenje, kako bismo u listu ukljuilii znakove koji je inae oznaavaju, treba ih posebno pozicionirati. Tako znak ] mora bitinaveden na poetku liste, kako se ^ ne bi tumaio kao negacija, ne smije stajati na poetkuliste, a znak - mora biti naveden na kraju liste.

    Toka . je oznaka da se na tom mjestu moe nai bilo koji (jedan) znak. Ako povuemoparalelu sa notacijom irenja imena datoteka, sjetimo se da se tamo za istu namjenu koristioznak ?.

    U regularnim izrazima koristi se i niz oznaka koje oznaavaju mjesto u retku na kojem setraeni podniz moe nalaziti. Te se oznake podudaraju s praznim nizom, a nazivaju se sidrima.Znak ^ oznaava poetak retka, a znak $ kraj retka. Primjerice, naredbagrep '\.eps$' *.txt pronai e samo one retke koji zavravaju podnizom .eps. Uoimo i daje toka predznaena kako bi izgubila svoje specijalno znaenje u regularnom izrazu.

    Slino, oznake \ oznaavaju poetak odnosno kraj rijei , pa se izraz "\" pronalazi rije "grba" aline i "banalno"

    Slinu namjenu ima i oznaka \b, koja odgovara granici rijei. Stoga se izraz "\bpra"podudara s "pravednost" ali ne s "naprasno", a izraz "ba\b" pronalazi rije "grba" ali ne rije

    "banalno".Suprotna je oznaka \B, koja odgovara svemu osim granici rijei, pa izraz "\Bpra" pronalazi

    rije "naprasno" ali ne i "pravednost", dok izraz "ba\B" pronalazi "banalno" ali ne "grba".U regularnim izrazima koristi se i nekoliko operatora ponavljanja, odnosno kvantifikatora:

    ? prethodni izraz se pojavljuje najvie jednom* prethodni izraz se pojavljuje 0 ili vie puta+ prethodni izraz se pojavljuje jednom ili vie puta{n} prethodni izraz se pojavljuje tono n puta{n,} prethodni izraz se pojavljuje n ili vie puta{n,m} prethodni izraz se pojavljuje barem n ali najvie m puta

    Dva regularna izraza mogu se nadovezati, a tako sloen izraz podudara se s nizovima kojise sastoje od dva podniza koji odgovaraju nadovezanim regularnim izrazima (ulanavanje).Takoer, dva regularna izraza mogu se povezati operatorom | (unija). Takav sloeni izrazpodudara se s nizovima koji se podudaraju s bar jednim od dva povezana regularna izraza.

  • 2.5. SLOENIJI UNIX ALATI 19

    Operacija ponavljanja obavlja se prva, zatim slijedi ulanavanje, a tek nakon toga se pri-mjenjuje operacija unije. Redoslijed primjene ovih operator moe se izmijeniti zagradama.Osim izmjene redoslijeda operacija, zagrade i grupiraju dijelove regularnog izraza.

    Jo jedna vana operacija koju omoguavaju regularni izrazi je povezivanje unazad (engl.backreference). Ona se koristi tako da se u izrazu moe pozvati na ve pronaena poduda-ranja. Referencirati se moemo samo na dijelove regularnog izraza koji su grupirani oblimzagradama. Sama referenca oznaava se dekadskom znamenkom predznaenom znakom \.Vrijednost znamenke oznaava redni broj grupe na koju se referenciramo.

    Da bi bilo jasnije o emu se radi, ilustrirat emo to jednim jednostavnim primjerom. Re-cimo da u datoteci rodjendani.txt imamo zapisane datume roenja naih prijatelja, u svakomretku po jedan. eljeli bismo pronai one prijatelje iji datum i mjesec roenja se podudaraju.Naravno, moemo primijeniti naredbu grep, uz odgovarajui regularni izraz, pri emu emopovratnom referencom zahtijevati da mjesec bude jednak danu roenja.

    $ grep '\([0 -9]\{2\}\)\.\1 ' rodjendani.txtpero 03.03.1981.

    ivica 12.12.1977.

    Ovdje moemo i komentirati razliku osnovne (engl. basic) i proirene (engl. extended) sin-takse regularnih izraza. Razlika je zapravo malena, a radi se o tome da osnovna sintaksa zah-tijeva da metaznakovi budu predznaeni: \?, \+, \{, \|, \(, \), dok proirena sintaksa po-drazumijeva da su nepredznaeni znakovi metaznakovi, a ako ih elimo koristiti u njihovomdoslovnom znaenju, onda ih trebamo predznaiti. Kako se posebni znakovi puno ee koristeupravo kaometaznakovi, proirena sintaksa je jasnija i preglednija. Za usporedbumoemo po-gledati kako bi prethodni izraz bio zapisan u proirenoj sintaksi. Primijetimo da je toku u objesintakse potrebno predznaiti kako se ne bi podudarala sa svakim znakom.

    $ grep -E '([0 -9]{2})\.\1 ' rodjendani.txt

    Zato emo u pravilu koristiti proirenu sintaksu, odnosno opciju grep -E.

    2.5.4 Sortiranje tekstaZa sortiranje teksta koristimo naredbu sort. U osnovnoj primjeni, zadani ulazni tekst se slae(redak po redak) po (engleskoj) abecedi i zapisuje na standardni izlaz

    $ sort imena.txt > imena_sortirano.txt

    Naredba nudi mnotvo opcija kojima se podeava ponaanje naredbe, a njen oblik je:sort [opcije] []}

    Neke esto koritene opcije su:-u jednaki retci se ne ispisuju dvaput-r sortiranje obrnutim redoslijedom-o navodi se ime izlazne datoteke-n numeriko sortiranje-k N,M sortiranje se obavlja na temelju teksta od N -tog doM -tog polja,

    uobiajeni graninici su praznina i tab-t navodi se drugaiji graninik

    Kao primjer, moemo navesti numeriko sortiranje po treem polju, pri emu je graninikznak :

    $ sort -n -k 3 -t : /etc/passwd

  • 20 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    2.5.5 Pronalaenje ponovljenih redakaNaredba uniq slui za pronalaenje ponovljenih redaka teksta, pri emu se ponavljanjem sma-tra uzastopno ponavljanje. Kako bismo mogli pronai retke koji se u tekstu pojavljuju naproizvoljnim mjestima, tekst je nuno najprije sortirati.

    $ sort imena.txt | uniq > imena_2.txt

    Ako se prisjetimo da sort ima opciju -u, zakljuit emo da smo isti rezultat mogli postii i beznaredbe uniq.

    $ sort -u imena.txt > imena_2.txt

    Meutim, uniq ima niz opcija koje omoguuju ostvarivanje jo nekih funkcija. Oblik na-redbe je:

    uniq [opcije] [ []]

    Neke esto koritene opcije:-d ispisuju se samo ponovljeni retci-c ispisuje se i broj ponavljanja-f N iz usporedbe se iskljuuje prvih N polja-s N iz usporedbe se iskljuuje prvih N znakova-i ne uzima se u obzir razlika izmeu velikih i malih slova

    Koritenje nekih opcija moemo ilustrirati s par primjera. Sljedeom naredbom emo pro-vjeriti postoje li duplikati u datoteci /etc/passwd:

    $ sort /etc/passwd | uniq -d

    Ako pak elimo ispisati broj ponavljanja viestrukih redaka teksta, moemo to postii ovako:$ sort imena.txt | uniq -c

    2.5.6 Manipulacija tekstomZasigurno ste se susreli s potrebom za izmjenama nekih dijelova teksta u programu za ure-ivanje teksta. U takvoj situaciji vrlo je korisna mogunost pretraivanja i zamjene (engl.Search/Replace). Posebno je prikladno da takav alat podrava i regularne izraze. No, ako slinesekvence izmjena trebamo napraviti u razliitim datotekama, ili ih trebamo obavljati u vienavrata, bilo bi ih dobro moi pohraniti u obliku neke vrste programa.

    Naredba sed (engl. stream editor) omoguava manipulaciju tekstom koji se ita iz dato-teke ili sa standardnog ulaza. Osnovne operacije odgovaraju upravo pretraivanju i zamjenidijelova teksta koji se zadaju regularnim izrazima. Vie naredbi za sed mogue je pohranitiu posebnu datoteku i na taj nain oblikovati program, no sed se moe pozivati i iz skriptenapisane za ljusku. Mi emo se zadrati na jednostavnijim primjerima koritenja.

    Oblik naredbe je:sed [opcije] [-e upute] [-f upute_dat][]...

    Znaenja opcija su sljedea:-n ne ispisuje se izlazni rezultat

    -r koriste se regularni izrazi proirene sintakse-e upute navode se naredbe za sed, a ako je samo jedna naredba i ako

    nema opcije -f, onda se oznaka -e se moe izostaviti-f upute_dat upute se itaju iz datoteke upute_dat

    datoteka s ulaznim tekstom

  • 2.5. SLOENIJI UNIX ALATI 21

    Akcija zamjene dijelova teksta oznaava se kao s/reg_ex/zamjenski_tekst/. Primje-rice, ako bismo htjeli zamijeniti sve pojave niza Unix u datoteci intro.txt tekstom UNIX,moemo to uiniti sljedeom naredbom:

    $ sed 's/Unix/UNIX/' intro.txt

    U ovom sluaju, tekst u kojemu su obavljene izmjene ispisuje se na standardni izlaz. Naravno,ako elimo pohraniti rezultat, moemo preusmjeriti standardni izlaz.

    $ sed 's/Unix/UNIX/' intro.txt > intro2.txt

    Ovdje valja napomenuti da se obavlja samo jedna pojava navedenog niza u pojedinom retku.Ako elimo zamijeniti sve podnizove koji odgovaraju navedenom regularnom izrazu, trebanavesti opciju g koja oznaava globalnu primjenu zadane akcije.

    $ sed 's/Unix/UNIX/g' intro.txt > intro2.txt

    Ako elimo obrisati dio teksta, naprosto zamjenski niz ostavimo praznim. Primjerice, akobismo htjeli obrisati zadnja 3 znaka u svakom retku teksta, moemo to odrediti regularnimizrazom i primijeniti sljedeu naredbu.

    $ sed 's/...$//' datoteka.txt

    Opcija -n iskljuuje ispis rezultata, a akcija pretraivanja zadaje se zapisivanjem samo re-gularnog izraza, bez zamjenskog niza: /reg_ex/. Kako bismo ispisali redak u kojem je pro-naen zadani uzorak, dodat emo opciju p:

    $ sed -n '/UNIX/p' intro.txt

    Retci u kojima je pronaen zadani uzorak mogu se i obrisati, i to navoenjem opcije d:$ sed '/UNIX/d' intro.txt

    2.5.7 Traenje datotekaZa traenje datoteka koje odgovaraju nekim kriterijima, koristi se naredba find. To je sloenanaredba s mnotvom opcija, kojima se moe definirati razliite kriterije pretraivanja. Obliknaredbe je:

    find [opcije] [direktoriji] [uvjeti]

    Znaenja ee koritenih uvjeta su sljedea:-name trai se datoteka zadanog imena

    -type trai se datoteka zadanog tipad kazalo, f obina datoteka, l simboliki link-size trai se datoteka zadane veliine-print ispisuje se ime pronaene datoteke-mtime n trae se datoteke mijenjane prije n*24h-regex izraz trae se datoteke ije ime (ukljuujui stazu)

    odgovara zadanom regularnom izrazuNajee se trai datoteka ije nam je ime poznato, ali ne znamo gdje se nalazi, pa moemo

    primijeniti naredbu poput sljedee.$ find ~ -name Skriptni_0_Uvod.tex

    U ovom primjeru traimo datoteku ije ime tono znamo, a pretragu zapoinjemo od naegkorisnikog kazala, kroz sva podkazala. No, esto znamo samo fragment imena. Uvjet -name

  • 22 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    omoguuje nam zadavanje uzorka po sintaksi koja se koristi kod irenja imena datoteka. Pri-tom treba paziti da se uzorak zapie u navodnicima kako ga ne bi proirila ljuska. U tom bisluaju naredba find dobila pogrene argumente.

    $ find ~ -name "Skrip*.tex"

    Uz to, mogue je koristiti i regularni izraz za zadavanje imena. U tom se sluaju koristiuvjet -regex. Pritom se regularni izraz primjenjuje na cjelovito ime datoteke, koje ukljuuje icijelu stazu do nje. I ovdje uzorak treba staviti pod navodnike da ljuska ne obavlja irenje.

    $ find ~/ -regex ".*Skr.*P2.*\. pdf'"

    Ako zaboravimo napisati dio izraza koji se podudara sa stazom, upit nee dati rezultat.$ find ~/ -regex "Skr.*P2.*\. pdf'" # ovo nije dobro!

    Naredba find omoguuje pretraivanje i po drugim kriterijima. Primjerice, moemo traitidatoteke neke veliine. To se postie uvjetom -size, a moe se i oznaiti da se trai veaili manja veliina od zadane, to se postie dodavanjem modifikatora + (vee) ili - (manje).Primjerice, moemo potraiti datoteke u kazalu /etc koje su vee (+) od 1 MB:

    $ find /etc -size +1M

    ili datoteke koje su manje (-) od 1 kB:$ find /etc -size -1k

    Upit moemo temeljiti i na vremenu izmjene datoteke. Primjerice, mogli bismo traitidatoteke u svommatinom kazalu koje su mijenjane danas, a uz to moemo ispisati i detaljnijepodatke o naenim datotekama (dodatak -ls):

    $ find ~ -mtime 0 -ls

    Interval se zadaje u danima, odnosno u viekratnicima od 24 sata, pa 0 znai da nije proteklovie od 24 sata od izmjene. Ako bismo htjeli pronai datoteke izmijenjene u zadnja 3 dana,primijenili bismo sljedeu naredbu:

    $ find ~ -mtime -3

    Moe se zadati i tip datoteke, pri emu -type d oznaava da se radi o direktoriju, f oz-naava obinu datoteku, a l simboliki link. Tako bismo sve direktorije unutar /etc pronalinaredbom:

    $ find /etc -type d

    Uvjeti se mogu i kombinirati, pri emu se logiki veznik I oznaava -a, a logiki veznik is -o. Grupiranje podizraza postie se zagradama, koje meutim treba predznaiti. Primjerice,mogli bismo traiti sva kazala i datoteke vee od 1 MB:

    $ find /etc \( -type d -o -size +1M \) -ls

    Ovdje jo valja napomenuti da je esto prikladnije umjesto naredbe find koristiti naredbulocate. Ona koristi unaprijed izgraenu bazu podataka s imena datoteka, pa je pretraga zna-ajno bra i manje optereuje raunalne resurse. Baza imena datoteka mora se periodinoobnavljati, naredbom updatedb. Oblik naredbe locate je:

    locate []

    I ovdje se uzorak navodi po sintaksi koja se koriste pri irenju imena datoteka, a moe bitii regularni izraz (opcija -r). Naravno, uzorke treba navesti unutar navodnika kako ljuska nebi obavila irenje. Ukoliko elimo zanemariti razliku izmeu malih i velikih slova, navodi seopcija -i.

  • 2.6. PISANJE I POKRETANJE SKRIPTI 23

    2.6 Pisanje i pokretanje skriptiSkripte su obine tekstne datoteke, pa za njihovo upisivanje i ureivanje koristimo ureivateksta. Skriptu moemo prikazati naredbom cat ili naredbom less. Jedna jednostavna skripta,prikazana naredbom cat moe biti:

    $ cat hello.shecho "Hello world!"

    Skriptu moemo pokrenuti na nekoliko naina. Prvi je primjenom naredbe source. Navodise ime skripte, odnosno datoteke s naredbama, te se naredbe izvravaju u tekuoj okolini ljuske.Efekt je praktiki kao da unosimo naredbu po naredbu u naredbenom retku.

    $ source hello.sh

    U ljusci bash postoji i alternativni nain zapisivanja naredbe source, a to je toka. Dakle,isti efekt kao u gornjem primjeru dobivamo sljedeom naredbom (ovdje toka predstavlja na-redbu source, a ne tekue kazalo.

    $ . hello.sh

    Jo jednom, na ovaj nain skriptu izvrava ljuska iz koje smo je pokrenuli, pa i sve pro-mjene u varijablama okoline ostaju sauvane. Nasuprot tome, drugi nain pokretanja skripteje mogu tek nakon to skriptu proglasimo izvrivom primjenom naredbe chmod.

    $ chmod u+x hello.sh # skripta postaje izvriva

    Nakon toga je skriptu mogue pokrenuti kao bilo koji program (ovdje toka oznaava tekuekazalo i na taj nain se ljusci navodi put do datoteke koju treba izvriti.

    ./ hello.sh

    U ovom sluaju, pokree se podljuska u kojoj se skripta izvrava. Po zavretku izvravanjaskripte, naputa se i podljuska, pa se promjene varijabli okoline gube. Podljuska koja se po-kree je istog tipa kao i ljuska u kojoj je skripta pokrenuta, no mogue je navesti i drugu ljuskukoja e izvriti skriptu. Tonije, postoji mehanizam kojim se zadaje interpreter koji e izvritiskriptu. Kasnije emo vidjeti da to moe biti i Perl ili Python interpreter. Notacija se sastoji utome da se u prvom retku skripte navede interpreter koji e izvriti skriptu, s tim da su prvadva znaka #! (kolokvijalno se ta sekvenca naziva sha-bang).

    #!/bin/sh

    echo "Ljusku e pokrenuti ljuska sh"echo "Hello world!"

    Ulazni podaci mogu se skripti predati kao varijable ljuske ako se skripta pokree u istojljusci:

    $ a=3$ cat > ispisi.sh # ovako moemo upisati kratku skriptu

    echo $a$ source ispisi.sh3

    Meutim, ako se skripta pokree u podljusci, na raspolaganju su joj samo varijable okoline(eksportirane varijable):

  • 24 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    $ chmod u+x ispisi.sh$ ./ ispisi.sh # skripta ne vidi varijablu

    $ export a$ ./ ispisi.sh # sada je ve bolje3

    2.6.1 Argumenti naredbenog retkaKao to smo vidjeli u prethodnom odjeljku, podaci se u skriptu mogu prenijeti kroz varijableokoline. No, uobiajen nain prijenosa podataka je u obliku argumenata naredbenog retkakoji se navode iza imena skripte koja se pokree. Te smo pozicijske parametre spomenuli iu odjeljku o irenjima u naredbenom retku, a oni automatski dobijaju numerika imena kojaodgovaraju njihovim rednim brojevima. Pritom parametar $0 sadri ime skripte ako je skriptapokrenuta u podljusci, odnosno ime same ljuske ako je skripta pokrenuta naredbom source.

    $ cat parametri.sh#!/bin/bash# skripta koja ispisuje prva 3 parametra

    echo $0echo $1echo $2

    $ ./ parametri.sh par1 par2./ parametri.sh

    par1par2

    $ source parametri.sh par1 par2bashpar1par2

    Parametri s rednim brojem veim od 9 oznaavaju se vitiastim zagradama:${10}, ${11} itd.

    Naredbom shift obavlja se promjena imena pozicijskih parametara: indeksi parametarapoevi od $2 umanjuju se za 1. Ako se naredbi zada numeriki argument (shift n), oznakeargumenata umanjuju se za n, odnosno argument ${n+1} postaje $1, ${n+2} postaje postaje $2itd.

    Broj prenesenih pozicijskih parametara navedenih u naredbenom retku moe se proitatiiz varijable $#, dok se lista svih argumenata predanih skripti moe se dobiti s $@.

    $ cat parametri2.shecho "Broj parametara je: $#"echo "Parametri su: $@"echo $0; echo $1; echo $2; echo $3

    $ ./ parametri2.sh p1 p2 p3Broj parametara je: 3

    Parametri su: p1 p2 p3./ parametri2.shp1

  • 2.6. PISANJE I POKRETANJE SKRIPTI 25

    p2p3

    2.6.2 Ispitivanje uvjetaSvaka naredba (program, skripta) pri zavretku izvoenja vraa izlazni status. To je broj kojiobino oznaava je li se program uspjeno izvrio. Uobiajeno izlazni status 0 oznaava us-pjeno izvravanje, dok vrijednost razliita od 0 oznaava neuspjeno izvravanje ili pogreku.Primjerice, naredba grep e vratiti izlazni status 0 ako je traeni uzorak barem jednom prona-en, a neku drugu vrijednost ako uzorak nije pronaen ili se dogodi neka pogreka (neispravnonavedeni argumenti, neitljiva datoteka).

    Izlazni status zadnje izvedene naredbe (ili skripte) pohranjuje se u varijablu $?. Kada seizvrava ulanani niz naredbi, izlazni status vraa posljednja naredba u lancu.

    Naredba ifZa ispitivanje uvjeta i odgovarajue usmjeravanje programskog toka, koristi se naredba if.Njen najjednostavniji oblik je:

    if naredba_tthen

    blok_naredbifi

    Naredba naredba_t se izvrava, te se ispituje njen izlazni status. Ukoliko je status 0, bloknaredbi izmeu then i fi se izvrava.

    korisnik=$1 # ulazni argument je korisnicko imeif grep -q $korisnik /etc/passwd

    thenecho "Korisnik $korisnik postoji."fi

    Sloeniji oblici naredbe ifmogu ukljuivati i blok else, koji se izvrava ukoliko uvjet nijeispunjen, odnosno blok elif kojim se uvodi ispitivanje sljedeeg uvjeta.

    if naredba_1 ; thenblok_naredbi1elif naredba_2 ; then

    blok_naredbi2else

    blok_naredbi3fi

    Naredba testU naredbi if ispituje se izlazni status proizvoljne naredbe. No, kako bismo ispitali specifineuvjete, obino se koristi naredba test. Ona ispituje navedene uvjete i vraa odgovarajuiizlazni status, koji se potom moe ispitati u naredbi if. Opi oblik naredbe test je:

    test izraz

    pri emu izraz predstavlja uvjete koji se ispituju. Ako je izraz istinit, naredba test vraa iz-lazni status 0. Ako je izraz neistinit, izlazni status je razliit od 0. Primjerice, izraz za ispitivanjeznakovnih nizova moe biti:

  • 26 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    test "$name" = Vedrana

    Ovdje treba paziti da znak ispitivanja jednakosti bude odvojen od operanada, suprotno od ope-racije dodjeljivanja vrijednosti varijabli! Osim toga, dobro je varijable ljuske koje se proslje-uju kao argumenti naredbi test uokviriti dvostrukim navodnicima, jer ako je varijabla neini-cijalizirana (prazna), irenjem parametara e nestati. Navodnici e osigurati da i u tom sluajunaredba vidi argument.

    Jo jedan primjer:dan=$(date +%A)if test "$dan" = Sunday ; then

    echo "Danas je nedjelja."fi

    Naredba test podrava jo nekoliko operatora za usporedbu znakovnih nizova:string1 = string2 istinito ako su nizovi jednakistring1 != string2 istinito ako su nizovi razliitistring niz nije prazan-n string niz nije prazan (mora biti vidljiv naredbi test)-z string niz je prazan (mora biti vidljiv naredbi test)

    Nekoliko primjera:$ test "" ; echo $?1

    $ test "a" ; echo $?0

    $ test -n "a" ; echo $?0

    $ test -z "" ; echo $?0

    Naredba test ima i alternativni oblik, koji je itljiviji, pogotovo kada se koristi kao uvjet unaredbi if. Umjesto naredbe test izraz moe se napisati [ izraz ]. Pritom treba paziti dase izraz odvoji od zagrada, inae e bash prijaviti sintaksnu pogreku. U toj notaciji moemopisati:

    dan=$(date +%A)if [ "$dan" = Tuesday ] ; then

    echo "Danas je utorak."fi

    Osim znakovnih nizova, mogu se usporeivati i brojevi. Za te usporedbe koristi se posebanskup operatora:

    int1 -eq int2 istinito ako su brojevi jednakiint1 -ge int2 istinito ako je int1 >= int2

    int1 -gt int2 istinito ako je int1 > int2int1 -le int2 istinito ako je int1

  • 2.6. PISANJE I POKRETANJE SKRIPTI 27

    $ x1="005"$ [ "$x1" = 5 ] ; echo $? # usporedba nizova1

    $ [ "$x1" -eq 5 ] ; echo $? # usporedba brojeva0

    $ [ "$x1" -lt 15 ] ; echo $? # usporedba brojeva0

    Naredba testmoe se primijeniti i za ispitivanje svojstava datoteka. Primjenjuju se sljedeioperatori:

    -d file file je kazalo-e file file postoji-f file file je obina datoteka-r file itanje datoteke dozvoljeno-s file duljina datoteke vea od 0-w file dozvoljeno pisanje u datoteku-x file datoteka je izvrna-L file file je simboliki link

    Nekoliko primjera:# postoji li (obina) datoteka navedenog imena?[ -f /users/steve/phonebook ]

    # je li nam dozvoljeno itanje navedene datoteke?[ -r /users/steve/phonebook ]

    # ispitivanje je li datoteka u koju su zapisivane greke# neprazna , ispis datoteke

    if [ -s $ERRFILE ] ; thenecho "Pronadjene greske: "cat $ERRFILEfi

    Rezultat evaluacije izraza moe se negirati primjenom operatora logike negacije (!).[ ! -r /users/steve/phonebook ]

    Izrazi se mogu i kombinirati primjenom logikih operatora I (-a) i ILI (-o).[ -f "$mailfile" -a -r "$mailfile" ]

    [ -n "$mailopt" -o -r $HOME/mailfile ]

    Operator I ima prednost pred operatorom ILI, a za promjenu redoslijeda evaluacije izrazamogu se koristiti zagrade. Zagrade je potrebno predznaiti: "\(", "\)", a moraju i biti okrueneprazninama.

    [ \( "$count" -ge 0 \) -a \( "$count" -lt 10 \) ]

    2.6.3 Izlazak iz skripteSkripta zavrava kada se izvre sve njene naredbe. No, skriptu moemo zavriti i ranije, kori-tenjem naredbe exit. Ona omoguuje trenutan zavretak izvoenja skripte. Naredbi se moe

  • 28 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    zadati i argument, koji se vraa se kao izlazni status : exit n. Ako se argument ne navede,vraa se status prethodno izvedene naredbe.

    Primjenu moemo ilustrirati na jednostavnoj skripti koja na temelju proslijeenog argu-menta brie zapis u adresaru. Podaci u adresaru zapisani su u retcima tekstne datoteke, priemu se u retku pojavljuje i ime osobe na koju se podaci odnose. Skripta za brisanje zapisakao argument oekuje ime osobe iji se podaci trebaju obrisati. Kako ilustriramo primjenu na-redbe exit, zanimljiv nam je dio u kojem se provjerava broj argumenta. Ako on nije 1, ispisujese poruka i naputa skripta s izlaznim statusom 1.

    # brisanje zapisa u adresaru

    # provjera broja argumenataif [ "$#" -ne 1 ]; then

    echo "Incorrect number of arguments."echo "Usage: rem name"exit 1fi

    grep -v "$1" phonebook > /tmp/phonebookmv /tmp/phonebook phonebook

    2.6.4 Naredba caseNaredba case omoguuje usporedbu jedne vrijednosti s nizom drugih vrijednosti i izvoenjebloka naredbi koji odgovara podudaranju vrijednosti. Oblik naredbe je:

    case value inpat_1) naredba_1

    naredba_2...naredba_k ;; # PAZI! ;;pat_2) blok_naredbi_2 ;;

    ...pat_n) blok_naredbi_n ;;esac

    Ispitna vrijednost obino se ita iz varijable, a vrijednosti s kojima se ona usporeuje za-dane su u obliku uzoraka kakvi se koriste u irenju imena datoteka. U sljedeem primjeruskripta preuzima jedan argument naredbenog retka, a zatim provjerava je li to znamenka,malo ili veliko slovo ili neki drugi pojedinani znak (podsjetimo se da upitnik oznaava jedanznak). Ako niti jedno id ispitivanja nije uspjeno, ispisuje se poruka (zvjezdica se podudara sasvakim nizom).

    char=$1case "$char" in

    [0-9] ) echo "znamenka";;[a-z] ) echo "malo slovo";;[A-Z] ) echo "veliko slovo";;

    ? ) echo "specijalni znak";;* ) echo "molim upisite jedan znak";;esac

  • 2.6. PISANJE I POKRETANJE SKRIPTI 29

    2.6.5 Programske petljeLjuska bash nudi nekoliko naredbi koje slue za ostvarivanje programskih petlji.

    Naredba forTipina petlja kojom se prolazi kroz listu vrijednosti ostvaruje se naredbom for. Njen je oblik,a zadaje se varijabla petlje i lista vrijednosti koje varijabla preuzima u svakom prolasku krozpetlju:

    for var in rijec_1 rijec_2 ... rijec_ndo

    naredba_1...naredba_kdone

    Primjer petlje kojom se prolazi listu brojeva:for i in 1 2 3do

    echo $idone

    Ako je niz brojeva dulji, nezgodno ga je pisati na ovaj nain, pa se moe primijeniti izrazza generiranje sekvence. Ovdje moemo ilustrirati i kako se naredba for zapisuje u jednomretku (potrebno je umetnuti znak ; na mjesta koja odgovaraju prelasku u novi red). Naredbiecho dodat emo opciju -n koja sprjeava prelazak u novi red nakon ispisa.

    $ for i in {1..9} ; do echo -n $i; done123456789

    Za generiranje liste kroz koju naredba prolazimoemo iskoristiti raznemehanizme ljuske.Jedna od estih primjena je i iteriranje kroz listu dobivenu irenjem imena datoteka. Primje-rice, moemo ispisati listu svih datoteka iji nastavak imena je .sh

    for i in *.shdo

    echo $idone

    Moemo prolaziti i kroz listu argumenata naredbenog retka odnosno pozicijskih parame-tara.

    for arg in "$@"; do echo $arg; done

    Ovdje je zgodno napomenuti i da se ova petlja moe ak i krae napisati. Naime, naredba forpodrazumijeva upravo prolazak kroz listu argumenata, pa je ak ne treba niti napisati.

    for arg; do echo $arg; done

    Moemo iskoristiti i mehanizam zamjene naredbe, odnosno primijeniti naredbu koja egenerirati listu. Ako je lista kroz koju elimo iterirati zapisana u datoteci, moemo je iitatinaredbom cat.

    for file in $(cat lista.txt); do echo $file; done

  • 30 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    Naredba whileJo jedna uobiajena programska petlja je while. Ona se ponavlja dok god je zadani uvjetispunjen. Uvjet ima isto znaenje kao i uvjet za naredbu if, odnosno ispituje se izlazni statusneke naredbe, tipino naredbe test. Oblik naredbe je:

    while test_uvjetdo

    naredba_1...naredba_kdone

    Ponaanje naredbe moemo ilustrirati s nekoliko primjera:i=1

    while [ "$i" -le 5 ]do

    echo $ii=$((i + 1))done

    while [ -n "$1" ]do

    echo $1shiftdone

    while [ "$#" -ne 0 ]do

    echo $1shiftdone

    Naredba untilSasvim slina je i naredba until. Razlika je samo u koritenju uvjeta. Petlja se ponavlja akouvjet nije ispunjen, odnosno zaustavlja nakon to se uvjet ispuni. Oblik naredbe je:

    until test_uvjetdo

    naredba_1...naredba_kdone

    Ponaanje naredbe ilustrirajmo s nekoliko primjera:i=1

    until [ "$i" -gt 5 ]do

    echo $ii=$((i + 1))done

  • 2.6. PISANJE I POKRETANJE SKRIPTI 31

    $ cat mon# Ceka da se zadani korisnik prijavi na sustav

    if [ "$#" -ne 1 ] ; thenecho "Usage: mon user"exit 1fi

    user="$1"

    # Provjera svake minute: je li se korisnik prijavio?until who | grep "^$user " > /dev/null ; do

    sleep 60done

    # Korisnik je docekan :-)echo "$user has logged on"

    Naredba breakTrenutni izlazak iz petlje moe se inicirati naredbom break. Naredbi je mogue zadati i nume-riki argument n koji izaziva trenutan prekid izvravanja n unutranjih petlji.

    i=1while true; do

    echo $ii=$((i + 1))

    if [ "$i" -gt 20 ]; thenbreakfidone

    Naredba continueNaredba continue izaziva preskakanje svih preostalih naredbi unutar petlje i nastavlja se sasljedeim prolazom kroz petlju. Kao i kod naredbe break, mogue je zadati dodatni numerikiargument. Naredba continue n izaziva preskakanje preostalih naredbi unutar n unutranjihpetlji uz normalan nastavak izvravanja petlji.

    for file; doif [ ! -e "$file" ]; then

    echo "$file not found!"continuefi## obrada datoteke file#done

  • 32 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    2.6.6 Preusmjeravanje u petljiU odjeljku 2.2.3 upoznali smo se s preusmjeravanjem standardnog ulaza odnosno izlaza. Lju-ska bash omoguava i preusmjeravanje ulaza odnosno izlaza cijele programske petlje. Ulazpreusmjeren u petlju primjenjuje se na sve naredbe koje podatke itaju sa standardnog ulaza.Slino, izlaz preusmjeren iz petlje primjenjuje se na sve naredbe koje podatke zapisuju nastandardni izlaz. To moemo ilustrirati s nekoliko primjera.

    for i in 1 2 3 4; doecho $idone > izlaz.txt

    for i in 1 2 3 4; dohead -n 3 # cita iz "lista.txt"echo "prolaz: $i "done < lista.txt

    2.6.7 Uitavanje i ispisU ovom odjeljku upoznat emo se s naredbama koje omoguuju uitavanje sa standardnogulaza, odnosno zapisivanje na standardni izlaz.

    Uitavanje sa standardnog ulazaNaredba read koristi se za uitavanje teksta sa standardnog ulaza. Kao argumenti naredbenavodi se lista varijabli.

    read lista_varijabli

    Ljuska ita redak sa standardnog ulaza, pohranjuje prvu rije u prvu varijablu navedenu u listi,drugu rije u drugu varijablu itd.

    Ako je broj navedenih varijabli manji od broja rijei u retku, ostatak retka se pohranjuje uzadnjoj navedenoj varijabli. Primjerice,read x yuitava prvu rije u x i ostatak retka u y. esto elimo naprosto uitati cijeli redak u jednuvarijablu:

    read mojRedak

    Naredba read vraa izlazni status 0, osim kada stigne do kraja datoteke (EOF). Ako sepodaci uitavaju s terminala, za oznaavanje kraja unosa treba utipkati Ctrl+D.

    Ponaanje naredbe moemo ilustrirati primjerom u kojem se uzastopno uitavaju po dvabroja, te se ispisuje njihov zbroj.

    while read n1 n2do

    echo $((n1 + n2))done

    Malo sloeniji primjer kombinira podatke iz dvije tekstne datoteke. U jednoj se nalazespecifini podaci jedne podgrupe korisnika, primjerice bodovi studenata jedne laboratorijskegrupe. Druga datoteka sadri ope podatke svih korisnika, primjerice podatke o svim stu-dentima koji su upisali kolegij. Zapis o korisniku je pohranjen kao redak tekstne datoteke,a u obje datoteke koristi se jedinstveni identifikator korisnika sastavljen od 10 znamenaka.

  • 2.6. PISANJE I POKRETANJE SKRIPTI 33

    Skripta treba za svakog korisnika koji se pojavljuje u prvoj datoteci ispisati podatke iz drugedatoteke.

    while read Redak; dombr=$(echo $Redak|sed -r 's/.*([0 -9]{10}).*/\1/ ')

    grep $mbr svi.txt >> G3.txt || echo "-- $mbr">> G3.txtdone < "popis_G3.csv"

    Skripta uitava redak po redak prve datoteke (popis_G3.csv), koristei preusmjeravanje upetlju. Iz proitanog retka isijeca se identifikator korisnika koristei naredbu sed i regularniizraz koji nalazi 10-znamenkasti broj. Identifikator se pohranjuje u varijablu, a zatim se po-mou naredbe grep trae retci u drugoj datoteci u kojima se pojavljuje isti identifikator. Retcikoje vraa grep nadodaju se u ciljnu datoteku.

    U ovom primjeru susreemo se i s uvjetnim izvoenjem naredbi, gdje se dvije naredbe kom-biniraju logikim izrazom i druga naredba se izvrava ovisno o rezultatu prve naredbe. Ugornjem primjeru koristi se operator ILI (||), pa se druga naredba izvrava samo ako je prvazavrila s izlaznim statusom razliitim od 0. Drugim rijeima, ako grep ne pronae niti jedanredak u kojem se pojavljuje identifikator korisnika, u ciljnu datoteku zapisuje se oznaka da tajkorisnik nije pronaen.

    U izrazu za uvjetno izvravanje naredbi moe se upotrijebiti i operator I (&&). U tom sluajuse druga naredba izvrava samo ako je prva naredba uspjeno zavrila, odnosno njen izlaznistatus je 0.

    Ispis na standardni izlazZa ispis na standardni izlaz do sada smo koristili naredbu echo, koja je u veini primjenadovoljna. Meutim, ponekad je potreban formatirani ispis, koji se moe ostvariti uporabomnaredbe printf. Ona je vrlo slina istoimenoj funkciji u C-u. Kao argument naredbe najprijese navodi formatni niz, a zatim slijedi niz argumenata koji se ispisuju u skladu sa zadanimformatom.

    printf "format" arg1 arg2 ...

    Znakovi formatnog niza format, ukoliko nisu predznaeni znakom "%", prosljeuju se nastandardni izlaz. Znakovi predznaeni znakom "%" oznaavaju format u kojem se ispisujunavedeni argumenti. Znaenja nekih oznaka su:

    %d cijeli broj%u cijeli broj bez predznaka%o oktalni broj%X heksadekadski broj%c znak%s niz znakova

    Ponaanje naredbe ilustrirajmo s nekoliko primjera.$ printf "Oktalna vrijednost broja \%d je %o\n" 20 20

    Oktalna vrijednost broja 20 je 24

    $ printf "Heksadekadska vrijednost broja \%d je %X\n" 30 30

    Heksadekadska vrijednost broja 30 je 1E

    $ printf "Nepredznacena vrijednost broja \%d je %u\n" -1000 -1000

  • 34 POGLAVLJE 2. LJUSKA OPERACIJSKOG SUSTAVA

    Nepredznacena vrijednost broja -1000 \je 18446744073709550616

    while read broj1 broj2; doprintf "%12d %12d\n" $broj1 $broj2done

  • 3. Programski jezik PerlAutor programskog jezika Perl je Larry Wall, a prva verzija jezika predstavljena je 1987. go-dine. Ime jezika je akronim za Practical Extraction and Report Language, a u ali autor ga jenazvao i Pathologically Eclectic Rubbish Lister. U tom nazivu vjerojatno je nejasna sam rijeeclectic, odnosno eklektian, a ona se moe prevesti kao raznorodan odnosno sainjen od raz-liitih dijelova. Naime, kao to ete i sami primijetiti upoznajui se s jezikom, Larry Wall jeu Perl ugradio elemente iz ljuske operacijskog sustava, raznih Unix alata i C-a. Naime, on jerazvio Perl kao alat za vlastite potrebe, dok je nastojao generirati neka izvjea, a primjenaskripti u Unix ljusci i alata poput sed-a, i grep-a mu nije bila dovoljna. Pri oblikovanju novogjezika, vodio se s nekoliko tenji. elio je imati alat koji e mu omoguiti brzinu kodiranjapoput programiranja u Unix ljusci, a istovremeno pruiti mogunosti naprednijih alata kaoto su grep, sort i sed. U tom trenutku nije ni slutio da e njegov alat prerasti u planetarnopopularan programski jezik.

    Perl nastoji ispuniti prazninu izmeu programiranja niske razine (C, C++, asembler) i pro-gramiranja visoke razine (ljuska OS-a). Programiranje niske razine je relativno teko, ali bezogranienja, pa se uz dobro programiranje moe postii maksimalna brzina izvoenja na da-nom raunalu. S druge strane, programiranje visoke razine omoguuje relativno lako i brzopisanje koda, no programi su najee spori, a mogunosti su ograniene na naredbe koje sunam na raspolaganju. U Perlu je relativno lako programirati, malo je ogranienja, a izvoenjeje uglavnom brzo. Zahvaljujui svojoj snazi i fleksibilnosti, Perl se nametnuo kao jedan odnajpopularnijih programskih jezika, posebn