10 Komandna linija i shell skripte
Iako je Linux kao korisnički operativni sistem u zadnje vrijeme jako napredovao i gotovo sve dnevne operacije mogu se napraviti iz grafičkog okruženja, nekad je potrebno ući u komandnu liniju (drugi nazivi, mada ne potpuni sinonimi, su: Terminal, Konzola, XTerm, Shell, školjka, Ljuska, naredbena linija, naredbeni redak...).
Princip funkcioniranja komandne linije je vrlo jednostavan: imate jednu aktivnu liniju u koju upisujete naredbe. Naredbu pokrećete pritiskom na taster Enter. Kad se naredba izvrši i ispiše se rezultat (ako naredba daje kakav ispis) dana je nova aktivna linija, a stara se pomakla prema gore. Krivo napisana naredba se može korigovati s tasterima Delete i Backspace. Možda princip neodoljivo podsjeća na pisanje teksta na računaru, ali morate biti svjesni da je nemoguće mijenjati gornje neaktivne linije - samo aktivnu i to do pristiska Entera.
Program koji prevodi računaru što je korisnik unio preko naredbene linije zove se interpreter. Postoje više različitih interpretera za naredbenu liniju u Linuxu. Najpoznatiji je Bash.
U BHLD2, KDE okruženje, komandnoj liniji se pristupa iz K-menija Sistem→Konzola.
10.1 Najkorištenije Linux naredbe
Jedna naredba zaslužuje mjesto ispred svih ostalih, a to je naredba man (skraćeno od manual). Ona nam ispisuje pomoć o nekoj naredbi: opće informacije, kako je koristiti, koje argumente i parametre prima i na koji način te mnoge druge informacije. Naredbu koristimo tako da upišemo:
man neka_naredba
Kroz stranice te pomoći krećemo se s strelicama gore/dolje ili PageUp/PageDow, a izlazimo s slovom q. Svaku naredbu spomenutu u ovom tekstu možete bolje proučiti s man. Ako ne znate ime programa, možete ga potražiti uz pomoć naredbe man preko ključnih riječi vezanih uz traženi program:
man -k "copy file"
File::Copy [] (3) - Copy files or filehandles
cp [] (1) - copy files and directories
cp [] (1p) - copy files
Još neke naredbe vezane uz pomoć: apropos, help, info.
Naredbena linija pamti svaku unesenu naredbu (do nekih 500 u prošlost) pa nam je poslije omogućeno traženje prijašnjih naredbi. Strelicama gore/dolje se pomičete za jednu naredbu, stariju/noviju u toj listi (jedan klik gore nam daje zadnje unesenu naredbu).
10.2 Navigacija
Kada ste u naredbenoj liniji uvijek se nalazite na nekoj lokaciji unutar hijerarhije datotečnog sistema. U startu je to obično vaš home direktorij, skraćeno se označava s tildom ~. Da bi saznali gdje ste, odnosno koji je vaš trenutni radni direktorij, upišite pwd
pwd
/home/ubuntu
Sad možete promijeniti direktorij ili u daljnji poddirektorij ili u roditeljski direktorij sadašnjeg. Roditeljski direktorij se uvijek označava s dvije točke (..), a trenutni direktorij s jednom točkom (.). Pomjeranje u roditeljski direktorij napraviteo ovako:
cd ..
gdje je cd skraćeno od Change Directory, odnosno promijeni direktorij. Koristi se tako da se napiše cd ime_direktorija. Primjetite da naredba cd . nema previše smisla.
Da bi znali u koji poddirektorij želite ići, pozvat ćete prvo ispis svih datoteka i direktorija u trenutnom direktoriju s naredbom ls (dolazi od list).
ls
kolokvij2.jpg legenderova_transformacija.ggb zadaci.pdf Teorija
Dobro proširenje naredbe ls je ls -l - ispisuje sve isto, ali u stupcu i to s dodatnim informacijama (vremenom kreacije, dozvolama i vlasnikom). Nastavak naredbe -l zove se argument (konkretnije: zastavica). Zastavice obično omogućuju da promijenite ponašanje originalne naredbe. U ovom slučaju s -l ste zatražili detaljniji ispis liste. Običaj je kod svih programa da argumenti s jednim slovom se pozivaju s jednom crticom, a oni s više slova s dvije crtice, no ima izuzetaka, zato obavezno provjeriti man naredbe. Ukoliko pozovete više zastavica, možemo ih pisati sve zajedno, npr. umjesto ls -l -a pišemo ls -la.
Napokon smo našli ime poddirektorija u kojeg želimo ući i pišemo
cd Teorija
Prvi savjet: dovoljno je napisati samo cd T i ukoliko je to jedini direktorij koji počinje slovom T, pritisnemo taster Tab na što će nam računar nadopisati ostatak. Drugi savjet: možete napisati i cd T* u istom slučaju kao i za prvi savjet, na što će računar zamijeniti * s dostupnim nastavkom i izvršiti prvotnu naredbu. Zvjezdica (*), gdje god se u komandnoj liniji primjeni, zamjenjuje znak ili skupinu znakova, dok upitnik ? zamjenjuje tačno jedan znak. Primjer: ako imamo u direktoriju u kojem se nalazimo dva poddirektorija Kuca i Kuhar i unesete naredbu cd Ku* računalo bi ušao u oba direktorija da može (ali ne može, ući će u prvi po abecedi) jer Ku* može zamijeniti i Kuca i Kuhar. ? i * su tzv. džokeri (wildcards).
Ukoliko imate ime datoteke ili direktorija koje se sastoji od dvije ili više riječi koje su odvojene razmakom nastaje mali problem. Ako doslovno prepišete:
naredba ovo je ime datoteke
naredba će primati svaku od riječi posebno, a neće to shvatiti kao ime za jednu datoteku. U tom slučaju treba koristiti poseban znak kose crte okrenute na lijevo \ prije svakog razmaka (ukoliko želimo baš znak \, koristite ga dva puta \\). Drugi pristup je da cijelo ime stavite pod dvostruke navodnike:
naredba "ovo je ime datoteke"
Radi skraćenja unosa, naredbe ne primaju samo imena datoteka ili direktorija, već i cijele puteve do njih.
cd /var/log/mail/
gdje nas cd odmah odvodi do tog mjesta. Kao što je već u hijerarhiji spomenuto / je oznaka za korijenski direktorij, odnosno onaj koji nema svog roditelja (naredba cd .. u njemu neće nigdje dalje otići). Iz / sve počinje.
Nešto o pretrazi. Klasično traženje datoteke ili direktorija možemo pokrenuti ovako:
find /home/andy/Documents -name riječ
Drugi argument označava mjesto na kojem treba tražiti (najširi uslov u tom pogledu je dakako /). Ovu naredbu za pretragu je moguće koristiti s * i ?. Naredba which ime_programa nam otkriva gdje se izvršna datoteka tog programa i fizički nalazi.
10.3 Rad s datotekama i direktorijima
Nareba rm služi za brisanje datoteke.
rm ime_datoteke
Riječ rm dolazi od remove i trajno briše označenu datoteku. Ekvivalent za direktorije je rmdir, ali radi samo ako je direktorij potpuno prazan, u obrnutoj situaciji koristiti
rm -rf direktorij
(briši direktorij i sve u njemu rekurzivno bez pitanja "Da li želite obrisati i ovo... i ovo... i ovo?). Jako oprezno s time jer su obrisani podaci uglavnom nepovratni.
Naredba za kopiranje cp(copy):
cp /jedan/put/do/datoteka1 /gdje/cu/kopiju/smjestiti/kopija_datoteke1
(isto je i s direktorijima). Pogledaj man cp za više.
Naredba mv (move) pomiče objekt s jednog na drugo mjesto (sintaksa ista kao i kod cp).
Želimo da se jedna datoteka nalazi i na nekom drugom mjestu, ali tako da je to drugo mjesto samo putokaz (ili prečica) do originalnog mjesta:
ln -s originalni_put odredišni_put_prečaca
gdje nam -s simbolizira soft, odnosno simboličku poveznicu (više man ln).
1.3.1 Rad s tekstualnim datotekama
Ekstenzija na datoteci u Unix svijetu ne znači puno, ona služi eventualno kao pomoć čovjeku u raspoznavanju o kojoj vrsti datoteka se radi. Naredba file datoteka nam vraća točno o kojem tipu datoteke se radi, npr.
file polinomi.c
polinomi.c: ASCII C program text
Tekstualne datoteke nisu samo one s nastavkom .txt, već sve koje sadrže čitljivi tekst. Nasuprot tekstualnim, postoje i binarne datoteke (kada njih pokušate pročitati kao tekst dobijete hrpu nerazumljivih znakova.
head ime_datoteke prikazuje nekoliko prvih redova unesene datoteke
tail ime_datoteke prikazuje kraj (nekoliko završnih redova) unesene datoteke
cat ime_datoteke ispisuje cijelu datoteku na ekran (ukoliko je prevelika, prekinite ispis s ctrl+c)
more ime_datoteke prikazuje datoteku stranicu po stranicu (Razmak za prebacivanje na sljedeću)
wc ime_datoteke prikazuje dužinu teksta u linijama, riječima i slovima
sed <ime_datoteke 's/tjedan/sedmica/g' prikazuje datoteku zamijenivši riječ tjedan rječju sedmica
grep rijec ime_datoteke prikazuje sve redove datoteke u kojima se spominje data riječ
10.3.2 Osnovne operacije s komandnom linijom
exit momentalno izlazi iz komandne linije
clear očisti sav ekran i aktivni redak za upis naredbi prebaci na vrh
reset obnavlja normalno funkcionisanje komandne linije kada počne ispisivati nesuvisle znakove umjesto normalnih
10.3.3 Pozivanje sistemskih programa i naredbi
reboot restarta računar
shutdown -h now gasi računar (isto kao i poweroff)
who ispisuje tko je sve prijavljen na računar
passwd je naredba koja mijenja korisnikovu lozinku
su dolazi od Substitute User i koristi se tako da se napiše korisničko ime kao argument
su tata
Potrebno je unijeti i lozinku od tog korisnika. Za promjenu u root korisnika (administratora) pišemo su -. Pažnja: neke distribucije Linuxa, među njima i BHLD, imaju root korisnika isključenog (tada koristiti sudo - Super User DO).
sudo su
mount postavlja podatkovni medij ili diskovnu particiju (u Linuxu je to neki virtualni uređaj) na određenu lokaciju u datotečnom sistemu gdje joj je moguće pristupiti, npr. mount /dev/sda2 /media/backup - /dev/sda2 je druga particija prvog diska, a /media/backup je mjesto gdje ćemo tu particiju postaviti. U slučaju da se radi o nestandardnim ili automatski neprepoznatim tipovima uređaja treba specificirati -t vrsta (npr. -t vfat za FAT32, -t ntfs za NTFS particiju).
ps aux prikazuje spisak svih aktivnih procesa
kill 1200 Nasilno prekida proces čiji je identifikacioni broj 1200.
10.3.4 Pokretanje programa i skripti
Pod programom se ovdje misli samo na izvršnu datoteku koja pokreće cijeli željeni program (kao što su na operativnom sistemu Windows datoteke s nastavkom exe). Osim programa postoje i tzv. skripte što se odnosi (uglavnom) na tekstualne datoteke pisane u nekom od skriptnih/dinamičkih programskih jezika (python, bash, php...). Skripte pokreće interpreter (onaj koji ih interpretira) i na bazi toga izvršava odgovarajuće podprograme, za razliku od izvršnih datoteka koje su već otprije prevedene u računalu razumljiv kod pomoću prevodioca (eng. compiler).
Svaka izvršna datoteka (bilo skripta bilo program) se izvršava tako da se navede cijeli put (path) do nje, npr.
/usr/bin/whoami
ili relativan put do nje, npr. kada se nalazimo u direktoriju gdje i ta izvršna datoteka samo upišemo ./ ispred imena:
cd /usr/bin/
./whoami
Programi i skripte po načinu pokretanja se mogu podijeliti u dvije kategorije:
oni koji se nalaze u standardnim (ili nestandardnim), ali točno određenim, direktorijima za izvršne datoteke i skripte
oni koji se ne nalaze u takvih direktorijima
Svi programi i skripte koji se nalaze u prvoj kategoriji mogu se pokrenuti samo upisivanjem imena programa (bez ./ ili cijelog puta do njih), npr.
whoami
Popis svih direktorija s takvim svojstvom (da se izvršne datoteke u njima mogu pokrenuti samo imenom) se dobiva ovom naredbom:
echo $PATH
/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/sbin:/usr/sbin:/sbin
Primjetite da tekući direktorij nije uključen u PATH, za razliku od MS DOS i MS Windows. To je urađeno iz sigurnosnih razloga.
U ovom primjeru se izlistao i već gore spomenuti /usr/bin direktorij i zato je bilo moguće pokrenuti program whois samo upisivanjem njegovog imena. Također, sve gore spomenute "naredbe" su zapravo programi ili skripte koji se nalaze unutar ovih standardnih direktorija za izvršne datoteke.
Programe iz obje kategorije je moguće pokretati na prvo navedeni način, a samo one iz prve na ovaj posljednji.
Još jedna stvar je bitna kod pokretanja izvršnih datoteka, a to je dozvola za pokretanje. Svaka izvršna datoteka mora imati postavljenu dozvolu execute da bi sistem dozvolio njezino pokretanje. Datoteka ne može sama sebi postaviti tu dozvolu (očito, jer se ne može ni pokrenuti), ali to eksplicitno radi korisnik:
chmod u+x ime_izvršne_datoteke
gdje je chmod naredba koja mijenja dozvole nad datotekama i direktorijima, u+x znači da se postavi execute za vlasnika datoteke (ili samo +x za sve korisnike) tako da se datoteka može pokrenuti kao izvršna.
10.3.5 Prosljeđivanje podataka
Kompletan izlaz iz neke naredbe moguće je preusmjeriti u tekstualnu datoteku. Na primjer:
ls >spisak.txt
će napraviti datoteku spisak.txt i u nju preusmjeriti cijeli tekst koji ispisuje naredba.
Jednostruki znak > prepisuje cijeli sadržaj datoteke spisak.txt. Ako je potrebno nadovezati tekst na postojeću datoteku, koristi se dvostruki znak.
echo Potpis: direktor >>spisak.txt
Ako je izlazni tekst takav da staje u jedan red, on može postati argument neke naredbe.
Na primjer, ispis tekućeg direktorija možete dobiti kao:
echo Tekuci direktorij je pwd
U navodnicima okrenutim na desnu stranu nalazi se ime komande koja kao rezultat vraća ime direktorija. Taj podatak umjesto na ekran se ugrađuje u niz znakova argumenta naredbe echo
Ako komanda prihvata ulaz sa tastature, tada možete čitati podatke iz datoteke, npr:
fdisk <priprema.txt
U prethodnom primjeru, sve komande koje se kucaju u programu fdisk, pripremljene su u datoteci priprema.txt.
Konačno, moguće je izlaz koji proizvodi jedan program proslijediti kao ulaz u drugi program, npr:
cat imenik.txt | sort
Izlaz naredbe cat se prosljeđuje naredbi sort.
10.4 Instaliranje programa za Linux:<<BR>> 10.4.1 Paketi u deb formatu
Paketi namijenjeni za Ubuntu Linux bazirane distribucije imaju .deb nastavak. Nastojte da ako tražite odgovarajuću .deb datoteku da prvo potražite onu namijenjenu za Ubuntu 8.04, tek ako nikako nema, probajte s nekom namijenjenom za druge verzije Ubuntua ili za Debian, a ako ni to ne uspijeva, onda probajte s paketima namijenjenim za ostale Linuxe.
Paket se instalira naredbom:
sudo dpkg -i package_file.deb
Još moćnija je naredba apt-get. Ona če pronaći željeni program na Internetu, preuzeti ga, zajedno s svim potrebnim neinstaliranim paketima da bi on radio i instalirati.
Sljedeća naredba će instalirati paket
sudo apt-get install imepaketa
Paket možemo obrisati sljedećom naredbom
sudo apt-get remove imepaketa
Preuzimanje nove liste raspoloživih paketa se dobija sa:
sudo apt-get update
Ako se pojavila nova verzija operativnog sistema Ubuntu, možete nadograditi sa naredbom iza ovog pasusa. BHLD 2.0 je baziran na verziji Ubuntu 8.04. Napomena: U BHLD paketi s prijevodima na bosanski jezik su označeni da se ne nadograđuju, jer su trenutno noviji.
sudo apt-get dist-upgrade
Lista ostalih naredbi
apt-get help
Ako paket tipa deb nije rasploživ, a jeste raspoloživ tipa rpm (za Mandriva, Fedora, SUSE) ili tgz (za Slackware) sljedećom komandom možemo ga prevesti u deb.
sudo alien package_file.rpm
10.4.2 Instaliranje iz izvornog koda
BHLD je prilično kompatibilan sa Ubuntu 8.04, za koga postoji pripremljeno blizu 20000 već kompajliranih i provjerenih paketa, pa će potreba za instaliranjem iz izvornog koda biti razmjerno rijetka. Ako ipak to zatreba, potražite datoteke s ekstenzijom .tar.gz ili .tar.bz2 . Instalirajte potrebne kompajlere i biblioteke, otpakujte sa
tar -xvf program.tar.gz
a zatim pređite u direktorij gdje je izvorni kod i postupite po tekstu u datoteci README. Najčešće će to biti pokretanje naredbi
./configure
make
make install
ili (ako je u pitanju pripremljeni izvorni kod za Ubuntu/Debian)
dpkg-buildpackage
cd ..
dpkg --install ime-novokreiranog-paketa.deb
10.5 Shell programiranje
Pored interaktivnog korištenja, shell omogućuje kreiranje tzv. skripti. Skripta je obična tekstualna datoteka koja sadrži shell naredbe, koje se izvršavaju u onom redoslijedu u kome su napisane, kao da su jedna po jedna unesene s tastature. Shell skripte služe za automatizaciju čestih zadataka koji se inače ne mogu obaviti jednom prostom shell naredbom.
10.5.1 Primjer Shell skripte
Prije svega pojasnimo pojam skripte. Izvršni programi se obično dijele na kompajlirane programe (npr. u C++) i skripte, koje se interpretiraju.
Ovdje ćemo dati jedan primjer. U terminal prozoru otkucajte:
cd
što će vas vratiti u početni direktorij.
Zatim otkucajte sljedeću datoteku koristeći neki tekst editor (npr. kate) i snimite je pod nazivom kreiraj.
#!/bin/sh
# Ovo je skripta koja kreira direktorij koji je zadan
# njenim prvim argumentom, a prije toga ga brise ako
# vec postoji.
dir=$1
#Preuzmi ime direktorija
# Provjeri da li direktorij postoji
if test -e "$dir"
then
# Obrisi ga (i sve pod njim). Ako ima problema,
# javi gresku
if ! rm -rf $dir
then
echo 1>&2 Ne mogu obrisati raniju verziju $dir
exit 1
fi
fi
# Kreiraj novi direktorij.
mkdir $dir
exit
#?
Kada ste otkucali i snimili datoteku kreiraj, postavićete pravo izvršavanja nad tom datotekom za korisnika koji ju je kreirao (nas):
chmod 744 kreiraj
10.5.2 Objašnjenje skripte
Slijedi objašnjenje šta ova skripta radi. Prije svega, ovdje srećete komentare, koji u shellu počinju sa znakom "#" i protežu se sve do kraja reda. Dok komentare normalno ne kucate u interaktivnom režimu rada sa shellom (jer se oni ignoriraju), dobra je praksa uključiti komentare u skripte, kako bi ste objasnili šta ona radi.
Posebnu pažnju zavrjeđuje komentar u prvom redu, koji ima donekle specijalno značenje. Naime, ako datoteka počinje sa znakovima "#" i "!" (bez ikakvih razmaka ispred ili između tih znakova), shell i operativni sistem podrazumijevaju da je ono što slijedi u nastavku ime izvršnog programa koji igra ulogu interpetera. Pošto je naša skripta shell skripta, ovdje je navedeno /bin/sh, što je po konvenciji lokacija POSIX shella. Mogli ste napisati i /bin/bash jer su na BHLD /bin/bash i /bin/sh sinonimi.
U redu "dir=$1" vidite primjer korištenja tzv. pozicijskih parametara, gdje $n predstavlja n-ti parametar proslijeđen programu (n=1, 2, ...). Ta vrijednost se dodjeljuje promjenljivoj koja se zove dir.
Nadalje, u skripti na više mjesta se vidi upotreba kontrolne strukture if koja realizira grananje na sličan način kao i istoimena naredba u C/C++ jezicima (samo s nešto drugačijom sintaksom). Argument if je naredba koja se treba izvršiti i uslov za if je ispunjen ako ta naredba vrati izlazni status 0. Izlazni status naredbe može se negirati uz pomoć operatora "!". Tako se osmom redu testira s naredbom test da li postoji datoteka čije je ime zadato promjenljivom dir (navodnici oko $dir se navode da ne bi nedostajao argument ako bi promjenljiva dir bila prazna), a u dvanaestom redu testira se da li je naredba rm vratila grešku.
Pred kraj skripte se vidi naredba mkdir kojom se kreira direktorij sa zadanim imenom, zatim izlazak korištenjem naredbe exit te vraćanje izlaznog statusa naredbe mkdir (prethodna izvršena naredba). Ako se bilo gdje u skripti želi javiti greška, to se radi ispisom na standardni izlaz za greške (sa echo 1>&2 ...) i izlazi iz skripte naredbom exit čiji je argument izlazni status.
10.5.3 Testiranje skripte
Sada se može isprobati skriptu. Prvo otkucajte:
kreiraj
-bash: kreiraj: command not found
Ako ste dobili ovu poruku, to znači da tekući direktorij nije uključen u stazu pretraživanja programa po imenu u promjenljivoj okruženja PATH (to je najčešće i slučaj). Zato ćete nadalje pozivati skriptu po stazi. Najjednostavnije je da to uradimo sa:
$ ./kreiraj
usage: mkdir [-pv] [-m mode] directory ...
Oznaka "./kreiraj" predstavlja poziv programa koji se zove "kreiraj" u tekućem direktoriju ".". Pošto niste zadali argument, naredba mkdir unutar skripte će ispisati navedenu poruku. Zadajte sada ime direktorija kojega treba formirati:
./kreiraj ostut2
ls -lhd ostut2
drwxr-xr-x 2 st student 68B Oct 19 10:31 ostut2
Sada vidimo da je kreiran direktorij ostut2.
10.5.4 Argumenti skripte
Već ste vidjeli da u skripti sa $n možete pristupiti n-tom argumentu skripte (n>0). Zapravo, rad s argumentima uključuje sljedeće specijalne simbole:
$0 - ime skripte pod kojim je pozvana
$# - broj argumenata s kojima je skripta pozvana (>=0)
$n - n-ti pozicioni argument (n>0)
$* - svi argumenti s kojim je skripta pozvana
$@ - slično kao $*, s time da "$@" ima isti efekt kao i "$1" "$2" ...
$$ - procesni identifikator (PID) shella koji izvršava skriptu
Naredba shift pomjera argumente skripte: $1 postaje raniji $2, itd. a $# se smanjuje za jedan (naravno, ako je bilo argumenata).
10.5.5 Kontrolna struktura if
Kontrolna struktura if omogućuje izvršavanje naredbi u ovisnosti o tome da li je neki uslov zadovoljen ili ne.
if naredba
then
niz naredbi
[elif naredba
then
niz naredbi
]...
[else
niz naredbi
]
fi
pri čemu su opcioni dijelovi stavljeni u uglaste zagrade. Naredba if izvršava zadatu naredbu i ako je ona vratila izlazni status 0 (logička vrijednost "tačno") izvršava se niz naredbi iza then. Možete navesti i jednu ili više klauzula elif koje testiraju dodatne uslove ukoliko raniji testovi nisu uspjeli. Na kraju, možete dodati klauzulu else koja izvršava niz naredbi koje iza nje slijede ako su sva ispitivanja uslova u if/elif klauzulama bila neuspješna. Kontrolna struktura if se završava ključnom rječju fi. Na primjer, evo fragmenta koji će kreirati datoteku abc ako ona već ne postoji:
if test -e abc
then
echo "Datoteka abc već postoji"
else
touch abc
echo "Datoteka abc kreirana"
fi
U stvari, istu konstrukciju možete cijelu napisati u jednom redu:
if test -e abc ; then echo ... ; else touch abc ; echo ... ; fi
Primijetite da iza ključnih riječi then, else i elif ne ide separator naredbi ";". Tačka-zarez bi išla iza fi ako bi iza htjeli staviti još neku naredbu u istom redu.
10.5.6 Petlje while i until
Sa kontrolnom strukturom while možete realizirati ponavljanje niza naredbi dokle god je neki uslov zadovoljen. Opšta struktura while je:
while naredba
do
niz naredbi
done
Na primjer, sljedeći fragment čeka dok se ne obriše datoteka abc:
while test -e abc
do
sleep 2 # 'Odspavaj' dvije sekunde, pa probaj ponovo
done
Kontrolna struktura until ima isti oblik, samo uzima uslov u negativu (izvršava se sve dok uslov nije ispunjen):
until naredba
do
niz naredbi
done
10.5.7 Višestruki izbor case
Kontrolna struktura case omogućuje poređenje neke riječi i obradu pojedinih slučajeva. Opšti format je:
case riječ in
slucaj1)
lista naredbi 1
;;
slucaj2)
lista naredbi 2
;;
...
esac
Slučajevi mogu koristiti džoker-znake kao i kod ekspanzije imena datoteka i moguće je navesti više slučajeva razdvojenih uspravnom crtom. Evo jednog primjera:
case $naredba in
brisi | delete)
echo "Brisanje!"
rm abc
;;
*)
echo "Ne razumijem naredbu"
;;
esac
10.5.8 Petlja for
Često nam je potrebno da prođete kroz listu riječi i nad svakom od njih obavite neku operaciju. Upravo to radi kontrolna struktura for, čiji je osnovni oblik:
for
ime_promjenljive [in lista_riječi]
do
niz
naredbi
done
Opcioni dio in lista riječi može biti izostavljen, kada se podrazumijeva in $*. Evo jednog primjera koji ispisuje imena svih datoteka koje se završavaju na .c:
for i in
*.c
do
echo $i
done
10.5.9 Shell funkcije
Shell funkcije su analogne funkcijama drugih programskih jezika i predstavljaju grupe naredbi koje se izdvajaju u zasebnu cjelinu i mogu se izvršavati na različitim mjestima u skripti. Definicija shell funkcije ima sljedeći oblik:
ime_funkcije () {
niz naredbi koje čine
funkciju
}
Funkcije se koriste kao i sve druge naredbe i mogu im se prosljeđivati argumenti, s tim da funkcija mora biti definirana prije prvog korištenja. Unutar shell funkcija vrijede sljedeća pravila: Pozicioni argumenti $*, $@, $n (n=1, 2, ...) i $# označavaju argumente poziva i njihov broj. Funkcija može definirati lokalne promjenljive naredbom local. Funkcija se izvršava u istom shell programu. Funkcija se završava kada izvrši zadnju naredbu ili naredbu return.
Evo jednog primjera funkcije koja računa sumu prvih n prirodnih brojeva, gdje je n njen prvi argument:
suma() {
local n=$1 z=0 y=1
while test $y -le $n
do
z=$((z+y))
y=$((y+1))
done
echo $z
}
Sada možete isprobati funkciju:
suma 2
3
suma 6
21
10.5.10 Naredba test
Naredba test je interna naredba koja se često koristi za ispitivanje uslova u kontrolnim strukturama. Argumenti naredbe test određuju vrstu testa. Izlazni status je 0 ako je test uspješan, a različit od nule ako je neuspješan.
Naredba test se može i skraćeno zapisati uz pomoć uglastih zagrada. Npr. test $x -gt 2 se može zapisati kao
[ $x -gt 2 ]. Obratite pažnju na razmake kojima su uglaste zagrade odvojene od susjednih riječi. Ovo je lista svih mogućih kombinacija uslova u naredbi test.
-e f da li postoji datoteka/direktorij s imenom f
-f f da li je f obična datoteka
-d f da li je f direktorij
-r f da li skripta može čitati datoteku ili direktorij f
-w f da li skripta može pisati datoteku ili direktorij f
-x f da li skripta može izvršavati datoteku ili direktorij f
-z str da li je string str prazan
-n str da li je string str neprazan
str1 = str2 jednakost stringova str1 i str2 |
str1 != str2 različitost stringova str1 i str2 |
str1 < str2 da li je str1 ispred str2 u abecednom redu
str1 > str2 da li je str1 iza str2 u abecednom redu
n1 -eq n2 da li su n1 i n2 jednaki
n1 -ne n2 da li su n1 i n2 različiti|
n1 -lt n2 da li je n1 manji od n2 kao broj
n1 -le n2 da li je n1 manji ili jednak n2 kao broj
n1 -gt n2 da li je n1 veći n2 kao broj
n1 -ge n2 da li je n1 veći ili jednak od n2 kao broj
uslov1 -o uslov2 da li je zadovoljen bilo uslov1 bilo uslov2
uslov1 -a uslov2 testira da li je zadovoljen i uslov1 uslov2
! uslov logička negacija zadovoljenosti uslova
10.5.11 Ostale kontrolne strukture
Od ostalih kontrolnih struktura izdvajamo:
naredba1 && naredba2 - izvršava se naredba1, a naredba2 samo ako je naredba1 vratila izlazni status 0 (logička vijednost tačno)
naredba1 || naredba2 - izvršava se naredba1, a naredba2 samo ako je naredba1 vratila izlazni status različit od 0 (logička vrijednost netačno)
{ niz naredbi ; } - grupa naredbi koja se redom izvršava u tekućem shell procesu
( niz naredbi ) - grupa naredbi koja se uzvršava u novom shell procesu
