BASH Uvod ⇀ Šta je Shell? ⇀ Karakteristike BASH shell−a BASH skripti ⇀ Kako pravimo Bash skripte? ⇀ Kako pokrećemo Bash skripte? ⇀ Prvi program ⇀ Komentari ⇀ Navodnici u Bash-u Promenljive u BASH−u ⇀ Tipovi podataka ⇀ Tipovi promenljivih ⇀ Rad sa promenljivama ⇀ Argumenti komande linije Unos podataka od strane korisnika Datum u BASH−u ⇀ `Date` komanda Aritmetičke operacije ⇀ Duple zagrade ⇀ let konstrukcija ⇀ backticks Bash uslovne naredbe ⇀ If naredba ⇀ Ugnježena if naredba ⇀ If else naredba ⇀ Ugnježdena if-else naredba ⇀ Else if naredba ⇀ Case naredba Bash petlje ⇀ For petlja ⇀ While petlja ⇀ Until petlja Bash niske ⇀ Operatori za rad sa niskama ⇀ Nalaženje dužine niski ⇀ Podniske u Bash-u ⇀ Konkatenacija (spajanje) niski Bash funkcije ⇀ Prosledjivanje argumenata ⇀ Opseg promenljivih ⇀ Povratne vrednosti funkcija Bash nizovi ⇀ Deklaracija nizova ⇀ Pristupanje elementima niza ⇀ Ispisivanje elemenata niza ⇀ Operacije sa nizovima  − Referisanje na jedan element  − Ispisivanje indeksa elemenata niza  − Nalaženje dužine niza  − Dodavanje elementa u niz  − Brisanje elementa niza  − Brisanje celog niza  − Traženje isečka niza (`slice operator`)





BASH

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 .

Uvod

Bash je nastao kao naslednik interpretera Born (engl. Bourne shell), koji je dobio ime po Stivenu Bornu. Ime „Bash“, predstavlja akronim za „Bourne Again Shell“ („Opet Born interpreter“), što je aluzija na „Born again shell“ („Ponovno rođeni interpreter“).

Šta je Shell?

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

Karakteristike BASH shell−a

  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 skripti

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.

Kako pravimo Bash skripte?

  ● 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.

Kako pokrećemo Bash skripte?

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.

Prvi program

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 …
hello world

Korak 4: Kodiranje

Korak 5: Izvršite skript komandom ./.
greska

Dobićete grešku, jer kao što možete da vidite na slici ispod, fajl ima samo dozvolu za čitanje i pisanje
greska2

Korak6: Dodaje dozvolu za izvršavanje komandom narednom komandom:

$ chmod +x bash_script.sh
Sada možemo izvršiti skript :-)
izvrsavanje skripta

Komentari

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 u BASH−u

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)

Tipovi podataka

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.
tipovi


Tipovi promenljivih

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

tipoviProm


Ako želite da saznate listu ovih promenljivih koje postoje na vašem sistemu, ukucajte komande set, env, i printenv

env


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:
tipoviPod2


Rad sa promenljivama

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 =)

prom1


Primer2: ispisivanje i refenciranje promenljivih, korišćenjem komande echo

prom2


Primer3: nevažeće promenljive

prom3


Primer4: kombinovanje više promenljivih
vrednosti promenljivih menjaju njihova imena

prom4


U Bash skriptu:
Za ispisivanje vrednosti promenljivih, isto kao i u terminalu koristimo komandu echo.
Pravila za manipulaciju promenljivima su identična
Primer:

prom5


Argumenti komande linije

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
argumenti


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

argumenti1


argumenti2


Unos podataka od strane korisnika

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:
unos1
Output:
unos2

−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:

unos3
unos4

−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>

unos5
unos6

−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
unos7
Output:
unos8

Datum u BASH−u

Bash shell pruža različite komande za rad sa datumima zajedno sa različitim opcijama formatiranja.

`Date` komanda

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

Aritmetičke operacije

  ⇀ 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:

Duple zagrade

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 konstrukcija

`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:
let1
Output:
let2

backticks

⇀ `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: backticks1
Output: backticks2

Bash uslovne naredbe

If naredba

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

if1
Output:
if2

Primer2: Koristimo AND operator da bi u izraz uključili više uslova

if3
Output:
if4

Primer3: Poredimo brojeve

štampaju se samo oni stringovi gde je uslov zadovoljen
if5
Output:
if6

Ugnježena if naredba

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

uif1
Output:
uif2

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 naredba

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.
ifelse1
Output: ifelse2

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:
ifelse3
Output:
ifelse4

Ugnježdena if-else naredba

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:
uifelse1
Output:
uifelse2

Else if naredba

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:
elif1

Output:
Slučaj1: ako unesemo br 110 onda je uslov u if naredbi tačan, pa dobijamo output:
elif2

Slučaj2: ako unesemo broj 90, onda je uslov u elif naredbi tačan, pa dobijamo output:
elif3

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:
elif4

Case naredba

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:
case1
Output:
case2

Bash petlje

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.

For petlja

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
for1
Output:
for2

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.

for3
for4

for5
for6

Primer3: iteracija kroz niz
for7
for8

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.

for9
for10

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.
for11
for12

While petlja

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
while1
Output:
while2

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 :

while3
Output:
while4

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
while5
Output:
while6

Primer 4: - while petlja sa continue naredbom
while7
Output:
while8

Until petlja

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
until1
Output:
until2

Primer2: - until petlja sa večim brojem uslova
until3
Output:
until4

Bash niske

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.

Operatori za rad sa niskama

  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:

opniske1
Output:
opniske2

  6. Operator za proveru da li je niska prazna:
[ -z niska ]
Primer:

opniske3
Output:
opniske4

Nalaženje dužine niski

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}
nalazenje1

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"`
nalazenje2

Primer3: takodje, možemo koristiti komandu `expr` je sa narednom sintaksom:

`expr "$str" : ' .*'`
nalazenje3

Primer4: možemo koristiti i komandu `wc` za nalaženje dužine stringa

Sintaksa:

`echo $str | wc -c`
nalazenje4

Primer4: - možemo koristiti i komandu `awk` za nalaženje dužine niske

Sintaksa:

`echo $str |awk '{print length}'`
nalazenje5

Sve komande imaju isti output:

nalazenje6

Podniske u Bash-u

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

podniske1
podniske2

Primer2: izdavajanje članova niske do kraja

podniske3
podniske4

Primer3: izdvajanje odredjene grupe karaktera

podniske5
podniske6

Primer4: izdajanje jedinstvenog karaktera

podniske7
podniske8

Konkatenacija (spajanje) niski

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:

konkatenacija1
konkatenacija2

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

konkatenacija3
konkatenacija4

  2. korišćenje operatora (+=) sa petljom - ovaj metod dodaje nove niske na kraj početne niske koja je levi operand

konkatenacija5
konkatenacija6

  3. korišćenje printf funkcije

konkatenacija7
konkatenacija8

  4. korišćenje _

konkatenacija9
konkatenacija10

  5. korišćenje bilo kog znaka
konkatenacija11
konkatenacija12

Bash funkcije

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
}

bfje1

Metoda2: počinje ključnom rečju `function`, nakon čega sledi ime funkcije

function ime_funkcije () {
  komande
}

bfje2

Prosledjivanje argumenata

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.

proslarg1
proslarg2

Opseg promenljivih

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:

opseg1

opseg2

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.

Povratne vrednosti funkcija

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:

pvf1
pvf2

Bash nizovi

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.

Deklaracija nizova

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

Pristupanje elementima niza

Za pristupanje elementima niza koristimo narednu sintaksu:

echo ${ime_niza[traženi_indeks]}

Ispisivanje elemenata niza

Sintaksa:

declare -p ime_niza

Operacije sa nizovima

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:

Referisanje na jedan element

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[@]}"

Ispisivanje indeksa elemenata 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]}

Nalaženje dužine niza

Možemo prebrojati elemente niza, koristeći sledeću sintaksu:

$ {#ime_niza[@]}

Dodavanje elementa u niz

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.

Brisanje elementa niza

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 celog niza

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.

Traženje isečka niza (`slice operator`)

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}")