Bash skripte 1 — prva skripta

Skripta je tekstualni fajl u koji upišeš komande koje bi inače kucao u terminal. Umesto da svaki put ponavljaš isti niz koraka, pokreneš jednu komandu i sve se odradi samo.

Ovo je prvi od četiri teksta o bash skriptovanju. U ovom delu pravimo skriptu koja radi; u narednima dodajemo promenljive, uslove i petlje, pa na kraju sklapamo upotrebljivu backup skriptu.

Sve što ti treba je terminal i tekstualni editor.

Zašto uopšte skripte

Zamisli da svakog jutra proveravaš server: koliko je diska ostalo, da li Apache radi, ima li grešaka u logu. To je tri komande koje kucaš ručno.

Skripta je te tri komande u jednom fajlu. Otkucaš jednu reč i dobiješ sve. A kad to jednom postoji, može i da se zakaže da radi samo, preko cron-a.

Skriptovanje nije programiranje u klasičnom smislu — to je automatizacija onoga što ionako već radiš.

Prva skripta

Napravi fajl:

$ vi zdravo.sh

Upiši:

#!/bin/bash

echo "Zdravo, svete!"

Sačuvaj i izađi. To je cela skripta.

Shebang

Prvi red — #!/bin/bash — zove se shebang i govori sistemu kojim programom da izvrši fajl.

Mora biti prvi red u fajlu, bez razmaka ispred, i mora počinjati znakovima #!. Ako fali, sistem će pokušati da pogodi — i ponekad pogrešiti.

#!/bin/bash        bash
#!/bin/sh          osnovni shell, prenosivije ali sa manje mogućnosti
#!/usr/bin/python3 Python skripta

Videćeš i ovakav oblik:

#!/usr/bin/env bash

Ovaj traži bash kroz PATH umesto da pretpostavi da je u /bin. Prenosiviji je i vredi ga uzeti kao naviku.

Gde je bash na tvom sistemu:

$ which bash
/bin/bash

Pokretanje

Probaj:

$ ./zdravo.sh
-bash: ./zdravo.sh: Permission denied

Fajl postoji, ali nema izvršnu dozvolu. Dodaj je:

$ chmod +x zdravo.sh
$ ./zdravo.sh
Zdravo, svete!

Pogledaj šta se promenilo:

$ ls -l zdravo.sh
-rwxr-xr-x. 1 alen alen 38 Aug 21 14:22 zdravo.sh

Slova x u dozvolama znače da je fajl izvršan.

Zašto ./

Kad otkucaš zdravo.sh bez tačke i kose crte, shell traži tu komandu po direktorijumima iz PATH-a — a trenutni direktorijum tu nije, iz bezbednosnih razloga. Tačka znači „ovaj direktorijum", pa ./zdravo.sh kaže: pokreni fajl baš odavde.

Bez izvršne dozvole

Skripta se može pokrenuti i tako što bash-u prosledis fajl:

$ bash zdravo.sh
Zdravo, svete!

Ovde dozvola nije potrebna, jer se ne izvršava fajl nego bash koji ga čita. Korisno za brzi test, ali za skriptu koju stvarno koristiš postavi dozvolu.

Komentari

Sve iza # bash ignoriše:

#!/usr/bin/env bash
# Provera osnovnog stanja servera
# Autor: Alen
# Datum: 2026-08-21

echo "Provera pokrenuta"    # ovo se takođe ignoriše

Zaglavlje sa opisom nije formalnost. Skripta koju napišeš danas biće ti potpuno strana za šest meseci, a još stranija kolegi koji je zatekne na serveru.

Skripta koja nešto radi

Nešto korisnije od pozdrava — pregled stanja sistema:

#!/usr/bin/env bash
# Kratak pregled stanja sistema

echo "=== Sistem ==="
hostname
uname -r

echo
echo "=== Vreme rada i opterećenje ==="
uptime

echo
echo "=== Zauzeće diska ==="
df -h

echo
echo "=== Memorija ==="
free -h

Sačuvaj kao stanje.sh, dodaj dozvolu i pokreni:

$ chmod +x stanje.sh
$ ./stanje.sh

Komande se izvršavaju odozgo nadole, jedna za drugom, tačno kao da si ih sam kucao. Samo echo bez ičega ispisuje prazan red.

echo i njegove sitnice

echo "Tekst u navodnicima"
echo Tekst bez navodnika
echo -n "Bez preloma reda na kraju"
echo -e "Prvi red\nDrugi red"

Opcija -e uključuje specijalne znake: \n za novi red, \t za tabulator.

Navodnici su bitni kad tekst sadrži razmake ili specijalne znake. Bez njih bash tekst rastavlja na delove i ponešto tumači po svome. O razlici između jednostrukih i dvostrukih navodnika detaljno u sledećem delu — za sad koristi dvostruke.

Gde držati skripte

Dok učiš, bilo gde u svom home direktorijumu.

Kad skripta postane nešto što stvarno koristiš, standardna mesta su:

  • ~/bin — tvoje lične skripte
  • /usr/local/bin — skripte dostupne svim korisnicima sistema
  • /opt/skripte — poslovi vezani za konkretnu aplikaciju

Ako je skripta u direktorijumu koji je u PATH-u, pokrećeš je po imenu, bez ./:

$ mkdir -p ~/bin
$ mv stanje.sh ~/bin/stanje
$ stanje

Na većini distribucija ~/bin se automatski dodaje u PATH ako postoji pri prijavljivanju — pa se možda moraš odjaviti i prijaviti da proradi. Proveri:

$ echo $PATH

Primetićeš i da sam izbacio ekstenziju .sh. Ona bash-u ne znači ništa; koristi je za skripte koje uređuješ, izostavi je za one koje pozivaš kao komandu.

Izlazni kod

Svaka komanda po završetku vraća broj: 0 znači uspeh, sve ostalo grešku. Vidi ga preko $?:

$ ls /etc
$ echo $?
0

$ ls /nepostojeci
ls: cannot access '/nepostojeci': No such file or directory
$ echo $?
2

Skripta vraća izlazni kod poslednje komande, ili onaj koji sam zadaš komandom exit:

#!/usr/bin/env bash

if [ ! -f /etc/httpd/conf/httpd.conf ]; then
    echo "Konfiguracija nije pronađena"
    exit 1
fi

echo "Sve u redu"
exit 0

Ovo izgleda kao sitnica, ali je temelj svega ostalog — cron, systemd i alati za nadzor prepoznaju da li je posao uspeo isključivo po izlaznom kodu. Skripta koja tiho otkaže a vrati nulu je gora nego da je nije bilo. Uslovi (if) su tema trećeg dela.

Kad skripta ne radi

Permission denied

Nedostaje izvršna dozvola:

$ chmod +x skripta.sh

command not found

Ako se odnosi na samu skriptu, verovatno si zaboravio ./. Ako se odnosi na komandu unutar skripte, proveri da li postoji i da li je u PATH-u — a u skriptama koje pokreće cron piši pune putanje.

bad interpreter: No such file or directory

Ovo je klasika. Skoro uvek znači da je fajl pisan na Windowsu i ima prelome redova u CRLF formatu, pa nevidljivi znak \r završi zalepljen za shebang.

$ file skripta.sh
skripta.sh: Bourne-Again shell script, ASCII text, with CRLF line terminators

Popravka:

$ dos2unix skripta.sh

Ili, ako dos2unix nije instaliran:

$ sed -i 's/\r$//' skripta.sh

Kad ne znaš gde puca

Pokreni skriptu sa -x:

$ bash -x stanje.sh
+ echo '=== Sistem ==='
=== Sistem ===
+ hostname
web01
+ uname -r
5.14.0-362.el9.x86_64

Bash ispisuje svaku komandu pre nego što je izvrši, sa + ispred. Odmah vidiš dokle je stigla i sa čime je pukla. Isti efekat dobijaš i ako u skriptu dodaš set -x.

Za proveru sintakse bez izvršavanja:

$ bash -n stanje.sh

Vežba

Napiši skriptu koja ispisuje:

  • trenutni datum i vreme
  • ime prijavljenog korisnika
  • direktorijum u kojem se nalaziš
  • pet najvećih fajlova u tvom home direktorijumu

Komande koje ti trebaju: date, whoami, pwd, du, sort i head. Poslednja stavka traži da ih spojiš pajpom.


Sledeći deo: promenljive, navodnici i argumenti komandne linije — kako napraviti skriptu koja radi sa različitim ulazima.

Povezano: chmod · Tekstualni editori · cron · Programiranje

Comments

Popular posts from this blog

Konverzija tipova podataka u Pythonu

Početak u Linuxu — šta je i zašto se uči

groupadd