Skriptni jezici Programiranje u bash ljusci 1 Maja Štula Pozivanje skripte bash prvaskripta ili chmod 555 prvaskripta prvaskripta (1(x)+4(r)=5, 2(w)) ili chmod +rx prvaskripta prvaskripta 2 Prava pristupa 3 VI editor • Linux dolazi sa standardnim editorom koji se naziva vi editor, koji možete koristiti za pisanje i uređivanje teksta • vi editor može biti u dva načina rada: – Način rada za unos naredbi interpretira pritisnute tipke na tipkovnici kao naredbe koje program treba izvršiti. To su naredbe za spremanje datoteke, izlazak iz programa, mijenjanje, brisanje, pretraživanje teksta i sl. – U načinu rada za unos teksta, program pritisnute tipke shvaća kao tekst koji se upisuje u otvorenu datoteku. 4 VI editor • Editor se pokreće naredbom vi i imenom datoteke bilo da otvarate postojeću datoteku za promjene ili otvarate novu datoteku • Prelazak iz jednog načina rada u drugi izvodi se pritiskom na tipku esc • Izlaz iz programa se ostvaruje kada se u načinu rada za unos naredbi ukuca naredba :q! • Ova naredba znači izlazak iz vi editora bez spremanja promjena datoteke koju su unesene na ekranu • Za pohranu unesenih promjena navodi se :wq! (opet u načinu rada za unos naredbi) 5 Format tekstualne datoteke • Format Windows i Unix tekstualnih datoteka nije identičan. • Kod Windowsa kraj svake linije (line break) je označen s dva ASCII znaka tzv. line feed (LF, \n, 10, HEX 0A) i carriage return (CR, \r, 13, HEX 0D). • Unix koristi samo line feed. • Tako neke Windows aplikacije prikazuju Unix tekstualnu datoteku bez line breaks tj. prelazaka u novi red. • I slično neki Unix programi mogu prikazati CR znak u tekstualnoj Windows datoteci (Ctrl-m - ^M ) na kraju svake linije. 6 Format tekstualne datoteke • Kada pišete skriptu na Windowsima u nekom tekstualnom editoru trebate voditi računa o tome. • Npr. Edit Plus aplikacija nudi vam mogućnost spremanja datoteke u Unix formatu. • Takvu datoteku samo pohranite na disk i nekim ftp programom prebacite na Unix računalo u ASCII formatu (ne u binarnom formatu). • Neki ftp programi vam automatski rade konverziju prilikom prebacivanja tekstualnih datoteka na različite operacijske sustave. 7 Format tekstualne datoteke • Pretvaranje Windows tekstualne datoteke u Unix tekstualnu datoteku • tr naredba (translate characters,) tr [OPTION]... SET1 [SET2] • tr omogućava brisanje ili mijenjanje karaktera u datoteci. tr –d ‘\r’ <windowsdatoteka> unixdatoteka • awk program awk '{ sub("\r$", ""); print }' windowsdatoteka > unixdatoteka 8 Bash – specijalni karakteri • Komentar započinje s znakom # • To se ne odnosi na oznaku datoteke #!/bin/bash • Komentar se može umetati i nakon naredbe # ovo je komentar cat local.profile > kopija #kopiraj local.profile • # karakter se koristi i u različitim izrazima echo $(( 2#101011 )) # ispis broj 101011 u # dekadskom obliku 9 Bash – specijalni karakteri • Točka . je također specijalni karakter • Točka na početku imena datoteke označava skriveni (hidden) file (.bash_history) . Da bi naredba ls izlistala i skrivene datoteke poziva se s opcijom –a. • Kod označavanja direktorija točka označava trenutni radni direktorij, dok dvije točke označavaju direktorij iznad trenutnog radnog direktorija (cd . – ostajete u trenutnom direktoriju, cd .. – pomičete se direktorij iznad). 10 Bash – specijalni karakteri • Kraj linije je i kraj naredbe. • Ukoliko stavljate dvije naredbe u istu liniju odvajate ih s točka-zarezom ; echo “aaaaa” echo “bbbb” ili echo “aaaaa”; echo “bbbb” 11 Bash – specijalni karakteri • echo – naredba ispisuje varijablu ili određeni izraz na standardni izlaz (stdout) – ekran. • Dvostruki i jednostruki navodnici (“ i ‘) koriste se da interpreter ne interpretira string pod navodnicima. • Jednostruki navodnici ili puni navodnici (full quoting) imaju jaču formu navođenja od dvostrukih ili djelomičnih navodnika (partial quoting). echo “aaaa” echo ‘aaaa’ 12 Bash – specijalni karakteri • Oznaka $ koristi se za dohvaćanje vrijednosti varijable var=4 echo $var • Također se koristi u regularnim izrazima (regular expression). • $$ dohvaća vrijednost identifikatora procesa skripte u kojoj je naveden • ps naredba izlistava trenutno aktivne procese ps –aux|more 13 Bash – specijalni karakteri • Znaka dvotočka : je tzv. nul naredba (null command) koja ništa ne radi. • Primjer korištenja nul naredbe: if neki_uvjet then : # Ništa se ne izvršava else izvrši_neku_akciju fi • : je i separator u $PATH varijabli i nekim sistemskim datotekama (/etc/passwd). 14 Bash – specijalni karakteri • Obične zagrade ( ) definiraju grupu naredbi za koje se pokreće zaseban proces interpretiranja (subshell). • Naredbe navedene unutar zagrada () se izvode u zasebnom procesu. • Stoga varijable koje se koriste unutar zagrada nisu vidljive u ostatku skripte. Glavni proces u kojem se interpretira skripta ne može dohvaćati varijable u procesu djetetu (child process – subshell). a=123 ( a=321; ) echo "a = $a" # a = 123 # “a” kao lokalna varijabla funkcije 15 • Ljuska može pokretati podprocese tj. procese djecu. • Kada jedan proces pokreće drugi proces to se naziva “Spawning a process”. • Originalni proces se naziva proces roditelj, dok se pokrenuti proces naziva proces dijete. • Proces dijete nasljeđuje prava od procesa roditelja (pravo pristup datotekama i prava izvođenja). • Proces dijete kao PPID (Parent Process ID – PPID) ima PID (process identificator) od procesa roditelja. 16 Bash – specijalni karakteri • Inicijalizacija elemenata niza Niz=(element1 element2 element3) • Vitičaste zagrade ograničavaju blok koda {}. Primjer bloka koda ili umetnute grupe (inline group): a=123 { a=321; } echo "a = $a" # a = 321 • Varijabla unutar bloka koda je vidljiva ostatku skripte. 17 • Uobičajeno je da svaki proces (ili program) kada se pokrene dobije tri toka (stream) ili tri deskriptora datoteke (file descriptor – FD). • Jedan tok služi za unos podataka (FD – 0), jedan služi za izlaz podataka iz programa (FD – 1) i jedan služi ispis poruka greški (FD – 2) (error messages). • Obično su sva tri toka vezana uz korisnički terminal tj. tipkovnicu za standardni ulaz i ekran za standardni izlaz i grešku, ali može ih se preusmjeriti i na druge uređaje. • Kraće standardni ulaz se označava stdin, standardni izlaz stdout i standardna greška stderr. 18 19 Bash – specijalni karakteri - redirekcija • Karakteri >, &>, >&, >>, < služe za preusmjeravanje tj. redirekciju (redirection) toka. • Redirekcija izlaza is skripte s ekrana u datoteku: skripta > datoteka • Izlaz iz skripte (npr. echo naredba) se zapisuje u datoteku tj. preusmjerava se sa standardnog izlaza, ekrana u datoteku. Ukoliko postoji datoteka istog imena biti će prebrisana. • Preusmjerava izlaz naredbe sa standardnog izlaza (stdout) naredbe u datoteku. naredba > datoteka 20 Bash – specijalni karakteri - redirekcija • Preusmjerava izlaz sa standardnog izlaza naredbe na standardnu grešku. naredba >& 2 • Dodaje izlaz iz skripte u datoteku. Ukoliko datoteka istog imena ne postoji biti će kreirana. skripta >> datoteka • Preusmjerava ulaza sa standardnog na datoteku. Ulaz naredbi sada nije stdin nego datoteka. naredba < datoteka cat ↔ cat < datoteka 21 Svi operatori Operator Primjer Opis > 1> naredba > datoteka Standardni izlaz sprema se u datoteku >> 1>> naredba >> datoteka Standardni izlaz dodaje se na kraj datoteke, a ako datoteka ne postoji kreira se. < <0 naredba < datoteka Naredba kao standardni ulaz uzima navedenu datoteku 2> naredba 2> datoteka Standardni izlaz za greške sprema se u datoteku | naredba1|naredba2 Nakon izvršavanja naredbe1 izlaz se preusmjerava na ulaz naredbe2 22 Bash – specijalni karakteri - pipes • Jedan od klasičnih mehanizama komunikacije između dva procesa (IPC - interprocess communication) na Unix-u je tzv. cijev (pipe). • Karakter | (AltGr+W) usmjerava standardni izlaz iz jednog procesa u standardni ulaz drugog procesa tj. kreira cijev od jednog procesa do drugog. • Omogućava jednosmjernu komunikaciju između dva procesa (half-duplex). 23 Bash – specijalni karakteri - pipes • Naredbe se kombiniraju sekvencijalno pa je izlaz jedne naredbe ulaz druge. • Može ih se kombinirati i više od dvije naredbe i tako kreirati cjevovod (pipeline). • Cijev se pokreće kao proces dijete pa ne može mijenjati varijable u skriptama povezanim preko cijevi. 24 Varijable • • • • Nema strogog definiranja tipa varijable. Tip varijable određuje se prema sadržaju. Sve varijable su ustvari stringovi. Stringovi koji sadržavaju samo znamenke interpretiraju se kao numeričke varijable. • Sadržaj varijable imena var1 dohvaća se sa $var1. • Oznaka $ ispred imena varijable referencira vrijednost sadržanu u varijabli. 25 Varijable • Bez prefiksa $ varijabla se navodi prilikom deklaracije i pridruživanja vrijednosti ili prilikom poziva unset i export naredbe. • Pridruživanje vrijednosti korištenjem operatora pridruživanja var1=aaa ili let var1=aaa bez razmaka bez razmaka • U naredbi read za unos vrijednosti u varijablu preko tipkovnice read var1 • U for petlji for var1 in 1 2 3 26 Varijable • $var1 ↔ ${var1} • var1=4 • echo “$var1” • echo ‘$var1’ • var1=`ls –al` rezultat izvršavanja naredbe se sprema u varijablu var1 (` ` specijalni karakter koji omogućava spremanje rezultata naredbe u varijablu) • ili var1=$(ls –al) 27 Varijable • Okolinske varijable (environmental variables) su sistemske varijable koje proces koji se izvodi u određenoj okolini može dohvaćati. • Svaki proces se izvodi u određenoj okolini. • Naredbom env možete dohvatiti okolinske varijable ljuske. • Varijable koje se skripti predaju kao argumenti preko komandne linije zovu se pozicijski parametri (positional parameters) i označavaju se s $0, $1, .. • $0 sadržava ime pozvane skripte. • $# sadržava ukupni broj parametara skripte, a $* ili $@ sadrži sve parametre (navodi se unutar “$*” navodnika). 28 Izlaz iz skripte • Exit naredba prekida izvođenje skripte, a naredbom se može vratiti i tzv. izlazna vrijednost procesu roditelju. • Svaka naredba ljuske vraća izlazni status (exit status) ili povratnu vrijednost. • Uobičajeno je da 0 označava uspješno izvršenu naredbu, a vrijednost različita od 0 označava neku grešku. • Ukoliko u skripti nema poziva exit naredbe izlazni status određuje zadnja naredba u skripti. • Naredba u formi exit nnn vrati će nnn izlazni status ljuski (nnn mora biti broj od 0 do 255). 29 Izlaz iz skripte • Dohvaćanje izlaznog statusa zadnje izvedene naredbe: echo $? PRIMJER: #!/bin/bash echo hello echo $? lskdf echo $? izvršila # 0 jer se prethodna naredba uspješno izvršila # Nepoznata naredba # Različito od 0 jer se prethodna naredba nije uspješno echo exit 113 # Skripta vraća 113 # Nakon što se izvrši skripta probati #? u komandnoj liniji 30 Uvjeti i testiranje uvjeta • Uglata zagrada [ je specijalni karakter kojim se označava izraz usporedbe i izlazni status odgovara rezultatu usporedbe (0 ukoliko je izraz istinit, a 1 ukoliko izraz nije istinit) • Primjer: [ 4 –lt 5 ] s razmakom echo $? [ 44 –lt 5 ] s razmakom echo $? 31 Uvjeti i testiranje uvjeta • Od verzije Bash-a 2.02 uvedena je proširena test naredba (extended test command) sa dvije uglate zagrade [[ izraz ]]. • Znakovi [ i [[ nisu naredbe nego ključne riječi. • Još jedan način testiranja uvjeta je korištenje if/then naredbe . S time da uvjet ne mora biti samo izraz uspoređivanja i testiranja nego može biti i nešto drugo. Kako se provjera istinitost određenih uvjeta treba provjeriti na pojedinačnim primjerima. • Primjer: if [ 4 –lt 5 ] then echo “4 je manje od 5” fi 32 Uvjeti i testiranje uvjeta • Uvjet ne mora biti samo izraz uspoređivanja može biti kao u slijedećem primjeru naredba koja se poziva. • Primjer: if ls then echo “vratio true” fi if ls *.kkk then echo “vratio true” fi 33 Uvjeti i testiranje uvjeta • Dvostruke zagrade (( ... )) i let naredba također vraćaju izlazni status 0 ukoliko se aritmetički izraz koji se ispituje može promatrati kao vrijednost različita od 0. • Tako se mogu koristiti za testiranje aritmetičkih usporedbi. • PRIMJER: let "1<2" vraća 0 (jer se "1<2" proširuje na "1") let "3<2" vraća 1 (jer se "3<2" proširuje na "0") (( 0 && 1 )) vraća 1 (jer se "0 && 1" proširuje na "0") (( 4 && 1 )) vraća 0 (jer se "4 && 1" proširuje na "1") 34 Uvjeti i testiranje uvjeta • Else if / elif • elif je skraćeni izraz za else if. Omogućava slaganje više uvjeta. • PRIMJER: if [ -e *.g ] then echo “Postoje datoteke s ekstenzijom .g” elif [ -e *.c ] # ili else if [ -e *.c] then echo “Postoje datoteke s ekstenzijom .c” else echo “Ne postoje datoteke s ekstenzijom .g i .c” fi 35 Operatori za testiranje datoteka −e – testira da li datoteka postoji. Ukoliko postoji datoteka navedenog imena u tekućem direktoriju (direktoriju u kojem se izvodi skripta) vraća true (0) , ako ne postoji vraća false (1) −f – testira da li je promatrana datoteka regularna (regular file) (obična datoteka, a ne direktorij ili uređaj). Ukoliko se radi o običnoj datoteci povratna vrijednost je true (0). −s – testira da li je promatrana datoteka veća od nule. Ukoliko je veličina datoteke veća od nule vraća true (0). Inače vraća false (1). −d – testira da li je promatrana datoteka direktorij. Ukoliko je vraća 0. −b – testira da li je promatrana datoteka tzv. blok uređaj (block device) kao što je disk, cdrom, floppy i sl. Ukoliko je vraća 0. 36 Operatori za testiranje datoteka −c – testira da li je promatrana datoteka tzv. karakter uređaj (character device) kao što je tipkovnica, modem i sl. Ukoliko je vraća 0. −r – testira da li promatrana datoteka ima postavljena prava za čitanje za korisnika koji provodi test. Ukoliko ima vraća 0. −w – testira da li promatrana datoteka ima postavljena prava za pisanje za korisnika koji provodi test. Ukoliko ima vraća 0. −x – testira da li promatrana datoteka ima postavljena prava za izvođenje za korisnika koji provodi test. Ukoliko ima vraća 0. f1 −nt f2 – testira da li je datoteka f1 novija od datoteke f2. Ukoliko je vraća 0. f1 −ot f2 – testira da li je datoteka f1 starija od datoteke f2. Ukoliko je vraća 0. 37 Cjelobrojni i string operatori usporedbe • Operatori za testiranje cijelih brojeva −eq – operator za testiranje jednakosti dvije cjelobrojne (integer) vrijednosti . Vraća true (0) ukoliko su vrijednosti s lijeve i desne strane operatora jednake. Primjer: if [ "$a" −eq "$b" ], if [ 4 –eq 4 ], if [ $a −eq $b ] −ne – operator za testiranje nejednakosti dvije cjelobrojne (integer) vrijednosti . Vraća true (0) ukoliko vrijednosti s lijeve i desne strane operatora nisu jednake. Primjer: if [ "$a" −ne "$b" ] , if [ 4 –ne 5 ], if [ $a −ne $b ] −gt – ukoliko je vrijednost s lijeve strane operatora veća vraća 0. Primjer: if [ "$a" −gt "$b" ], if [ 5 –gt 4 ], if [ $a −gt $b ] −ge – ukoliko je vrijednost s lijeve strane operatora veća ili jednaka vraća 0. Primjer: if [ "$a" −ge "$b" ] 38 Cjelobrojni i string operatori usporedbe −lt – ukoliko je vrijednost s lijeve strane operatora manja vraća 0. Primjer: if [ "$a" −lt "$b" ] −le – ukoliko je vrijednost s lijeve strane operatora manja ili jednaka vraća 0. Primjer: if [ "$a" −le "$b" ] < – ukoliko je vrijednost s lijeve strane operatora manja, ali operacija mora biti navedena unutar dvostrukih zagrada Primjer: (("$a" < "$b")), (($a < $b)) <= – ukoliko je vrijednost s lijeve strane operatora manja ili jednaka, ali operacija mora biti navedena unutar dvostrukih zagrada Primjer: (("$a" <= "$b")) > – ukoliko je vrijednost s lijeve strane operatora veća, ali operacija mora biti navedena unutar dvostrukih zagrada Primjer: (("$a" > "$b")) >= – ukoliko je vrijednost s lijeve strane operatora manja ili jednaka, ali operacija mora biti navedena unutar dvostrukih zagrada Primjer: (("$a" >= "$b")) 39 Cjelobrojni i string operatori usporedbe • Operatori za testiranje stringova = – ukoliko su string s lijeve i desne strane operatora isti, vraća true. Primjer: if [ "$a" = "$b" ], if [ $a = $b ] == – ukoliko su string s lijeve i desne strane operatora isti, vraća true. Primjer: if [ "$a" == "$b" ] != – ukoliko su string s lijeve i desne strane operatora različiti, vraća true. Primjer: if [ "$a" != "$b" ] < – uspoređivanje stringova prema ASCII abecednom redu Primjer: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] # u jednostrukim zagradama treba koristiti escape karakter \ ispred < 40 Cjelobrojni i string operatori usporedbe > – uspoređivanje stringova prema ASCII abecednom redu Primjer: if [[ "$a" > "$b" ]] if [ "$a" \> "$b" ] # u jednostrukim zagradama treba koristiti escape karakter \ ispred < −z – operator vraća true ukoliko je string prazan, odnosno duljine nula −n – operator vraća true ukoliko string nije prazan, odnosno duljine nula Zadnja dva operatora zahtijevaju da se testirani stringovi navode sa navodnicima. Primjer: Testiranje praznog stringa bez navodnika neće dati ispravan rezultat [ -n "$string1" ] 41 Ostali operatori = - operator pridruživanja (assigment operator) • Aritmetički operatori: +, −, *, /, ** (eksponent), % (modulo) += let "var += 5" sadržaj var se uveća z 5. −= let "var -= 5" sadržaj var se umanji z 5. *= let "var *= 5" sadržaj var se pomnoži s 5. /= let "var /= 5" sadržaj var se podijeli s 5. %= let "var /= 5" sadržaj var je ostatak dijeljenja varijable s 5. 42 Ostali operatori • Bit operatori: << - pomak ulijevo. Primjer: let var=“var<<2” <<= - pomak ulijevo i spremanje u varijablu. Primjer: let "var <<= 2" >> - pomak udesno. Primjer: let var=“var>>2” >>= - pomak udesno i spremanje u varijablu. Primjer: let "var >>= 2" & - operator AND na razini bita | - operator OR na razini bita ! – operator NOT ^ - XOR 43 Ostali operatori • Logički operatori: && ili –a - logički AND. Primjeri: if [ $uvjet1 ] && [ $uvjet2 ] if [ $uvjet1 −a $uvjet2 ] if [[ $uvjet1 && $uvjet2 ]] || ili –o - logički OR. Primjeri: if [ $uvjet1 ] || [ $uvjet2 ] if [ $uvjet1 −o $uvjet2 ] if [[ $uvjet1 || $uvjet2 ]] 44 Petlje • For petlja for arg in [list] do naredbe done • U svakom prolazu kroz petlju arg varijabla poprima jednu vrijednost iz liste vrijednosti. Primjer: #!/bin/bash for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto do echo $planet done 45 Petlje • Ukoliko su u for petlji ne navede in [list] dio kao lista vrijednosti uzima se $@ odnosno lista argumenata koji se predaju skripti preko komandne linije. • Primjer: #! /bin/bash for a do echo −n "$a " done 46 Petlje • While petlja while [uvjet] do naredbe done • Primjer: a=1 while [ "$a" −le 10 ] do echo −n "$a" let "a+=1" done 47 Petlje • Until petlja (izvršava se za razliku od while petlje dok uvjet nije zadovoljen) until [uvjet] do naredbe done • Primjer: a=1 until [ "$a" -gt 10 ] do echo "$a " let "a+=1" done 48
© Copyright 2024 Paperzz