- Funkcije vam omogućavaju da enkapsulirate blokove koda kako biste izbjegli redundantnost i poboljšali čitljivost skripti.
- Bitno je upravljati opsegom varijabli koristeći ključnu riječ local kako bi se izbjegli konflikti s globalnim okruženjem.
- Vraćanje vrijednosti u Bashu je ograničeno na izlazno stanje (0-255), što zahtijeva upotrebu echo-a ili varijabli za vraćanje složenih podataka.
- Modularizacija korištenjem naredbe source olakšava ponovnu upotrebu funkcija u više sistemskih datoteka.
Kada počnete pisati Bash skripte, normalno je da sve u početku izgleda jednostavno, ali dođe trenutak kada kod postane pravi haos. Ako ste primijetili da kopirate i lijepite iste dijelove naredbi iznova i iznova, vrijeme je da pređete na funkcije. U osnovi, funkcija je poput malog skripta unutar drugog skripta koji vam omogućava da date ime skupu instrukcija kako biste ih mogli pozvati kad god želite.
Ne radi se samo o uštedi vremena kucanja, već o usvajanju profesionalne prakse. Izbjegavanjem ponavljanja koda drastično smanjujete mogućnost grešaka i, prije svega, znatno olakšavate održavanje. Ako trebate promijeniti poslovno pravilo ili ispraviti grešku, to trebate učiniti samo na jednom mjestu umjesto da pretražujete cijelu datoteku tražeći gdje ste ga još ponovili.
Kako deklarisati funkcije u Bashu
Za izvršavanje funkcije, Bash nudi nekoliko načina, tako da možete koristiti koji god želite. Najčešći i preferirani način je napisati ime funkcije nakon čega slijede zagrade. Na primjer: mi_funcion() { comandos; }Postoji i eksplicitnija sintaksa koja koristi rezerviranu riječ Funkcija prije imena, iako ga je rjeđe naći u modernim pismima.
Ako ste u žurbi i želite sve definirati u jednom redu, možete to učiniti, ali pazite na razmake! Veoma je važno ostaviti razmak. razmak nakon otvarajućeg ključa i prije završne naredbe, pored odvajanja internih naredbi tačka-zarezom. Na primjer: nombre() { echo "Hola"; echo "Mundo"; }Ako zaboravite ove detalje, Bash će se žaliti i skripta se neće pokrenuti.
Ključna stvar koju ne smijete previdjeti je da deklarisanje funkcije ne znači da će se ona automatski izvršiti. Da bi kod unutar vitičastih zagrada zaživio, morate pozvati funkciju po imenu u tijelu skripte. Također, uvijek zapamtite da definirate funkciju prije nego što je pokušate koristiti ; ako je pozovete prije deklarisanja, shell neće znati o čemu govorite i izbaciće grešku.
Igra varijabli: Globalni i lokalni opseg
Ovdje se mnogi ljudi zbune. Podrazumevano, u Bashu, svaka varijabla koju kreirate je globalna . To znači da ako definišete varijablu unutar funkcije, ona će nastaviti da postoji i zadržava svoju vrijednost izvan te funkcije, što potencijalno može uticati na druge dijelove programa. Ovo može biti korisno, ali u velikim skriptama, to je često recept za katastrofu.
Da biste izbjegli ova iznenađenja, postoji ključna riječ `local` . Deklarisanjem varijable kao `local` unutar funkcije, osiguravate da je ona vidljiva i mijenja se samo unutar tog bloka koda. Ako imate globalnu varijablu i lokalnu varijablu s istim imenom, lokalna varijabla će imati prednost dok je unutar funkcije, ali kada se funkcija završi, globalna varijabla će se vratiti na svoju prvobitnu, nepromijenjenu vrijednost.
Predavanje argumenata funkcijama
Funkcije ne moraju biti statične; one mogu primati podatke za obradu različitih informacija svaki put kada se pozovu. Da biste proslijedili argumente, jednostavno ih napišite nakon imena funkcije, odvojene razmacima. Unutar funkcije, pristupat ćete im koristeći pozicijske varijable como $1, $2, Itd
Važno je razlikovati da su ove varijable nezavisne od argumenata koje prima glavni skript. $0 uvijek se odnosi na naziv skripte, varijable iz $1 gore $9 Unutar funkcije, ovo se konkretno odnosi na parametre koji se prosljeđuju toj funkciji. Osim toga, imamo korisne alate kao što su $# da saznate koliko je argumenata primljeno ili $@ da biste pogledali kompletnu listu parametara.
Dilema vraćanja vrijednosti
Za razliku od jezika kao što su Python ili Java, Bash funkcije ne vraćaju vrijednosti u tradicionalnom smislu. Šta naredba vraća return je izlazni status, cijeli broj između 0 i 255. Po konvenciji, 0 označava da je sve prošlo glatko (uspjeh), a bilo koji drugi broj predstavlja kod greške.
Ako trebate preuzeti rezultat izračuna ili neki tekst, imate dvije glavne opcije. Prva je korištenje globalne varijable za pohranjivanje rezultata, iako ovo nije najčišći pristup. Elegantnija opcija je korištenje standardni izlaz pomoću naredbe echo o printf i uhvatite taj rezultat izvana korištenjem zamjene naredbi: resultado=$(mi_funcion)Na ovaj način, vrijednost koju funkcija ispisuje pohranjuje se direktno u varijablu.
Napredna ponovna upotreba i rekurzija
Jedan od dragulja Basha je mogućnost organiziranja funkcija u odvojene datoteke. Ako imate skup alata koje koristite u mnogim skriptama, možete ih spremiti u datoteku (na primjer, utils.shi učitajte ih u bilo koju drugu skriptu pomoću naredbe izvor (ili poenta) .Ovo pretvara vaše funkcije u naredbe dostupne u trenutnom procesu, optimizirajući vrijeme razvoja.
Za one avanturističkije, postoje rekurzivne funkcije , koje pozivaju same sebe. Idealne su za rješavanje problema koji se mogu podijeliti na identične podzadatke, kao što je izračunavanje faktorijela. Ključno je uvijek definirati osnovni slučaj ; u suprotnom, funkcija će beskonačno pozivati samu sebe dok sistem ne potroši resurse i skripta se ne sruši.
Savladavanje korištenja funkcija omogućava vam da transformišete linearne i zamorne skripte u modularne alate koji se lako čitaju i održavaju. Od ispravne deklaracije i inteligentnog upravljanja varijabilnim opsegom, do korištenja rekurzije i uvoza eksternih biblioteka putem izvornog koda, ove mogućnosti čine Bash shell izuzetno moćnim okruženjem za automatizaciju za svakog sistem administratora ili programera.