Nakon interpretacije komandne linije shell inicira izvršenje zadate komande. Ukoliko komanda nije interna (ugrađena u shell, poput komande cd) shell traži izvršni fajl koji odgovara imenu komande u direktorijumima navedenim u sistemskoj putanji (koja se može dobiti komandom echo $PATH). Nakon toga shell pokreće program i prosleđuje mu argumente i opcije navedene u komandnoj liniji. Napomena: Ukoliko se izvršni fajl nalazi u tekućem direktorijumu ili u nekom direktorijumu koji nije u sistemskoj putanji ($PATH), ime komande se mora zadati sa putanjom. Slede i primeri koji ilustruju pokretanje programa koji se nalaze u tekućem direktorijumu i direktorijumu /usr/sbin:
Rad sa skriptovima se svodi na 3 koraka, i to:
Pitanje: Kojim korisničkim kategorijama je data dozvola x?
Skript briše ekran (komanda clear), a zatim na ekranu ispisuje poruku Hello, World! Sav tekst u liniji iza znaka # se smatra komentarom.
Pitanje: Kako izbeći ./ ?
Prilikom pokretanja skripta može se specificirati komandni interpreter u kome će se program izvršavati. Potrebno je u prvu liniju skripta upisati sledeće:
Ukoliko se komandni interpreter ne specificira na ovaj način, program se izvršava u tekućem interpreteru. Skript se može pokrenuti i na drugi način, bez eksplicitne dodele x dozvole - dovoljno je pozvati komandni interpreter da izvrši shell program:
ili
Ukoliko se shell program ne nalazi u tekućem direktorijumu, potrebno je specificirati putanju do programa.
Za razvoj i korišćenje shell skriptova preporučuje se sledeća procedura:
Program se može kopirati u bin poddirektorijum home direktorijuma autora. Ukoliko veći broj korisnika želi da koristi program datoteku treba kopirati u direktorijume /bin ili /usr/bin ili /usr/local/bin kojima mogu pristupati svi korisnici. Dodatno, korisnicima treba dati dozvolu execute da bi mogli da pokreću program pomoću imena datoteke.
Komande koje se mogu zadavati u skriptovima su:
Awk je, u stvari, jednostavan programski jezik namenjen procesiranju teksta, tj. transformisanju teksta u formatirani output. Awk uzima sva ulaza:
Prvi primer je:
Rezultat izvršenja je nešto kao:
U gornjem primeru AWK ne procesira nikakve podatke, već prosto čita sadržaj /etc/passwd fajla i štampa nefilterisan izlaz na stdout, isto kao cat komanda. Kada se pozove AWK, opskrbljen je sa dve informacije, a to je komanda za editovanje i podaci za editovanje. Dakle, u primeru je /etc/passwd reprezent ulaznih podataka, a komanda za uređivanje prosto štampa ($0 je oznaka za celu liniju teksta) fajl u istom redosledu.
Prava primena AWK-a leži u odvajanju traženih delova iz većeg skupa podataka. Na primer, iz fajla /etc/passwd može se dobiti daleko čitljiviji izlaz:
Razultat bi bio nešto kao:
Podrazumevano, AWK koristi blanko za separator ulaznih podataka, ali se ovo ponašanje može promeniti opcijom -F. Ovde je kao separator iskorišćen karakter “:”. $1 sadrži tekst do prvog separatora, $2 tekst do drugog separatora itd. $0 je uvek cela linija.
AWK komanda za editovanje se uvek sastoji iz dva dela:
Šabloni se upoređuju sa linijama u fajlu, a ako šablon nije naveden, kao u gornjem primeru, sve linije dolaze u obzir.
Šabloni u AWK-u sastoje se od teksta i jednog ili više regularnih izraza između karaktera “/” (slash). Na primer:
Sledeća komanda:
kao što se vidi, u obzir uzima samo linije sa početnim karakterom “m”.
Uobičajene komande AWK-a su =, print, printf, if, while, i for. Ove instrukcije se ponašaju kao odgovarajuće instukcije bilo kog programskog jezika, omogućavajući dodelu vrednosti varijablama, štampanje izlaza i kontrolu toka.
AWK komande koje se navode u komandnoj liniji mogu se snimiti i u fajl, na primer:
Pošto je AWK strukturirani jezik, fajl mora da sadrži određene blokove, i to:
FS (field separator) je jedna od nekoliko specijalnih varijabli AWK-a. Još neke su:
Primer 1.
U ovom slučaj awk traži uzorak ‘abc’ u datoteci /tmp/data, a akcija koja se pri tom obavlja nad nađenim uzorcima je prikazivanje teksta na ekranu (print).
Primer 2.
Drugi primer je štampanje broja linija koje sadrže string “abc”.
Ukoliko se u datoteci traži više uzoraka i ukoliko se vrši više obrada, potrebno je prvo napraviti datoteku u kojoj su opisane akcije (na primer actionfile.awk). Prilikom zadavanja komande awk potrebno je zameniti tekst između navodnika, kojim su opisani uzorak i akcija, imenom datoteke: ‘-f actionfile.awk’.
Komanda expr određuje rezultat neke matematičke operacije. Sintaksa komande expr je:
gde su op1 i op2 celi brojevi, a operator +, -, *, /, &. Rezultat operacije je ceo broj. Argumenti op1, op2 i operator se moraju razdvojiti praznim karakterom.
Ove promenljive su rezervisane za specifične funkcije. Na primer, karakter $ reprezentuje proces ID (PID) tekućeg shell-a. Ako se ukuca
u shell promptu, dobiće se izlazni status poslednje komande.
Specijalne promenljive koje mogu da se koriste u bash skriptama.
Promenljiva | Funkcija |
---|---|
? | Izlazni status prethodne komande |
$ | PID tekućeg shell procesa |
- | Opcije sa kojima je pozvan aktuelni shell |
! | PID poslednje komande koja radi u pozadini |
0 | ime fajla tekućeg skripta |
1-9 | argumenti komandne linije dati tekućem skriptu $1 je prvi argument $9 deveti |
_ | poslednji argument dat prethodno pozvanoj komandi |
Komanda read se koristi za čitanje ulaznih podataka sa tastature i memorisanje unete vrednosti u promenljivu. Sintaksa komande je:
Primer.
Pokretanje:
Nakon izvršenja Linux komande vraćaju vrednost na osnovu koje se može odrediti da li je komanda izvršena uspešno ili ne. Ako je povratna vrednost 0, komanda je izvršena uspešno. Ako je povratna vrednost različita od 0 (veća od 0), komanda se nije uspešno završila, a taj broj predstavlja neku vrstu dijagnostičkog statusa koja se naziva izlazni status.
Komanda može biti zadata bez parametara (npr. date, clear, who), kao i sa jednim ili više parametara (ls -l, ls -l /etc, mount -t ntfs /dev/hda1 /mnt/winc).
Promenljiva $# memoriše broj argumenata specifirane komandne linije, a $* ili $@ upućuju na sve argumente koji se prosleđuju shell programu.
Komandni argumenti se na isti način mogu zadati i shell script-u.
Na primer:
Argumente ovako pozvanog script-a se može pamte sledeće promenljive:
$1,$2...$9
- arg1 arg2 arg3.Primer.
ime programa $0 | broj argumenata $# | $1 | $2 | $3 |
---|---|---|---|---|
df | 0 | |||
less | 1 | /etc/passwd | ||
ls | 2 | -l | /etc | |
mount | 3 | -r | /dev/hda2 | /mnt/winc |
Primer.
Pokretanje:
Rad sa promenljivama je koristan, ali mora se proširiti odgovarajućom kontrolom toka u vidu petlji i uslova kako bi se dobio zaista koristan skript koji nešto radi. Uobičajene su dve vrste kontrole toka:
U opštem slučaju, if-then konstrukcija izgleda ovako:
OBRATITI PAŽNJU NA RAZMAKE I NOVE REDOVE! If-then blok se završava naredbom fi (obrnuto od if).
Primer.
Više uslova može se dodati korišćenjem klauzule else:
Primer.
Takođe, prisutna je i klauzula elif:
Instrukcija elif može biti proizvoljno mnogo, što je posebno zgodno kod npr. ispitivanja poslatih argumenata komandne linije. Evo još nekih primera korišćenja if klauzule u ugnežđenom obliku i složenih uslova dobijenih logičkim operatorima:
Multiple Conditions:
Ili isto to, ali jednostavnije, korišćenjem logičkih operatora:
Isto kao u C-u, postoji i logički operator “||”:
što je ekvivalentno sledećem:
Komanda test se koristi za evaluaciju uslova. Naime, primećuje se da svi navedeni primeri uslova uključuju uglaste zagrade oko uslova koji se izračunava. Uglaste zagrade su praktično ekvivalentne komandi test. Na primer, uslov iz prethodnog skripta bi mogao da glasi i ovako:
Ovaj koncept je važan iz razloga što se veliki broj opcija komande test može iskoristiti za testiranje različitih uslova. Na primer, provera da li neki fajl postoji na fajl sistemu:
što je isto što i
U slučaju da fajl postoji , vraća se true, tj. izlazni status 0, a ako ne postoji vraća se false, tj. 1. Sledeća tabela daje pregled najkorišćenijih opcija test komande:
Opcija | Uslov |
---|---|
-d | Specificirani fajl postoji i u pitanju je direktorijum |
-e | Specificirani fajl postoji |
-f | Fajl postoji i u pitanju je regularni fajl (a ne direktorijum ili drugi specijalni fajl) |
-G | Fajl postoji i vlasništvo je efektivnog GID-a |
-nt | Fajl je noviji od drugog navedenog fajla (sintaksa je file1 -nt file2). |
-ot | Fajl je stariji od drugog navedenog fajla (sintaksa je file1 -nt file2). |
-O | Korisnik koji izvršava komandu je vlasnik fajla |
-r | Korisnik koji izvršava komandu ima dozvolu čitanja nad fajlom |
-s | Fajl postoji i nije prazan |
-w | Korisnik koji izvršava komandu ima dozvolu pisanja |
-x | Korisnik koji izvršava komandu ima dozvolu izvršavanja |
Sa svim ovim opcijama, komanda će vratiti ili true ili false.
Operatori poređenja rade isto kao i u bazičnoj aritmetici. Stringovi se takođe mogu porediti, standardno u abecednom redosledu.
Opšti format case komande je:
Treba primetiti da se svaka sekcija zaključuje duplim znakom “;”. Case izrazi su odlični za razvrstavanje argumenata komandne linije. Sledeći skrip je uzet samo kao primer, a služi za kontrolu NFS (Network File System) servisa.
Ponaša se isto kao u jeziku C:
Razlikuje se od while petlje samo po uslovu. Prethodni primer bi mogao da se napiše i ovako:
Sintaksa for petlje ne liči mnogo na sintaksu C jezika:
Promenljiva name dobija vrednost tekućeg člana liste word. Ako se “in words” izostavi u naredbi select, ili ako se specificira ‘in “$@”’, tada će name uzimati vrednost pozicionih parametara. Izlazni status for petlje jednak je izlaznom statusu zadnje izvršene komande u grupi commands. Ako je lista words prazna nijedna komanda se neće izvršiti i tada će izlazni status biti 0.
For petlja najpre kreira promenljivu i, a zatim joj redom dodeljuje vrednosti iz liste (u ovom slučaju numeričke vrednosti od 1 do 10). Shell izvršava echo naredbu za svaku vrednost promenljive i.
Select naredba služi za prikaz menija čije su stavke definisane u words i prihvatanje izbora od korisnika.
Lista reči se proširuje generišući listu stavki (item). Skup proširenih reči prikazuje se na standardnom izlazu za greške, pri čemu svakoj prethodi redni broj. Ako se ‘in words’ izostavi u naredbi select, ili ako se specificira ‘in “$@”’, tada se prikazuju pozicioni parametri. U slučaju ‘in “$@”’ PS3 prompt se prikazuje i linije se čitaju sa standardnog ulaza. Ako se linija sastoji od broja koji odgovara jednoj od prikazanih reči tada se vrednost promenljive name postavlja u tu reč. Ukoliko je linija prazna reč i prompt se prikazuju ponovo. Ako se pročita EOF select komanda završava rad. Svaka druga pročitana vrednost uzrokuje da promenljiva name bude postavljena na nulu. Pročitana linija se čuva u promenljivoj REPLY.
Komande se izvršavaju posle svake selekcije sve dok se ne izvrši break komanda, čime se komanda select završava.
Primer ilustruje upotrebu naredbe select: program dozvoljava korisniku da sa tekućeg direktorijuma izabere datoteku čije će ime i indeks nakon toga biti prikazani.
Sledeći primer ilustruje kreiranje prostog menija:
Svaki put kada se otvori shell, Unix otvara tri fajla koja program koristi:
Bažno je zapamtiti da se podrazumevano ulaz uzima sa tastature i štampa na ekran. Evo ponovljenog skupa operatora za redirekciju:
Operator | Akcija |
---|---|
> | Redirektuje STDOUT u fajl |
< | Redirektuje STDIN iz fajla |
» | Dodaje STDOUT fajlu |
| | Uzima izlaz iz jednog programa i šalje kao ulaz drugom |
« graničnik | Pridružuje tekući ulazni tok STDIN-u dok se ne dostigne odgovarajući graničnik |
Primeri.
STDOUT se upisuje u fajl fileList.
STDOUT se dodaje u fajl fileList.
Pipeline koji broji reči u izlazu komande ls.
Gornji primer koristi poslednji navedeni operator redirekcije ulaza sa graničnikom. Sve dok se ne unese reč KRAJ, vrši se redirekcija iz STDIN. Komanda cat zatim štampa uneti sadržaj.
Korišćenje >& znači da se se i STDOUT i STDERR usmeravaju u navedeni fajl.
Standardni ulaz (STDIN), standardni izlaz (STDOUT) i standardni izlaz za greške (STDERR) su deskriptori datoteke kojima su dodeljeni brojevi po sledećim pravilima:
Još primera redirekcije:
Sledeći primer demonstrira kreiranje datoteke greperr.txt i upis poruka o greškama koje proizvodi komanda grep u datoteku:
Redirekcija STDERR u STDOUT je demonstrirana sledećim primerom. Rezultat izvršenja komande grep smešta se u fajl i može se naknadno videti, a poruke o greškama koje komanda grep proizvodi prikazuju se na standardnom izlazu, a to je u podrazumevanom stanju ekran;
Ova vrsta redirekcije je korisna za programe koji rade u pozadini, tako da se od njih očekuje da poruke ne upisuju na ekran, već u neku datoteku. Dodatno, ukoliko korisnik ne želi da vidi “feedback”komande, izlaz i poruke o greškama mogu se preusmeriti na uređaj /dev/null, kao u sledećem primerom: