48
Skriptni jezici Programiranje u bash ljusci 1 Maja Štula

Programiranje u bash 1

Embed Size (px)

Citation preview

Page 1: Programiranje u bash 1

Skriptni jeziciProgramiranje u bash ljusci 1

Maja Štula

Page 2: Programiranje u bash 1

2

Pozivanje skriptebash prvaskripta

ilichmod 555 prvaskripta (1(x)+4(r)=5, 2(w))prvaskripta

ilichmod +rx prvaskriptaprvaskripta

Page 3: Programiranje u bash 1

3

Prava pristupa

Page 4: Programiranje u bash 1

4

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.

Page 5: Programiranje u bash 1

5

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)

Page 6: Programiranje u bash 1

6

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.

Page 7: Programiranje u bash 1

7

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.

Page 8: Programiranje u bash 1

8

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 programawk '{ sub("\r$", ""); print }'

windowsdatoteka > unixdatoteka

Page 9: Programiranje u bash 1

9

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 komentarcat local.profile > kopija #kopiraj local.profile

• # karakter se koristi i u različitim izrazimaecho $(( 2#101011 )) # ispis broj 101011 u

# dekadskom obliku

Page 10: Programiranje u bash 1

10

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).

Page 11: Programiranje u bash 1

11

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”iliecho “aaaaa”; echo “bbbb”

Page 12: Programiranje u bash 1

12

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’

Page 13: Programiranje u bash 1

13

Bash – specijalni karakteri• Oznaka $ koristi se za dohvaćanje vrijednosti

varijablevar=4echo $var

• Također se koristi u regularnim izrazima (regularexpression).

• $$ dohvaća vrijednost identifikatora procesa skripte u kojoj je naveden

• ps naredba izlistava trenutno aktivne procese ps –aux|more

Page 14: Programiranje u bash 1

14

Bash – specijalni karakteri

• Znaka dvotočka : je tzv. nul naredba (nullcommand) koja ništa ne radi.

• Primjer korištenja nul naredbe:if neki_uvjetthen : # Ništa se ne izvršavaelseizvrši_neku_akcijufi

• : je i separator u $PATH varijabli i nekim sistemskim datotekama (/etc/passwd).

Page 15: Programiranje u bash 1

15

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

Page 16: Programiranje u bash 1

16

• 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.

Page 17: Programiranje u bash 1

17

Bash – specijalni karakteri• Inicijalizacija elemenata niza

Niz=(element1 element2 element3)

• Vitičaste zagrade ograničavaju blok koda {}. Primjer bloka koda ili umetnute grupe (inlinegroup):

a=123{ a=321; }echo "a = $a" # a = 321

• Varijabla unutar bloka koda je vidljiva ostatku skripte.

Page 18: Programiranje u bash 1

18

• 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.

Page 19: Programiranje u bash 1

19

Page 20: Programiranje u bash 1

20

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

Page 21: Programiranje u bash 1

21

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 < datotekacat ↔ cat < datoteka

Page 22: Programiranje u bash 1

22

Svi operatori

Nakon izvršavanja naredbe1 izlaz se preusmjerava na ulaz naredbe2

naredba1|naredba2|

Standardni izlaz za greške sprema se u datoteku

naredba 2> datoteka2>

Naredba kao standardni ulaz uzima navedenu datoteku

naredba < datoteka<<0

Standardni izlaz dodaje se na kraj datoteke, a ako datoteka ne postoji kreira se.

naredba >> datoteka>>1>>

Standardni izlaz sprema se u datotekunaredba > datoteka>1>

OpisPrimjerOperator

Page 23: Programiranje u bash 1

23

Bash – specijalni karakteri - pipes

• Jedan od klasičnih mehanizama komunikacije između dva procesa (IPC - interprocesscommunication) 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).

Page 24: Programiranje u bash 1

24

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.

Page 25: Programiranje u bash 1

25

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.

Page 26: Programiranje u bash 1

26

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=aaabez razmaka bez razmaka

• U naredbi read za unos vrijednosti u varijablu preko tipkovnice

read var1• U for petlji

for var1 in 1 2 3

Page 27: Programiranje u bash 1

27

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)

Page 28: Programiranje u bash 1

28

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 (positionalparameters) 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).

Page 29: Programiranje u bash 1

29

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).

Page 30: Programiranje u bash 1

30

Izlaz iz skripte• Dohvaćanje izlaznog statusa zadnje izvedene naredbe:

echo $?

PRIMJER:#!/bin/bashecho helloecho $? # 0 jer se prethodna naredba uspješno izvršila

lskdf # Nepoznata naredbaecho $? # Različito od 0 jer se prethodna naredba nije uspješno

izvršila

echoexit 113 # Skripta vraća 113# Nakon što se izvrši skripta probati #? u komandnoj liniji

Page 31: Programiranje u bash 1

31

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 razmakomecho $?

[ 44 –lt 5 ]s razmakomecho $?

Page 32: Programiranje u bash 1

32

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 ]thenecho “4 je manje od 5”fi

Page 33: Programiranje u bash 1

33

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 if ls *.kkkthen thenecho “vratio true” echo “vratio true”fi fi

Page 34: Programiranje u bash 1

34

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")

Page 35: Programiranje u bash 1

35

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

Page 36: Programiranje u bash 1

36

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.

Page 37: Programiranje u bash 1

37

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.

Page 38: Programiranje u bash 1

38

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" ]

Page 39: Programiranje u bash 1

39

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"))

Page 40: Programiranje u bash 1

40

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 reduPrimjer: if [[ "$a" < "$b" ]]if [ "$a" \< "$b" ] # u jednostrukim zagradama treba koristiti

escape karakter \ ispred <

Page 41: Programiranje u bash 1

41

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" ]

Page 42: Programiranje u bash 1

42

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.

Page 43: Programiranje u bash 1

43

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

Page 44: Programiranje u bash 1

44

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 ]]

Page 45: Programiranje u bash 1

45

Petlje• For petlja

for arg in [list]do

naredbedone

• U svakom prolazu kroz petlju arg varijabla poprima jednu vrijednost iz liste vrijednosti.

Primjer:#!/bin/bashfor planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Plutodo

echo $planet done

Page 46: Programiranje u bash 1

46

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/bashfor ado

echo −n "$a "done

Page 47: Programiranje u bash 1

47

Petlje• While petlja

while [uvjet]do

naredbedone

• Primjer:a=1while [ "$a" −le 10 ]doecho −n "$a"let "a+=1"

done

Page 48: Programiranje u bash 1

48

Petlje• Until petlja (izvršava se za razliku od while petlje dok

uvjet nije zadovoljen)until [uvjet]do

naredbedone

• Primjer:a=1until [ "$a" -gt 10 ]doecho "$a "let "a+=1"

done