Bash je interpreter i programski jezik u obliku komandne linije koji je napisao Brajan Foks 1987. godine.
Uključen je na većini juniksolikih operativnih sistema sa GNU licencom. Na većini Linux sistema, ovo je podrazumevani interpreter,
tj. interpreter koji se automatski dodjeljuje novim korisnicima.
Bash sadrži sopstveni skript jezik, pomoću kojeg je moguće ostvariti visok nivo automatizacije poslova, jer podržava petlje, grananja, aritmetičke operacije, promjenljive i manipulaciju njihovim vrednostima pomoću regularnih izraza, manipulaciju standardnog ulaza, izlaza i izlaza za greške i preusmeravanje u datoteke, što u kombinaciji sa standardnim skupom alata na juniksolikim sistemima čini moćnu programersku alatku .
UNIKS Shell je program ili tumač komandne linije koji tumači komande koje je korisnik uneo direktno u terminal ili koje se mogu pročitati iz datoteke (tj. Shell Script - a), a zatim ih prosleđuje operativnom sistemu na obradu.
Shell skripti se ne kompajliraju, već interpretiraju.
Postoje različite vrste shell- a koje su dostupne na Linux operativnom sistemu:
⇀Bourne Shell
⇀C Shell
⇀Corn Shell
⇀GNU Bourne Shell
Da biste znali koji tip shell-a podržava vaš operativni sitem, unesite narednu komandu u terminal:
cat /etc/ shells
Da biste znali gde je bash lociran u vašem OS-u, unesite sl.komandu:
which bash
1. Bash je sh - kompatibilan jer je izveden iz originalnog UNIKS Shell-a. U njega su uključene najbolje i korisne karakteristike Corn i C shell - a (manipulacija direktorijumom, kontrola poslova, aliasi, itd.)
2. Bash se može pozvati opcijama komandne linije sa jednim znakom (-a, -b, -c, -i, -l, -r, itd.), kao i opcijama komandne linije sa više znakova, kao što su --debugger, --help, --login itd.
3. Bash start-up fajlovi su skripti koji se izvršavaju kada je Bash pokrenut; svaki ima svoju posebnu ulogu, a svi zajedno služe za stvaranje okruženja.
Bash skript je običan tekstualni fajl koji sadrži niz različitih komandi koje obično kucamo u komandnom prozoru. Uključuje jednu, ili više komandi ili delove karakteristične za imperativno programiranje: petlje, funkcije, uslovne izraze…
Uglavnom se koristi da automatizuje zadatke koji se ponavljaju na Linux sistemu.
Bash skript je napisan na Bash programskom jeziku.
● Da bi napravili prazan bash skript, pozicioniramo se u direktorijum gde želimo da skript bude kreiran, cd komandom
● Sa komandom touch možete stvoriti prazne skriptove
$ touch ime_fajla.sh
● Možemo koristiti tekst editor kao što je npr gedit za kucanje shell komandi; narednom komandom otvaramo već napravljeni, prazan, shell skript
$ gedit ime_fajla.sh
● Ekstenzija potrebna da bi se fajl izvršio je je .sh
Svaki Bash skript počinje linijom:
#!/bin/bash
#! se naziva shebang a ostatak linije je put do interpretera
Shebang (#!)
Kod juniksolikih operativnih sistema, ovaj znak na početku linije obaveštava interpreter da izvrši linije skripta, i poznat je kao direktiva putanje za izvršavanje različitih vrsta skriptova, kao što su Bash, Python…
Bitno je da je uvek u prvoj liniji skripta i da ne sme da postoji prostor pre #, kao i izmedju !, # (#!) i puta do interperetera.
echo
echo je ugradjena komanda u Bash-u, koristi se za prikazivanje output-a prosleđujući argumente
Sintaksa:
$ echo [opcija] string
$ echo string
Može se takodje koristiti za ubacivanje razmaka izmedju dva reda, tako što u skriptu samo napišemo komandu echo bez argumenata izmedju dva output-a.
Metoda1:
Novokreirani fajlovi se neće izvršavati bez obzira na ekstenziju koju im dodelimo. Zbog toga moramo da tom fajlu koji želimo da izvršimo dodelimo dozvolu za izvršavanje.
Za to koristimo narednu komandu:
$ chmod +x ime_fajla.sh
Sada možemo pokrenuti naš Bash skript, koristeći komandu ./
$ ./ime_fajla.sh
Metoda2:
Drugi način za pokretanje Bash skriptova je pozivanje interpretera eksplicitno.
$ bash ime_fajla.sh
Kod ove metode nije potrebno dodati dozvolu za izvršavanje fajlu.
Kada smo prošli osnovne komande vezane za pravljenje i pokretanje Bash skriptova, sada možemo napraviti naš prvi program praćenjem sledećih koraka.
Korak 1: Otvorite terminal, pomoću komande cd pozicionirajte se na željenu lokaciju u sistemu
Korak 2: Kreirajte praznu datoteku pomoću touch komande; da biste je mogli izvršiti nazovite je bash_script.sh.
Korak 3: Otvorite fajl koristeći neki editor teksta : gedit, kate …
Korak 4: Kodiranje
Korak 5: Izvršite skript komandom ./.
Dobićete grešku, jer kao što možete da vidite na slici ispod, fajl ima samo dozvolu za čitanje i pisanje
Korak6: Dodaje dozvolu za izvršavanje komandom narednom komandom:
$ chmod +x bash_script.sh
Sada možemo izvršiti skript :-)
Za pisanje jednolinijskih komentara koristi se # (hash)
$ #Ovo je komentar u Bash-u.
$ echo "This is Code" # ovo je takodje komentar, u istoj liniji sa kodom.
●razmak izmedju teksta i # nije obavezan!
Postoje dva načina za pisanje višelinijskih komentara:
1. komentari se pišu izmedju <<COMMENT i COMMENT.
2. komentari se pišu izmedju (: ') i (')
− Kada radimo sa običnim tekstom, ne postoji razlika izmedju jednostrukih i dvostrukih navodnika
− Stavljanje znakova pod jednostruke navodnike (') čuva vrednost svakog znaka unutar navodnika. Jednostruki navodnik se neće pojaviti između jednostrukih navodnika, čak i kada mu prethodi obrnuta kosa crta.
− Stavljanje znakova pod dvostruke navodnike (") čuva doslovnu vrednost svih znakova unutar navodnika, sa izuzetkom $, `, \ . Znakovi $ i ` zadržavaju svoje posebno značenje unutar dvostrukih navodnika. Kosa crta zadržava svoje posebno značenje samo kada je praćena jednim od sledećih znakova: $, `, ", \ ili novi red. Unutar dvostrukih navodnika uklanjaju se obrnute kose crte iza kojih se nalazi jedan od ovih znakova. Obrnute kose crte koje prethode znakovima bez posebnog značenja ostaju nepromenjene. Dvostruki navodnik se može citirati unutar dvostrukih navodnika tako što mu prethodi obrnuta kosa crta.
− Znakovi * i @ imaju posebno značenje kada su u dvostrukim navodnicima
Promenljive su suština programiranja.
Promenljive čuvaju podatke, poznate su kao privremena skladišta za bilo koju vrstu podataka kao što su ceo broj, float, char, itd… Njihova vrednost se može promeniti i koristiti više puta.
Sintaksa:
$ ime_promenljive=vrednost
Pravila za definisanje promenljivih u Bash - u:
Da biste ispisali promenljivu morate staviti znak dolara ($) kao prefiks
Takodje, isto pravilo važi za dodeljivanje vrednosti promenljivoj
− Ime promenljive može da sadrži slova (mala i velika), cifre i donju crtu, a njeno ime može da započne samo slovima i donjom crtom.
− Ime promenljive je osetljivo na velika i mala slova: x i X se smatraju za dve različite promenljive.
− Ime promenljive može biti napisano ili u UPPER_CASE ili LOVER_CASE slovima ili mešavina oba kako želite.
− Promenljiva se može koristiti bilo gde u Bash skriptu ili na komandnoj liniji, jer će je Bash za vreme izvršavanja zameniti njenom dodeljenom vrednošću. To je moguće zbog vršenja zamene pre pokretanja komande.
− Nema razmaka sa obe strane znaka jednakosti (=) između imena promenljive i njene vrednosti.
− Da biste definisali promenljivu sa jednoznakovnom vrednošću, kao što je var1=vrednost, nema potrebe da koristite navodnike.
− Da biste uneli više reči ili string kao jednu stavku u promenljivoj, onda koristite navodnike za dodeljivanje vašeg sadržaja toj promenljivoj.
- Jednostruki navodnik ('') pomaže da se tretira svaki znak.
- Dvostruki navodnik ("") pomaže da se izvrši zamena (supstitucija)
U slučaju Bash- a, ne morate da definišete tip promenljive za vreme deklaracije. Bash promenljive su netipizirane - promenljivoj dodeljujete samo vrednost, a tip se automatski dodeljuje.
Podaci se ispisuju korišćenjem echo komande, sa znakom $ ispred imena, npr.
Razlikujemo dva tipa promenljivih:
1. Sistemski definisane promenljive
2. Korisnički definisane promenljive
Sistemski definisane promenljive: tzv. predefinisane promenljive, jer su stvorene od strane Linux operativnog sistema; uglavnom su definisane velikim slovima
To su:
1. BASH - predstavlja ime shell-a
2. BASH_VERSION - govori u kojoj verziji shell-a se Bash nalazi
3. COLUMNS - prikazuje broj kolona na vašem ekranu
4. HOME - prikazuje home direktorijum korisnika
5. OSTYPE - govori koji se operativni sistem koristi
6. PWD - predstavlja trenutni radni direktorijum
7. USERNAME - predstavlja ime trenutno ulogovanog korisnika
Ako želite da saznate listu ovih promenljivih koje postoje na vašem sistemu, ukucajte komande set, env, i printenv
Korisnički definisane promenljive: Ove promenljive stvara i njima manipuliše korisnik; uglavnom su definisane malim slovima, ali mogu da se pišu i velikim slovima.
Nije potrebno definisati tip promenljive prilikom deklaracije!
Za njihovo ispisivanje koristi se komanda echo.
Imenu promenljive mora prethoditi znak dolara $ svaki put kada referenciramo na vrednost koju sadrži.
Primer:
Promenljive podržavaju dva tipa akcija:
1. dodela vrednosti promenljivoj - najčešće direktna dodela vrednosti
2. ispisivanje vrednosti promenljive - stavljanjem iznaka $ ispred imena promenljive bilo gde u skriptu gde želimo da vidimo vrednost te promenljive
Sa svim promenljivama, o kojima smo pričali, možemo raditi i u terminalu i u Bash skriptu takodje.
U terminalu:
Primer1: postavljanje vrednosti promenljivama (nemamo razmak pre i posle znaka =)
Primer2: ispisivanje i refenciranje promenljivih, korišćenjem komande echo
Primer3: nevažeće promenljive
Primer4: kombinovanje više promenljivih
vrednosti promenljivih menjaju njihova imena
U Bash skriptu:
Za ispisivanje vrednosti promenljivih, isto kao i u terminalu koristimo komandu echo.
Pravila za manipulaciju promenljivima su identična
Primer:
Argumenti komandne linije se koriste da bi naš Bash skript učinili dinamičnijim prosleđivanjem unosa sa komandne linije u kod.
Prosleđujemo ove argumente tokom izvršavanja skripta u sledećem obliku:
$ ./ime_skripta arg1 arg2 arg3.....
U Bash Shell-u, argumenti komandne linije se koriste sa referencama na sledeće podrazumevane parametre:
$0 čuva ime skripta koji se poziva.
$1-$9 čuva imena prvih 9 argumenata ili se može koristiti kao pozicija argumenata.
$# specificira ukupan broj argumenata prosleđenih skriptu.
$* čuva sve argumente komandne linije tako što ih spaja.
$@ čuva listu argumenata kao niz.
$? specificira ID trenutnog skripta.
$$ specificira izlazni status poslednje komande ili poslednjeg izvršenog procesa
$! prikazuje ID poslednjeg pozadinskog posla.
Dve metode koje koristimo za prosleđivanje argumenata komandne linije:
Metoda 1: Korišćenjem broja pozicije
−prva komanda će ispisati ime skripta koji pokrećemo
−druga komada će ispisati prvih 6 argumenata komandne linije
Metoda2: Korišćenjem niza
Da bi primenili ovu metodu, treba uraditi sledeće korake:
1. Napraviti Bash skriptu
2. Deklarisati bilo koju promenljivu i dodeliti joj vrednost $@ - predstavlja argument koji čuva argumente komande linije koje prosledimo kao niz
variable_name=("$@")
3. Prikazati argumente koristeći sledeću sintaksu:
${variable_name[i]}
4. Izvršiti napisani skript
Da bismo registrovali unos podataka od strane korisnika, koristimo ugradjenu komandu u Bash-u zvanu read.
Ova komanda preuzima korisnički unos i dodeljuje ga promenljivoj. Čita samo jednu liniju iz Bash shell-a.
Sintaksa:
$ read <ime_promenljive>
⇀ Primeri:
−Primer1:
Output:
−Primer2:
Šta ako ne prosledimo ni jednu promenljivu komandi read?
Ako se to desi, možemo koristiti ugradjenu promenljivu REPLY (treba staviti prefiks $) dok se prikazuje unos:
−Primer3: Vrednost može da se unese u istom redu gde je i poruka za korisnika (tzv. prompt)
Da bismo ovo omogućili, koristimo opciju -p
Sintaksa:
$ read -p PROMPT <ime_promenljive>
−Primer4: Možemo da unesemo i više vrednosti korišćenjem niza
Sintaksa:
$ read -a <ime_promenljive>
⇀ ime promenljive referiše na niz argumenata komandne linije
⇀ koristimo opciju -a
Output:
Bash shell pruža različite komande za rad sa datumima zajedno sa različitim opcijama formatiranja.
Možemo koristiti komandu `date` da prikažemo ili promenimo trenutnu vrednost datuma i vremena sistema. Možemo je koristiti i za izračunavanje zadataka koji se odnose na računanje vrednosti datuma i vremena.
Ako se naredba `date` koristi bez ikakve opcije, onda će ona odštampati vrednost datuma i vremena trenutnog sistema.
Sintaksa:
date
Komanda `date` sadrži nekoliko opcija formatiranja za formatiranje izlaza, te možemo da odštampamo vrednost datuma i vremena u različitim formatima.
Sintaksa:
date +<opcije formatiranja><opcije formatiranja>...
Opcije za formatiranje datuma su case sensitive, tj bitna je razlika izmedju velikih i malih slova.
Na primer, ako koristimo %m za mesec, %d za dan i %Y za godinu dobili bi drugačiji rezultat ako stavimo %M na mestu %m, jer ta opcija definiše minute.
Lista opcija za formatiranje datuma:
Opcija | Deo datuma | Opis | Primer output−a |
date +%a | Dan u nedelji | Ime dana u nedelji u kratkoj formi(Sun, Mon, Tue, Wed, Thu, Fri, Sat) | Mon |
date +%b | Mesec | Ime meseca u kratkoj formi (Jan, Feb, Mar...) | Jan |
date +%B | Mesec | Puno ime meseca (January, February...) | January |
date +%d | Dan | Dan u mesecu (01) | 27 |
date +%D | MM/DD/YY | Trenutni datum u obliku MM/DD/YY | 08/27/2019 |
date +%F | YYYY-MM-DD | Datum u obliku YYYY-MM-DD | 2019-08-27 |
date +%H | Časovi | Vreme u 24-časovnom formatu | 16 |
date +%I | Časovi | Vreme u 12-časovnom formatu | 04 |
date +%j | Dan | Dan u godini (001 do 366) | 239 |
date +%m | Mesec | Broj meseca (01 do 12 gde je 01 Januar ) | 08 |
date +%M | Minuti | Minuti (00 do 59) | 55 |
date +%S | Sekunde | Sekunde (00 do 59) | 28 |
date +%N | Nanosekunde | Nanosekunde (000000000 do 999999999) | 300261496 |
date +%T | HH:MM:SS | Vreme u obliku HH:MM:SS | 15:59:10 |
date +%u | Dan u nedelji | Dan u nedelji (01 do 07gde je 01 Ponedeljak) | 02 |
date +%Y | Godina | Prikazuje celu godinu (YYYY) | 2019 |
date +%Z | Vremenska zona | Prikazuje vremesku zonu u kojoj smo trenutno |
Primeri:
Da bi prikazali datum u formatu MM-DD-YYYY koristimo komandu date +%m-%d-%Y
Da bi prikazali datum u formatu MM-YYYY koristimo komandu date +%m-%Y
Da bi prikazali datum u formatu DD-Month, YYYY koristimo komandu
date +%A %d-%B, %Y
⇀ postoje 11 aritmetičkih operacija koje se primenjuju na numeričkim vrednostima
U narednoj tabeli imamo njihovu sintaksu
Operator | Opis | Primeri |
+ | Sabiranje | $(( 10 + 3 )),rezultat=13 |
- | Oduzimanje | $(( 10 - 3 )), rezultat=7 |
* | Moženje | $(( 10 * 3 )), rezultat=30 |
/ | Deljenje | $(( 10 / 3 )), rezultat=3 |
** | Eksponent | $(( 10 ** 3 )), rezultat=1000 |
% | Ostatak pri deljenju prvog operanda drugim | $(( 10 % 3 )), rezultat=1 |
+= | Povećanje vrednosti prvog operanda (promenljiva) za konstantu koja je sa desne strane operatora Rezultat se ponovo smešta u prvi operand | x=10 let "x += 3" echo $x rezultat=13 |
-= | Umanjenje vrednosti prvog operanda za konstantu koja je sa desne strane operatora Rezultat se ponovo smešta u prvi operand | x=10 let "x -= 3" echo $x rezultat=7 |
*= | Množenje prvog operanda(promenljiva) konstantom sa desne strane operatora (drugi operand). Rezultat se ponovo smešta u prvi operand | x=10 let "x *= 3" echo $x rezultat=30 |
/= | Deljenje prvog operanda(promenljiva) konstantom sa desne strane operatora (drugi operand) Rezultat se ponovo smešta u prvi operand | x=10 let "x /= 3" echo $x rezultat=3 |
%= | Ostatak pri deljenju prvog operanda(promenljiva) konstantom sa desne strane operatora (drugi operand) Rezultat se ponovo smešta u prvi operand | x=10 let "10 %= 3" echo $x rezultat=1 |
Postoji više načina za izvodjenje aritmetičkih operacija:
Bilo koja aritmetička operacija u Bash-u se može izvršiti bez korišćenja komandi.
Najlakši način za izvodjenje aritmetičkih operacija u Bash shell-u. Zagrade se mogu iskoristiti na 4 različita načina:
Metoda 1
$ Sum=$((10+3))
$ echo "Suma = $Sum"
Metoda 2
$ ((Sum=10+3))
$ echo "Suma = $Sum"
Metoda 3
$ Num1=10
$ Num2=3
$ ((Sum=Num1+Num2))
$ echo "Suma = $Sum"
Metoda 4
$ Num1=10
$ Num2=3
$ Sum=$((Num1+Num2))
$ echo "Suma = $Sum"
Sve metode dovode do istog outputa: broj 13
`let` je još jedna ugrađena komanda za obavljanje aritmetičkih operacija u bash-u. `let` komanda ne može da štampa izlaz na terminalu bez čuvanja vrednosti u promenljivoj. Ali komanda `let` se može koristiti za uklanjanje drugih ograničenja komande `expr`.
let <aritmetički izraz>
Primer:
Output:
⇀ `expr` ima sličnu upotrebu kao i `let`, ali ne čuva rezultat u promenljivu, samo direktno štampa rezultat
⇀ moramo koristiti space izmedju članova izraza
⇀ možemo koristiti `expr` bez backticks - ova
Sintaksa:
`expr operand1 operator operand2`
ili
expr operand1 operator operand2
Primer:
Output:
If naredba nam pomaže da odredimo da li da izvršimo deo koda, u zavisnosti od ispunjenja uslova koji nametnemo. Drugim rečima, ako je uslovni izraz tačan onda se naredba, ili niz naredbi izvršava.
Sintaksa:
if [ uslovni_izraz ];
then
naredba
fi
Bitno:
⇀ izraz izmedju then i fi će se izvršiti jedino ako je uslovni_izraz tačan
⇀ if uslovna naredba se završava ključnom reči fi
⇀ razmak izmedju uglastih zagrada i uslovnog izraza, upotrebljen u prvom redu, kao i ; na kraju reda su obavezni
Spajanje više uslova u naredbi:
1. AND operator (oba izaraza moraju biti tačna da bi se naredba izvršila)
if [ izraz_1 ] && [ izraz_2 ];
then
naredbe
fi
2. OR operator (da bi se naredba izvršila jedan od izraza mora biti tačan)
if [ izraz_1 ] || [ expression_2 ];
then
naredbe
fi
3. kombinovanje operatora
if [ izraz_1 && izraz_2 || izraz_3 ];
then
naredbe
fi
Opcije koje možemo koristiti kao uslovni izraz:
Opcija(operator) | Opis |
! IZRAZ | proverava da li je IZRAZ netačan |
-n STRING | proverava da li je dužina STRINGA veća od nula |
-z STRING | proverava da li je dužina STRINGA nula |
STRING1 == STRING2 | proverava jednakost STRINGOVA |
STRING1 != STRING2 | proverava nejednakost STRINGOVA |
INTEGER1 -eq INTEGER2 | proverava da li je INTEGER1 numerički jednak sa INTEGER2 |
INTEGER1 -gt INTEGER2 | proverava da li je INTEGER1 numerički veći od INTEGER2 |
INTEGER1 -lt INTEGER2 | proverava da li je INTEGER1 numerički manji od INTEGER2 |
-d FILE | proverava da li FILE postoji u direktorijumu |
-e FILE | proverava da li FILE postoji |
-r FILE | proverava da li FILE postoji i da li imamo dozvolu za čitanje |
-s FILE | proverava da li FILE postoji i da li nije prazan |
-w FILE | proverava da li FILE postoji i da li imamo dozvolu za pisanje |
-x FILE | proverava da li FILE postoji i da li imamo dozvolu za njegovo izvršavanje |
== se malo razlikuje od -eq
Recimo [ 001 == 1 ] će vratiti false jer == vrši poređenje niski (tj.jednakost karaktera po karakter) dok -eq radi numeričko poređenje što znači da će [ 001 -eq 1 ] vratiti tačno
⇀Primeri:
Primer1: Proveramo da li je broj koji je korisnik uneo, veći od 125
Output:
Primer2: Koristimo AND operator da bi u izraz uključili više uslova
Output:
Primer3: Poredimo brojeve
štampaju se samo oni stringovi gde je uslov zadovoljen
Output:
U vašem Bash skriptu, pored toga što možete upotrebiti koliko god if naredbi da želite, takodje možete koristiti jednu if naredbu unutar druge - ugnježdena if naredba.
Primer: Za broj koji unosimo kao argument komandne linije, prvo proveravamo da li je veći od 50, a potom da li je paran
Output:
Možete da ugnjezdite onoliko if izjava koliko želimo, ali opšte pravilo je da ako treba da ugnjezdimo više od 3 nivoa, verovatno bi trebalo da razmislimo o reorganizaciji logike.
If-else naredbe se koriste za obavljanje uslovnih zadataka u sekvencijalnom toku izvršavanja naredbi. Ponekad želimo da obradimo određeni skup iskaza ako je uslov tačan, a drugi skup iskaza ako je netačan i za to koristimo upravo if-else naredbu.
Sintaksa:
if [ uslovni_izraz ];
then
<if blok komandi>
else
<else blok komandi>
fi
Bitno:
⇀Možemo koristiti skup od jednog ili više uslova spojenih pomoću uslovnih operatora.
⇀Blok komande else uključuje skup radnji koje treba izvršiti kada je uslov netačan.
⇀Tačka zarez (;) posle uslovnog izraza je obavezna.
Primer: Prvi if-else uslov je tačan, a drugi nije
U prvom if-else izrazu, uslov ( 10 -gt 3 ) je tačan i tako se izvršava naredba u bloku if. U drugom if-else izrazu je uslov (3 -gt 10) netačan i tako se izvršava naredba u bloku else.
Output:
Možemo napisati kompletnu if-else inaredbu zajedno sa komandama u jednom redu. Pravila za pisanje su:
1. Koristimo tačku i zarez (;) na kraju naredbi u blokovima if i else.
2. Koristimo razmake kao graničnik da bismo dodali sve izjave.
Primer:
Output:
Baš kao i if naredba, i if-else naredba se može koristiti unutar druge if-else naredbe pa tako dobijamo ugnježdenu if-else naredbu.
Primer:
Output:
Else-if (elif) naredba se koristi kada imamo više uslova. Možemo je posmatrati kao dodatak if-else naredbi.
U elifu može postojati nekoliko elif blokova sa logičkim izrazom za svaki od njih dok u slučaju prve 'if naredbe', ako uslov postane netačan, onda se proverava drugi 'if uslov'.
Sintaksa:
if [ uslovni_izraz ];
then
<komande>
elif [ uslovni_izraz ];
then
<komande>
else
<komande>
fi
Primer:
Output:
Slučaj1: ako unesemo br 110 onda je uslov u if naredbi tačan, pa dobijamo output:
Slučaj2: ako unesemo broj 90, onda je uslov u elif naredbi tačan, pa dobijamo output:
Slučaj3: ako unesemo broj 100, onda nijedan uslov neće biti tačan, pa u ovom slučaju blok komandi u else narebi će se izvršiti:
Case naredba je najjednostavniji oblik If-then-else naredbe, sa puno elif elemenata.
Obično se upotrebljava za pojednostavljivanje velikog broja opcija kod komplikovanijih uslova.
Korišćenjem case naredbe naši bash skriptovi postavu čitljiviji i lakši za održavanje.
Sintaksa:
case uslovni_izraz in
slučaj_1)
naredbe
;;
slučaj_2)
naredbe
;;
slučaj_3|slučaj_4|slučaj_5)
naredbe
;;
slučaj-n)
naredbe
;;
*)
naredbe
;;
esac
Bitno:
⇀ svaka case naredba počinje sa ključnom rečju 'case' koja je praćena uslovom case naredbe i zatim ključnom rečju 'in'
⇀ case naredba se završava ključnom rečju 'esac'
⇀ možemo imati i više slučaja koji odgovaraju istoj naredbi, oni su odvojeni operatorom |
⇀ operator ) označava završetak liste slučajeva koji odgovaraju jednoj naredbi
⇀ slučaj (lista slučajeva) i naredba koja mu je pridružena označavaju se kao klauza i moraju se završiti znakom (;;).
⇀ simbol (*) se koristi, kako bi se definisao krajnji slučaj, koji se izvršava ukoliko ni jedan od prethodnih uslova nije ispunjen
Kako naredba radi?
Case naredba pokušava da upari rezultat uslovnog izraza sa nekim od slučajeva. Kada pronadje poklapanje, sve naredbe koje su povezane sa tim slučajem se izvršavaju dok se ne dodje do znaka (;;)
Nakon prvog poklapanja, naredba case prekida izvršavanje.
Ako nemamo poklopnjen slučaj, tj obrazac , exit status case komande će biti nula, a u suprotnom, se biti exit status izvršene komande.
Ako imamo defoltni slučaj (*), on će se izvršiti ako pre toga nismo pronašli ni jedno poklapanje.
Primer:
Output:
Bash petlje su veoma korisne.
Petlje nam omogućavaju da počnemo sa izvršavanjem niza komandi i nastavimo da ih izvršavamo dok se ne postigne određeni cilj. Korisne su za automatizaciju zadataka koji se ponavljaju.
Kao i u drugim programskim jezicima, i u Bash-u koristimo for petlju za neke naredbe koje se ponavljaju u našem skriptu.
Sintaksa:
Možemo primeniti for petlju na dva načina:
1. for-in
for promenljiva in lista
do
komande
done
2. sintaksa koja liči na programski jezik C
for (( izraz1; izraz2 ; izraz3 ))
do
komande
done
Kako petlja radi?
Svaki blok naredbe for petlje u Bash-u počinje ključnom reči 'do' iza koje slede komande unutar bloka. Naredba je zatvorena ključnom reči 'done'.
Broj puta koji će se 'for petlja' ponavljati zavisi od deklarisanih promenljivih liste.
Petlja će izabrati jednu stavku sa liste i dodeliti tu vrednost promenljivoj koja će se koristiti u okviru petlje.
Nakon izvršenja komandi navedenih između ključnih reči 'do' i 'done', petlja se vraća na vrh i bira sledeću stavku sa liste i ponavlja ceo proces.
Lista može da sadrži brojeve, nizove itd. odvojene razmacima.
Primeri:
Primer1: osnovni primer
Output:
Primer2: štampanje brojeva iz intervala
Važno je kada koristite ovakav interval da ne postoje razmaci između vitičastih zagrada { }. Ako postoje, komanda se neće tumačiti kao interval već kao lista stavki.
Kada navedete interval, možete navesti bilo koji broj koji želite i za početnu i za krajnju vrednost. Prva vrednost takođe može biti veća od druge u kom slučaju će se odbrojavati otpozadi.
Takođe je moguće odrediti vrednost za povećanje ili smanjenje svaki put. Ovo radite tako što dodate još dve tačke (..) i vrednost za koju treba pomerati brojeve.
Primer3: iteracija kroz niz
Ponekad, tokom izvršavanja petlji, dolazimo u situaciju da moramo da malo promenimo njihov rad.
Postoje dve naredbe koje možemo da koristimo da bismo to uradili: break i continue
Primer5: upotreba sa break naredbom
Naredba break govori našem programu da odmah napusti petlju.
Primer6: upotreba sa continue naredbom
Continue naredbu unutar for petlje koristimo da bi preskočili izvršavanje odredjene naredbe. Ta odredjena iteracija se preskače, i petlja nastavlja sa daljim iteracijama.
While petlja je naredba kontrole toka koja dozvoljava ponavljanje datog skupa komandi sve dok je uslov tačan.
Sintaksa:
while [ uslovni_izraz ];
do
komande
done
Bitno:
⇀ argument while petlje može biti logički izraz
⇀ uslov se proverava pre nego što se komande u telu petlje izvršavaju
⇀ while petlja je ravnopravna sa for petljom, tj mogu se upotrebljavati za rešavanje istih problema
⇀ izvršavanje komandi navedenih izmedju ključnih reči `do` i `done` se ponavlja dokle god je uslov tačan
Kako radi?
Ova petlja je petlja ograničenog ulaska - to znači da se uslov proverava pre izvršavanja komandi unutar while petlje. Ako je uslovni izraz tačan, izvršava se skup naredbi koje slede. U suprotnom, petlja se prekida, a kontrolu programa preuzima komanda koja sledi nakon naredbe 'done'.
Primeri:
Primer 1: - osnovni primer
Output:
Primer 2: - beskonačna while petlja
Beskonačna petlja je ona koja se nikad ne završava. Ako je uslov uvek tačan, stvara se ova petlja koja će se izvršavati konstantno dok je nasilno ne zaustavimo komandom CTRL+C :
Output:
Ovde smo koristili ugradjenu komandu (:) koja uvek vraća tačnu vrednost. Za pravljenje beskonačne petlje uvek možemo koristiti i komandu true
Primer 3: - while petlja sa break naredbom
Output:
Primer 4: - while petlja sa continue naredbom
Output:
While petlja je odlična opcija za izvršavanje skupa komandi kada je neki uslov tačan. Medjutim ponekad moramo da izvršimo skup komandi sve dok uslov ne postane tačan. U takvim slučajevima, util petlja je korisna.
Until petlja u Bash skriptu se koristi za ponavljanje niza komandi na osnovu logičkog rezultata izraza.
Skup komandi se izvršava samo dok izraz ne postane tačan. To znači da dok je izraz netačan, skup komandi se izvršava iterativno.
Petlja se prekida čim izraz prvi put postane tačan.
Sintaksa:
until [ uslovni_izraz ];
do
komanda1
komanda2
. . .
. . .
komandaN
done
Ako imamo više uslovnih izraza, sintaksa je sledeća:
until [[ izraz ]];
do
komanda1
komanda2
. . .
. . .
komandaN
done
Bitno:
⇀tačnost uslovnog izraza se proverava pre izvršavanja komandi
⇀komande se izvršavaju samo ako je uslov netačan
⇀petlja se prekida čim se uslov proceni kao tačan.
While i until petlja
⇀komande unutar until petlje se izvrašavaju dok se ne vrati ne-nula vrednost
⇀komande while petlje se izvršavaju dok se ne vrati nula vrednost
⇀until petlja se mora izvršiti barem jednom, dok se while petlja ne mora izvršiti ni jednom
Primeri:
Primer1: - util petlja sa jednim uslovom
Output:
Primer2: - until petlja sa večim brojem uslova
Output:
Kao i u drugim programskim jezicima, niska je tip podataka koji se uglavnom koristi za predstavljanje teksta. Predstavlja kombinaciju skupa znakova koji mogu da sadrže i brojeve.
Na primer, reč "plavo" i rečenica "Nebo je plavo" su niske.
Čak se i "01234" može smatrati niskom, ako je pravilno naveden.
Programeri su obavezni da niske pri navodjenju stave pod navodnike da bi se podaci pravilno tumačili, a neda se tumače kao brojevi, promenljive ili nizovi npr.
1. Operator jednakosti (==)
⇀koristi za proveravanje da li su dve niske jednake
str1 == str2
2. Operator nejednakosti (!=)
⇀koristi se za proveravanje da li su dve niske različite
str1 = str2
3. Operator manje od (\<)
⇀uslovni operator, koristi se za proveru da li je str1 leksikografski manji od str2
str1 \< str2
4. Operator veće od (\>)
⇀uslovni operator, koristi se za proveru da li je str1 leksikografski veći od str2
str1 \> str2
5. Operator za proveru da li niska ima barem jedno slovo:
[ -n niska ]
Primer:
Output:
6. Operator za proveru da li je niska prazna:
[ -z niska ]
Primer:
Output:
Ukupan broj znakova u niski označava dužinu te niske.
Većina programskih jezika ima svoje ugrađene funkcije za izračunavanje broja znakova, tj dužine. Međutim, kod Bash programskog jezika, to nije slučaj. Ali postoji nekoliko načina na koje možemo da pronađemo dužinu niske u Bash skriptovima.
!!!Obratite pažnju na dvostruke navodnike koji se koriste oko $ime_niske. Ako niska ima razmake u sebi, onda su dvostruki navodnici neophodni.
Najbolje je da uvek koristimo dvostruke navodnike oko $ime_niske da bismo bili sigurni da neće doći do zanemarivanja razmaka.
Primeri:
Primer1: najjednostavniji način za pronalaženje dužine niske je korišćenjem simbola '#'
Sintaksa:
${#niska}
Primer2: drugi način za nalaženje dužine niske je korišćenje komande `expr` sa ključnom reči 'length'
Sintaksa:
`expr length "$niska"`
Primer3: takodje, možemo koristiti komandu `expr` je sa narednom sintaksom:
`expr "$str" : ' .*'`
Primer4: možemo koristiti i komandu `wc` za nalaženje dužine stringa
Sintaksa:
`echo $str | wc -c`
Primer4: - možemo koristiti i komandu `awk` za nalaženje dužine niske
Sintaksa:
`echo $str |awk '{print length}'`
Sve komande imaju isti output:
Podniska je niz znakova unutar niske. Bash programski jezik pruža opciju za izdvajanje informacija o podniski iz same niske.
Možete izdvojiti cifre ili dati niz koristeći nekoliko metoda.
Sintaksa:
Sledeća komanda je ugradjena u Bash programski jezik
$ {promenljiva:pozicija:duzina}
Gde je:
⇀ promenljiva - ime promenljive koja sadrži nisku
⇀ pozicija - specificira odakle se počinje sa izdvajanjem podniske
⇀ duzina - specifira raspon karaktera koji se izdvajaju iz date niske, počevši od date pozicije
Primeri:
Primer1: izdavanje članova niske od početka
Primer2: izdavajanje članova niske do kraja
Primer3: izdvajanje odredjene grupe karaktera
Primer4: izdajanje jedinstvenog karaktera
U skriptu, možemo dodati novu ili spojiti dve ili više niski zajedno, tj. moguća je konkatenacija stringova.
U Bash-u ne postoji ni jedna ugradjena funkcija za kombinovanje niski, te je najlakši način za izvođenje konkatenacije stringova u bash-u pisanje promenljivih koje sadrže nisku jednu pored druge.
Osnovna sintaksa:
str3="$str1$str2"
komada će spojiti vrednosti niski str1 i str2 i zapamtiće novu vrednost u promenljivu str3
Primer:
Još neke metode za konkatenaciju stringova:
1. korišćenje duplih navodnika - ovaj metod nam omogućava korišćenje promenljivih koje sadrže vrednost niske, unutar druge niske; promenljiva se može upotrebiti na bilo kom mestu u niski
2. korišćenje operatora (+=) sa petljom - ovaj metod dodaje nove niske na kraj početne niske koja je levi operand
3. korišćenje printf funkcije
4. korišćenje _
5. korišćenje bilo kog znaka
Bash funkcija se može definisati kao skup komandi koje se mogu pozvati nekoliko puta unutar bash skripta. Svrha funkcije u bash-u je da vam pomogne da svoje skripte učinite čitljivijim i da izbegnete pisanje istog koda iznova i iznova. Takođe omogućava programerima da razbiju komplikovan i dugačak kod na male delove koji se mogu pozvati kad god je to potrebno.
Funkcije se mogu pozivati bilo kada i više puta.
Za Bash funkcije važe sledeća pravila:
⇀ funkcija mora biti deklarisana u shell skriptu pre poziva funkcije
⇀ lokalne promenljive se mogu dodeliti unutar funkcije, a životni vek takvih promenljivih biće samo unutar te određene funkcije
⇀ ugrađene komande Bash-a mogu se zameniti korišćenjem funkcija
Sintaksa:
Metoda 1: počinje sa imenom funkcije
ime_funkcije () {
komande
}
Metoda2: počinje ključnom rečju `function`, nakon čega sledi ime funkcije
function ime_funkcije () {
komande
}
Kao i u većini programskih jezika, možemo proslediti argumente funkciji i obraditi podatke u Bash funkcijama. Možemo da ubacimo podatke u funkciju na sličan način kao što prosleđujemo argumenate komandne linije bash skriptu.
Da bismo prosledili bilo koji broj argumenata bash funkciji, od nas se traži da ih ubacimo odmah iza imena funkcije. Moramo primeniti razmake između imena funkcije i argumenata. Takođe će biti odličan izbor da koristite dvostruke navodnike oko argumenata kako biste sprečili pogrešno uparivanje argumenata sa razmacima u njima.
Slede neke ključne tačke o prosleđivanju argumenata bash funkcijama:
⇀datim argumentima se pristupa kao $1, $2, $3 ... $n, što odgovara redosledu kojim navodimo argumente
⇀promenljiva $0 je rezervisana za ime funkcije
⇀promenljiva $# se koristi za čuvanje broja parametara funkcije
⇀promenljive $* i $@ se koriste za pamćenje svih parametara datih funkciji.
- kada se $* koristi sa dvostrukim navodnicima (tj. "$*"), značenje se proširuje na jedan string odvojen razmakom. Na primer, "$1 $2 $n itd".
- kada se $@ koristi sa dvostrukim navodnicima (tj. "$@"), značenje se proširuje na pojedinačne string. Na primer, "$1" "$2" "$n" itd.
Kada se $* i $# ne koriste sa dvostrukim navodnicima, oba imaju istu ulogu
Primer:
U ovom skriptu smo dodali argumente funkcije nakon što smo je pozvali.
Te vrednosti se prosleđuju funkciji kao parametri i čuvaju u lokalnoj promenljivoj.
Međutim, za razliku od drugih jezika, interpreter čuva prosleđene vrednosti u unapred definisanim promenljivima, koje se zatim imenuju u skladu sa redosledom parametara koji se prenose.
Globalne promenljive su promenljive kojima se može pristupiti bilo gde u okviru skripta bez obzira na opseg. Podrazumevano, sve promenljive su definisane kao globalne, čak i ako su deklarisane unutar funkcije.
Takođe možemo stvoriti promenljivu kao lokalnu promenljivu.
Lokalne promenljive se mogu deklarisati unutar tela funkcije pomoću `local` ključne reči kada su koriste po prvi put. One su dostupne samo unutar te funkcije.
Možemo kreirati lokalne promenljive sa istim imenom u različitim funkcijama.
Da bismo dodali lokalnu promenljivu, možemo koristiti sledeću sintaksu:
local ime_promenljive=<vrednost_promenljive>
Primer:
Zaključak:
Ako deklarišemo promenljivu unutar tela funkcije sa istim imenom kao već postojeća globalna promenljiva, onda će ona imati prednost nad globalnom promenljivom.
Globalne promenljive se mogu menjati unutar funkcije.
U većini programskih jezika, funkcije mogu imati povratnu vrednost. To znači da funkcija šalje podatke nazad na prvobitnu lokaciju poziva.
Za razliku od funkcija u 'pravim' programskim jezicima, Bash funkcije ne pružaju podršku za vraćanje vrednosti kada se pozovu.
Međutim, možemo da postavimo status povratka koji je sličan izlaznom statusu programa. Kada se bash funkcija završi, njena povratna vrednost je status poslednjeg izvršenog izraza u funkciji. Vraća 0 za status uspeha, a decimalni broj različit od nule u opsegu 1-255 za neuspeh.
Status povratka se može naznačiti korišćenjem ključne reči 'return', a dodeljuje se promenljivoj $?. Naredba return prekida funkciju i koristi se kao izlazni status funkcije.
Primer:
Niz se može definisati kao kolekcija elemenata sličnog tipa. Za razliku od većine programskih jezika, nizovi u Bash skriptima ne moraju biti kolekcija sličnih elemenata. Niz može da sadrži i niske i brojeve.
Bash ne pruža podršku za višedimenzionalne nizove (ne možemo imati elemente koji su nizovi u sebi)
Bash pruža podršku za jednodimenzionalne numerički indeksirane nizove. Da bismo pristupili numerički indeksiranom nizu počevši sa kraja, možemo koristiti negativne indekse. Indeks '-1' će se smatrati referencom za poslednji element.
Da bi eksplicitno deklarisali nizu Bash-u, koristimo ključnu reč `declare` i sintaksu:
declare -a ime_niza
Metod za stvaranje indeksiranog niza može se opisati na sledeći način:
ime_niza[index_1]=value_1
ime_niza[index_2]=value_2
…
ime_niza[index_n]=value_n
Za pristupanje elementima niza koristimo narednu sintaksu:
echo ${ime_niza[traženi_indeks]}
Sintaksa:
declare -p ime_niza
Jednom kada je niz deklarisan, možemo da primenimo neke korisne operacije na njemu. Možemo da prikažemo njegove indekse i vrednosti, kao i da ih izmenimo dodavanjem ili uklanjanjem elemenata:
Da bismo referencirali jedan element, od nas se traži da znamo indeks tog elementa u nizu, tj. njegovu poziciju.
Možemo referencirati ili odštampati bilo koji element koristeći sledeću sintaksu:
$ {ime_niza[index]}
Da bi odštampali sve elemente niza možemo koristiti sledeću sintaksu:
"$ {ime_niza[@]}"
Takođe možemo da ispišemo indekse elemenata koji se koriste u indeksiranim nizovima. To se može izvesti dodavanjem ! operatora ispred imena niza kao u nastavku:
$ {!ime_niza[index]}
Možemo prebrojati elemente niza, koristeći sledeću sintaksu:
$ {#ime_niza[@]}
Imamo opciju da dodamo elemente u niz tako što ćemo navesti njihov indeks.
Sintaksa:
ime_niza[index_n]="Novi element"
Drugi metod za dodavanje novog elementa u niz je korišćenje += operatora. Nema potrebe da navedete indeks u ovoj metodi.
Ako želimo da izbrišemo element iz niza, moramo znati njegov indeks.
Element se može ukloniti korišćenjem komande 'unset':
unset ime_niza[index]
Brisanje čitavog niza je vrlo jednostavan zadatak. Može se izvesti tako što se ime niza prenese kao argument komandi 'unset' bez navođenja indeksa.
Možemo naći isečak niza od datog početnog indeksa do datog završnog indeksa.
Za nalaženje isečka od početnog indeksa 'm' do završnog indeksa 'n', možemo koristiti sledeću sintaksu:
novi_niz=(“${ime_početnog_niza[@]:m:n}")