LAKI PINGVINI<>
112011<><>

Bash za početnike (3)

for, if then else, case, while, until

Naučite da koristite naredbe uslova i petlje

Već smo naučili kako se barata datotekama i direktorijumima, a sada ćemo videti osnovnu upotrebu naredbi uslova i petlji. To predstavlja jedan od glavnih delova veštačke inteligencije, kako bi ona prevazilazila jednostavan uslov, zbog kojeg se muž iz radnje vraća sa deset hlebova jer mu je žena rekla: „Kupi hleb. Ako imaju jaja, uzmi deset”. (hint: hleb nije uslov, uslov su jaja).

Promenljive i reč-dve o njima

Pre nego što pređemo na konkretnu primenu uslova i petlji, moramo da naglasimo da se u njima koriste promenljive. One se od običnog teksta i naredbi izdvajaju po tome što ispred naziva imaju znak za dolar. Dakle, „sk” nije promenljiva, ali zato „$sk” jeste. Kod dodeljivanja vrednosti, ispred naziva promenljive izostavljamo znak za dolar:

sk=’Svet kompjutera’

Da bismo ovu promenljivu upotrebili u kombinaciji sa naredbama i eventualno ispisali na standardnom izlazu, koristićemo je u punom formatu „$sk”, na primer:

echo Moj omiljeni časopis je $sk

Naredbe uslova

Naredbe uslova omogućavaju nam da neku radnju obavimo ako je ispunjen neki uslov. Za takve stvari već i vrapci znaju da se koriste naredbe if i case, u zavisnosti od kompleksnosti uslova i same ekonomičnosti.

Pre nego što uposlimo konstrukciju if then else, moramo da pomenemo naredbu test, koja se kombinuje sa logičkim izrazima, a koja proverava izraz i vraća rezultat TRUE ako je on tačan, odnosno FALSE ako je netačan. Na taj način možemo da testiramo brojeve, reči i datoteke, a opcije za testiranje u logičkim izrazima možete da vidite u priložene tri tabele. Sintaksa za testiranje može biti dvojaka, i to

test izraz

ili

[ izraz ]

Korisniku kao živom biću sama naredba test ne služi ničemu dok se ne kombinuje sa naredbom uslova (ili petljom, što ćemo videti kasnije). Osnovna sintaksa uslovne naredbe if je

if [ -d ~/Documents ]; then

echo ’Imaš dokumente’

else

echo ’Pa ti nemaš dokumente!’

fi

U ovom primeru proveravamo da li u korisničkom direktorijumu postoji direktorijum Documents i o tome obaveštavamo korisnika. Ova sintaksa može da bude skraćena izbacivanjem dela else (kada nam treba samo potvrdan uslov), tako da prethodna sintaksa postaje

if [ -d ~/Documents ]; then

echo ’Imaš dokumente’

fi

Osim skraćivanja, uslovi mogu da se nadovežu dodavanjem elif, koji proverava novi uslov ako prethodni nije ispunjen. Da biste najlakše shvatili kako to funkcioniše, napravićemo „bota” koji u zavisnosti od trenutnog vremena korisniku želi dobrodošlicu. Promenljivoj $SAT dodelićemo vrednost tekućeg sata naredbom date. Naredbom echo, koju smo pomenuli u prošloj lekciji (SK 10/2011), za period od 6 do 12 sati ispisaćemo „Dobro jutro svete”, od 12 do 18 „Dobar dan svete”, od 18 do ponoći „Dobro veče svete”, a od ponoći do 6 izjutra „Laku noć svete”.

SAT=$( date +’%k’ | sed ’s/ //’)

if [ $SAT -gt 6 ] && [ $SAT -lt 12 ]; then

echo ’Dobro jutro svete’

elif [ $SAT -ge 12 ] && [ $SAT -lt 18 ]; then

echo ’Dobar dan svete’

elif [ $SAT -ge 18 ] && [ $SAT -le 23 ]; then

echo ’Dobro veče svete’

else

echo ’Laku noć svete’

fi

Kao što možete da uočite, uslovni logički izrazi mogu da se kombinuju, a međusobno se povezuju znakom && (dupli „ampersand”) ako oba (ili više) testa moraju da budu tačna, odnosno || (dupli „pajp” – „cevka”) ako tražimo da bar jedan test bude tačan.

Uslovi sa više mogućnosti tretiraju se naredbom case, koja ima prednost nad if then else kada se proveravaju jednostavne vrednosti. Međutim, varijanta koja „zaglupljuje” tako napravljenog bota koji želi dobrodošlicu u odnosu na vreme bila bi:

SAT=$( date +’%k’ | sed ’s/ //’)

case ”$SAT” in

11) echo ’Podne samo što nije’;;

12) echo ’Tek što je prošlo podne’;;

*) echo ’Nemam predstavu o vremenu’;;

esac

U ovoj kombinaciji naš bot će znati samo da prepozna vreme pre i posle 12 sati, tj. podneva, a u ostalim slučajevima će da kuka da nema predstavu o vremenu. Da bi radio jednako dobro kao onaj prethodni, daćemo mu konkretne podatke:

SAT=$( date +’%k’ | sed ’s/ //’)

case ”$SAT” in

0|1|2|3|4|5) echo ”Laku noć svete”;;

6|7|8|9|10|11) echo ”Dobro jutro

svete”;;

12|13|14|15|16|17) echo ”Dobar

dan svete”;;

*) echo „Dobro veče svete”;;

esac

Kao što možete da uočite, uslov počinje tako što naredba case uzima promenljivu (poželjno je promenljivu staviti pod navodnike u slučaju da tekst sadrži razmake), a onda proverava da li tekst te promenljive spada u neki od slučajeva (tekst može da se piše bez navodnika, a više slučajeva kombinuju se znakom | – jedna „cevka”). Kada navedemo slučajeve koje moraju da budu ispunjeni stavljamo zatvorenu zagradu, a nakon toga ono što želimo da bude urađeno kada su ti slučajevi ispunjeni. Kada se akcija za slučaj završi, stavljamo dupli znak tačka-zarez (;;). I još da dodamo i to da kao krajnji slučaj možemo da stavimo „džoker” zvezdu, koja će nam omogućiti da za svaki slučaj koji ranije nije ispunjen sprovedemo neku akciju (ekvivalentno delu else kod if then else).

Petlje

Bash nam osim uslovnih akcija dozvoljava upotrebu ponavljanja, tj. petlji, koje nam omogućavaju da nešto radimo definisani broj puta ili dok je neki uslov ispunjen, odnosno dok se ne ispuni. Za to koristimo naredbe for, while i until. Zapravo, postoji i naredba shift koja premešta vrednosti parametara ulevo, ali se njom ovog puta nećemo baviti.

Naredbu for koristimo kada nešto treba uraditi određeni broj puta. Na primer, da bismo s Neta skinuli sken prvog broja „Sveta kompjutera”, koristićemo sledeću sintaksu:

url=’http://pc.sux.org/SK/1984/10/sk19841’

for sk in $(seq 1 48)

do

wget $url$( printf ’%03d’ $sk ).jpg

done

Prevedeno na jezik običnih ljudi, u prvoj liniji zadajemo fiksnu URL adresu do slika prvog broja SK. U drugoj liniji promenljivoj „sk” dodeljujemo redom vrednost broja u nizu od 1 do 48. U trećem redu kažemo da sa tom vrednošću promenljive nešto treba da se uradi, dok u četvrtoj liniji naredbi wget (SK 3/2010) prosleđujemo tu adresu, kojoj dodajemo trocifreni broj formiran od vrednosti promenljive „sk” (deo printf ’%03d’ $sk), i još na kraj adrese dodamo ekstenziju slike (.jpg). Za kraj u petoj liniji kažemo da je to kraj akcije koja treba da se ponovi za svaku vrednost promenljive „sk”.

Naredbu for možemo da koristimo i u slučaju da iz tekućeg direktorijuma želimo da uzmemo sve ili pak samo datoteke sa određenom ekstenzijom. Ovo se često koristi prilikom konverzije slika u drugi format naredbom convert iz paketa ImageMagick. Za detalje postavite pitanje na našem forumu, a mi vas u ovom slučaju nećemo uputiti na RTFM i LMGTFY.

Naredbom while omogućavamo izvršavanje neke akcije sve dok je rezultat uslova koji se proverava tačan (engl. TRUE). Nepratkičniji ekvivalent prethodnog primera sa naredbom while bio bi:

sk=1

url=”http://pc.sux.org/SK/1984/10/sk19841”

while [ $sk -le 48 ]

do

wget $url$( printf ’%03d’ $sk ).jpg

(( sk++ ))

done

Ova naredba češće se koristi prilikom iščitavanja neke datoteke i upotrebe svake linije ponaosob. Na primer, da ispišemo svaku liniju datoteke .bashrc sa rednim brojem na početku koristićemo sintaksu:

while read linija

do

(( broj++ ))

echo $broj: $linija

done < ~/.bashrc

Za razliku od naredbe while, naredba until omogućava ponavljanje akcije sve dok je proveravani uslov netačan (engl. FALSE), a sintaksa ostaje potpuno ista. Dakle, za naš primer sa dovlačenjem prvog broja „Sveta kompjutera” u kombinaciji sa naredbom until izgledao bi ovako:

sk=1

url=”http://pc.sux.org/SK/1984/10/sk19841”

until [ $sk -gt 48 ]

do

wget $url$( printf ’%03d’ $sk ).jpg

(( sk++ ))

done

Ovde će se akcija izvršavati sve dok vrednost promenljive „sk” ne postane veća od 48, kada se petlja prekida.

Naredba until može da se koristi i kada od korisnika želimo da dobijemo određeni odgovor na postavljeno pitanje, tako da uporno postavljamo isto pitanje dok ne dobijemo željeni odgovor. Na primer:

SK=”Svet kompjutera”

until [ ”$CASOPIS” == ”$SK” ]

do

echo Koji je tvoj omiljeni časopis?

read CASOPIS

done

echo Odličan izbor!

Verujemo da pri pogledu program i sami shvatate koji bi trebalo da vam je omiljeni časopis. :)

• • •

Naredbe uslova i petlje su delovi koda koji u programiranje uvode logiku. Da nije njih, programiranje ne bi bilo zanimljivo, a programi bi postali prosti linearni nizovi.

I ovoga puta ćemo vas „uplašiti” činjenicom da osim prikazanih primera, svaka od napred pomenutih naredbi omogućava mnogo više kombinacija i polja upotrebe. U sledećoj lekciji pokazaćemo vam kako da napravite pravu, funkcionalnu bash skriptu koristeći naučeno u prve tri lekcije. A do tada, očekujemo vaše reakcije na našem forumu bit.ly/sklp-forum.

Aleksandar UROŠEVIĆ

BrojeviTekstDatoteke
PoređenjeZnačenjePoređenjeZnačenjePoređenjeZnačenje
-eqjednako=identično-dako je direktorijum
-nenije jednako!=nije identično-fako je datoteka
-ltmanje odpromenljivatekst u promenljivoj
je definisana
-rdatoteka može da se čita
-lemanje od ili jednako-n promenljivadužina teksta u
promenljivoj je veća od nula karaktera
-sdužina sadržaja datoteke
je veća od nula karaktera
-gtveće od-z promenljivadužina teksta u
promenljivoj je nula karaktera (definisana a prazna promenljiva)
-wu datoteku može da se piše
-geveće od ili jednako-xizvršna datoteka
 
Bash za početnike (3)
Šta mislite o ovom tekstu?
Prey 0.5.3
Ubuntu 11.10 (Oneiric Ocelot)
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera