Gym
lesson

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. -lt i -gt su numerički. 5 > 10 kao 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 (kao else)
  • 6|7 znači "6 ili 7"
  • esac (obrnuto od case) 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.