Gym
lesson

Petlje

Petlje nam omogućavaju da ponovimo blok komandi više puta — za svaki element liste, dok je neki uslov ispunjen, ili određen broj puta.

for petlja

for petlja prolazi kroz listu vrednosti i za svaku izvršava blok komandi.

Osnovna sintaksa

for VARIJABLA in lista_vrednosti; do
    # komande
done

Primer:

#!/bin/bash
for IME in Ana Marko Petra Ivan; do
    echo "Zdravo, $IME!"
done

Izlaz:

Zdravo, Ana!
Zdravo, Marko!
Zdravo, Petra!
Zdravo, Ivan!

Iteracija kroz brojeve

Bash sintaksa za opseg:

for I in {1..10}; do
    echo "Broj $I"
done

# Sa korakom
for I in {0..20..5}; do
    echo "$I"
done

Iteracija kroz fajlove

#!/bin/bash
# Prolazi kroz sve .txt fajlove u trenutnom direktorijumu
for FAJL in *.txt; do
    echo "Obrađujem: $FAJL"
    wc -l "$FAJL"
done
#!/bin/bash
# Pravi rezervnu kopiju svakog .conf fajla
for FAJL in /etc/*.conf; do
    if [[ -f $FAJL ]]; then
        cp "$FAJL" "${FAJL}.bak"
        echo "Backup: $FAJL"
    fi
done

Iteracija kroz izlaz komande

#!/bin/bash
# Ispiši informacije o svakom korisniku iz /etc/passwd
for KORISNIK in $(cut -d: -f1 /etc/passwd); do
    echo "Korisnik: $KORISNIK"
done

while petlja

while petlja se izvršava dok je uslov tačan:

while [[ uslov ]]; do
    # komande
done

Primer — odbrojavanje:

#!/bin/bash
BROJAC=5

while [[ $BROJAC -gt 0 ]]; do
    echo "Odbrojavanje: $BROJAC"
    BROJAC=$((BROJAC - 1))
done

echo "Poletanje!"

Izlaz:

Odbrojavanje: 5
Odbrojavanje: 4
Odbrojavanje: 3
Odbrojavanje: 2
Odbrojavanje: 1
Poletanje!

Čitanje fajla liniju po liniju

Ovo je jedan od najčešćih obrazaca u Bash skriptovanju:

#!/bin/bash
# Čita i ispisuje svaku liniju fajla sa brojem linije
BROJAC=1

while IFS= read -r LINIJA; do
    echo "$BROJAC: $LINIJA"
    BROJAC=$((BROJAC + 1))
done < /etc/hosts

IFS= sprečava trimovanje razmaka, a -r znači "ne tumači backslash kao eskejp" — sigurnije za čitanje fajlova sa specijalnim karakterima.

Čitanje sa preusmeravanjem:

while read -r LINIJA; do
    echo "Linija: $LINIJA"
done < "moj_fajl.txt"

Beskonačna while petlja

#!/bin/bash
# Meni koji se ponavlja dok korisnik ne izabere izlaz
while true; do
    echo "=== MENI ==="
    echo "1) Prikaži datum"
    echo "2) Prikaži korisnike"
    echo "3) Izlaz"
    read -p "Izbor: " IZBOR

    case $IZBOR in
        1) date ;;
        2) who ;;
        3) echo "Doviđenja!"; break ;;
        *) echo "Nevalidan izbor" ;;
    esac
done

until petlja

until je suprotna od while — izvršava se dok uslov nije tačan (tj. dok je uslov lažan):

#!/bin/bash
POKUSAJI=0

until [[ $POKUSAJI -ge 3 ]]; do
    echo "Pokušaj broj $((POKUSAJI + 1))"
    POKUSAJI=$((POKUSAJI + 1))
done
echo "Završeno nakon 3 pokušaja"

Praktičan primer — čekanje na fajl:

#!/bin/bash
FAJL="/tmp/signal.txt"

echo "Čekam na fajl $FAJL..."

until [[ -f $FAJL ]]; do
    sleep 1
done

echo "Fajl je pronađen! Nastavljam..."

break i continue

break — izlaz iz petlje

#!/bin/bash
for I in {1..10}; do
    if [[ $I -eq 5 ]]; then
        echo "Pronašao sam 5, zaustavljam se!"
        break
    fi
    echo "Broj: $I"
done

Izlaz:

Broj: 1
Broj: 2
Broj: 3
Broj: 4
Pronašao sam 5, zaustavljam se!

continue — preskakanje iteracije

#!/bin/bash
# Ispiši samo neparne brojeve
for I in {1..10}; do
    if [[ $((I % 2)) -eq 0 ]]; then
        continue   # Preskoči parne
    fi
    echo "Neparan: $I"
done

Izlaz:

Neparan: 1
Neparan: 3
Neparan: 5
Neparan: 7
Neparan: 9

Ugnježdene petlje

Petlje možemo ugnježdavati jednu u drugu:

#!/bin/bash
# Tablica množenja 1-5
for I in {1..5}; do
    for J in {1..5}; do
        printf "%4d" $((I * J))
    done
    echo ""  # Novi red posle svake vrste
done

Izlaz:

   1   2   3   4   5
   2   4   6   8  10
   3   6   9  12  15
   4   8  12  16  20
   5  10  15  20  25

Praktičan primer: obrada fajlova

#!/bin/bash
# Skripta koja procesuje sve log fajlove i traži greške

GRESKE=0
LOG_DIR="/var/log"

echo "Tražim greške u log fajlovima..."

for LOG_FAJL in "$LOG_DIR"/*.log; do
    if [[ ! -f $LOG_FAJL ]]; then
        continue
    fi

    BROJ=$(grep -c "ERROR" "$LOG_FAJL" 2>/dev/null || echo 0)

    if [[ $BROJ -gt 0 ]]; then
        echo "  $LOG_FAJL: $BROJ grešaka"
        GRESKE=$((GRESKE + BROJ))
    fi
done

echo "Ukupno grešaka: $GRESKE"

Rezime

Petlja Kada koristiti
for VAR in lista Kada znate listu vrednosti unapred
for I in {1..N} Kada iteriramo N puta
while [[ uslov ]] Kada ponavljamo dok je uslov tačan
until [[ uslov ]] Kada ponavljamo dok uslov nije tačan
break Izlaz iz petlje pre kraja
continue Preskakanje trenutne iteracije
# Čitanje fajla liniju po liniju — standardni obrazac
while IFS= read -r LINIJA; do
    # obrada linije
done < fajl.txt

Sada kada znate osnove skriptovanja — varijable, uslove i petlje — vreme je da sve to primenite u praksi kroz vežbe koje slede.