Uslovi
Uslovne naredbe nam omogućavaju da skripta donosi odluke — da izvrši različite komande zavisno od toga da li je neki uslov ispunjen ili ne.
if / elif / else / fi
Osnovna struktura uslovne naredbe:
if [[ uslov ]]; then
# izvršava se ako je uslov tačan
elif [[ drugi_uslov ]]; then
# izvršava se ako je drugi uslov tačan
else
# izvršava se ako nijedan uslov nije tačan
fi
Ključna reč fi (obrnuto od if) završava blok.
Jednostavan primer:
#!/bin/bash
BROJ=7
if [[ $BROJ -gt 5 ]]; then
echo "Broj je veći od 5"
else
echo "Broj je manji ili jednak 5"
fi
Test komanda [[]]
[[ ]] je modernija verzija test komande (starija forma je [ ] ili test). Preporučujemo [[ ]] jer je robusnija i podržava više opcija.
Važno: Unutar
[[ ]]mora biti razmak posle[[i pre]].
Poređenje stringova
A="zdravo"
B="svete"
if [[ $A == $B ]]; then
echo "Stringovi su isti"
fi
if [[ $A != $B ]]; then
echo "Stringovi su različiti"
fi
| Operator | Opis | Primer |
|---|---|---|
== |
Jednako | [[ $A == $B ]] |
!= |
Nije jednako | [[ $A != $B ]] |
-z |
String je prazan | [[ -z $VAR ]] |
-n |
String nije prazan | [[ -n $VAR ]] |
< |
Leksikografski manji | [[ $A < $B ]] |
> |
Leksikografski veći | [[ $A > $B ]] |
Primer provere praznog stringa:
#!/bin/bash
read -p "Unesi ime: " IME
if [[ -z $IME ]]; then
echo "Greška: ime ne sme biti prazno!"
else
echo "Zdravo, $IME!"
fi
Poređenje brojeva
Za poređenje numeričkih vrednosti koristimo posebne operatore:
#!/bin/bash
OCENA=8
if [[ $OCENA -ge 9 ]]; then
echo "Odličan"
elif [[ $OCENA -ge 7 ]]; then
echo "Vrlo dobar"
elif [[ $OCENA -ge 5 ]]; then
echo "Dovoljan"
else
echo "Nedovoljan"
fi
| Operator | Opis | Ekvivalent |
|---|---|---|
-eq |
Jednako | == |
-ne |
Nije jednako | != |
-lt |
Manje od | < |
-gt |
Veće od | > |
-le |
Manje ili jednako | <= |
-ge |
Veće ili jednako | >= |
Zašto ne koristimo
<i>za brojeve? Unutar[[ ]],<i>su leksikografski operatori za stringove.-lti-gtsu numerički.5 > 10kao string poređenje daje netačan rezultat!
Provera fajlova i direktorijuma
Često trebamo proveriti da li fajl postoji pre nego što ga koristimo:
#!/bin/bash
FAJL="/etc/passwd"
if [[ -e $FAJL ]]; then
echo "Fajl postoji"
fi
if [[ -f $FAJL ]]; then
echo "Ovo je regularan fajl"
fi
| Operator | Opis |
|---|---|
-e putanja |
Postoji (fajl ili direktorijum) |
-f putanja |
Regularni fajl (nije direktorijum) |
-d putanja |
Direktorijum |
-r putanja |
Čitljiv (readable) |
-w putanja |
Upisiv (writable) |
-x putanja |
Izvršiv (executable) |
-s putanja |
Postoji i nije prazan |
Praktičan primer:
#!/bin/bash
read -p "Unesi putanju do fajla: " PUTANJA
if [[ ! -e $PUTANJA ]]; then
echo "Greška: '$PUTANJA' ne postoji"
exit 1
fi
if [[ -d $PUTANJA ]]; then
echo "'$PUTANJA' je direktorijum"
ls "$PUTANJA"
elif [[ -f $PUTANJA ]]; then
echo "'$PUTANJA' je fajl, sadržaj:"
cat "$PUTANJA"
fi
Napomena: ! negira uslov — [[ ! -e $PUTANJA ]] znači "ako ne postoji".
Logički operatori
Možemo kombinovati uslove:
# AND - oba uslova moraju biti tačna
if [[ $A -gt 0 && $A -lt 100 ]]; then
echo "Broj je između 0 i 100"
fi
# OR - bar jedan uslov mora biti tačan
if [[ $FAJL == "*.txt" || $FAJL == "*.md" ]]; then
echo "Tekstualni fajl"
fi
Možemo ih i lančati izvan [[ ]]:
mkdir /tmp/test && echo "Direktorijum kreiran"
ls /nepostoji || echo "Direktorijum ne postoji"
case izraz
Kada imamo više vrednosti za poređenje jedne varijable, case je čitljiviji od if/elif:
#!/bin/bash
read -p "Unesi dan u sedmici (1-7): " DAN
case $DAN in
1)
echo "Ponedeljak"
;;
2)
echo "Utorak"
;;
3)
echo "Sreda"
;;
4)
echo "Četvrtak"
;;
5)
echo "Petak"
;;
6|7)
echo "Vikend!"
;;
*)
echo "Greška: unesi broj od 1 do 7"
;;
esac
Sintaksa case:
- Svaki pattern završava sa
) - Blok komandi završava sa
;; *je wildcard koji hvata sve ostalo (kaoelse)6|7znači "6 ili 7"esac(obrnuto odcase) završava blok
Case sa stringovima:
#!/bin/bash
read -p "Unesi komandu (start/stop/status): " CMD
case $CMD in
start)
echo "Pokretanje servisa..."
;;
stop)
echo "Zaustavljanje servisa..."
;;
status)
echo "Servis je aktivan."
;;
*)
echo "Nepoznata komanda: $CMD"
echo "Korišćenje: start | stop | status"
exit 1
;;
esac
Praktičan primer: provera argumenta
#!/bin/bash
# Skripta koja analizira broj
if [[ $# -eq 0 ]]; then
echo "Korišćenje: $0 <broj>"
exit 1
fi
BROJ=$1
if [[ ! $BROJ =~ ^-?[0-9]+$ ]]; then
echo "Greška: '$BROJ' nije validan broj"
exit 1
fi
if [[ $BROJ -gt 0 ]]; then
echo "$BROJ je pozitivan"
elif [[ $BROJ -lt 0 ]]; then
echo "$BROJ je negativan"
else
echo "Broj je nula"
fi
if [[ $((BROJ % 2)) -eq 0 ]]; then
echo "$BROJ je paran"
else
echo "$BROJ je neparan"
fi
Rezime
| Struktura | Opis |
|---|---|
if [[ uslov ]]; then ... fi |
Osnovna uslovna naredba |
elif [[ uslov ]]; then |
Dodatni uslov |
else |
Blok ako nijedan uslov nije tačan |
case $VAR in ... esac |
Višestruko poređenje jedne varijable |
&& |
Logičko AND |
|| |
Logičko OR |
! |
Negacija uslova |
U sledećoj lekciji naučićemo kako da ponavljamo blokove koda koristeći petlje.