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
Post a Comment