Skriptni jezici Programiranje u bash ljusci 1

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