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.