Danas ćemo razgovarati o bash skriptama. To su , napisani za bash ljusku. Postoje i druge ljuske, kao što su zsh, tcsh, ksh, ali ćemo se fokusirati na bash. Ovaj materijal je namijenjen svima koji žele, jedini uvjet je vještina rada u Linux-a.
Naredbeni skripti su skupovi istih onih naredbi koje se mogu unositi s tipkovnice, okupljeni u datoteke i povezani zajedničkim ciljem. Pri tome, rezultati rada naredbi mogu imati vlastitu vrijednost ili služiti kao ulazni podaci za druge naredbe. Skripte su moćan način automatizacije često izvođenih radnji.
Dakle, kada govorimo o naredbenom retku, on omogućava izvršavanje više naredbi odjednom unošenjem kroz točku i zarez:
pwd ; whoami Uistinu, ako ste to isprobali u svom terminalu, vaša prva bash skripta, u kojoj su uključene dvije naredbe, je već napisana. Funkcionira ovako. Prvo, naredba pwd ispravlja na ekranu informacije o trenutnom radnom direktoriju, zatim naredba whoamiprikazuje podatke o korisniku pod kojim ste prijavljeni u sustav.
Koristeći sličan pristup, možete kombinirati koliko god želite naredbi u jednoj liniji, ograničenje je samo u maksimalnom broju argumenata koje možete prenijeti programu. Ovo ograničenje možete odrediti pomoću komande:
getconf ARG_MAXNaredbeni redak je sjajan alat, ali naredbe se moraju unositi svaki put kada su potrebne. Što ako zapišemo skup naredbi u datoteku i jednostavno pozovemo tu datoteku za njihovo izvršavanje? U stvari, ta datoteka o kojoj govorimo se naziva skriptom naredbenog retka.
Kako su organizirani bash skripti
Stvorite prazan fajl pomoću komande touch. U prvom redu potrebno je navesti koju točno ljusku namjeravamo koristiti. Interesiraju nas bash, stoga će prvi redak datoteke izgledati ovako:
#!/bin/bash U ostalim redovima ove datoteke simbol hash koristi se za označavanje komentara koje ljuska ne obrađuje. Međutim, prvi redak je poseban slučaj; ovdje se koristi hash, iza kojeg slijedi uskličnik (ovaj niz nazivamo ) i put do bash, što sustavu signalizira da je skripta stvorena upravo za bash.
Komande ljuske odvajaju se znakom novog retka, a komentari se ističu znakom hasha. Ovako to izgleda:
#!/bin/bash
# This is a comment
pwd
whoamiOvdje, kao i u komandnoj liniji, moguće je zapisivati komande u jednom retku, odvajajući ih točkom i zarezom. Ipak, ako pišete komande u različitim redovima, datoteka je lakša za čitanje. U svakom slučaju, ljuska će ih obraditi.
Postavljanje dopuštenja za datoteku skripte
Spremite datoteku pod imenom myscript, i posao oko stvaranja bash skripte gotovo je gotov. Sada ostaje samo učiniti ovu datoteku izvršnom, inače, pokušavajući je pokrenuti, naići ćete na pogrešku Permission denied.

Pokušaj pokretanja datoteke skripte s pogrešno postavljenim dopuštenjima
Učinit ćemo datoteku izvršnom:
chmod +x ./myscriptSada ćemo pokušati izvršiti:
./myscriptNakon postavljanja dopuštenja, sve radi kako treba.

Uspješan početak bash skripte
Ispis poruka
Za ispis teksta u Linux konzoli koristi se komanda echo. Iskoristit ćemo to znanje i urediti našu skriptu dodajući objašnjenja podacima koje već postojeće komande ispisuju:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiEvo što će se dogoditi nakon pokretanja ažurirane skripte.

Ispis poruka iz skripte
Sada možemo ispisivati objašnjenja koristeći komandu echo. Ako ne znate kako urediti datoteku koristeći alate Linuxa, ili nikad prije niste koristili komandu echo, pogledajte na materijali.
Korištenje varijabli
Varijable omogućuju pohranu informacija u datoteci skripte, primjerice — rezultate rada komandi za korištenje od strane drugih komandi.
Nema ništa loše u izvršavanju pojedinačnih komandi bez pohrane rezultata njihova rada, ali mogućnosti takvog pristupa su vrlo ograničene.
Postoje dvije vrste varijabli koje se mogu koristiti u bash skriptama:
- Varijable okruženja
- Korisničke varijable
Varijable okruženja
Ponekad je potrebno raditi sa sistemskim podacima unutar shell skripti. Na primjer, evo kako prikazati početni direktorij trenutnog korisnika:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Obratite pažnju da možemo koristiti sistemsku varijablu $HOME unutar dvostrukih navodnika, to neće omesti sistem da je prepozna. Evo šta će se dogoditi kada izvršimo prethodno navedeni skript.

Korišćenje varijable okruženja u skripti
A šta ako želimo ispisati simbol dolara na ekranu? Pokušajmo ovako:
echo "I have $1 in my pocket" Sistem će uočiti znak dolara unutar stringa u navodnicima i shvatiti da se pozivamo na varijablu. Skript će pokušati prikazati vrednost nedovoljne varijable $1. To nije ono što nam treba. Šta raditi?
U ovakvoj situaciji može pomoći korišćenje kontrolnog karaktera, obrnutog kosa crta, ispred znaka dolara:
echo "I have $1 in my pocket"Sada će skript ispisati ono što se očekuje.

Korišćenje kontrolne sekvence za ispisivanje znaka dolara
Korisničke varijable
Pored varijabli okruženja, bash skripte omogućavaju definisanje i korišćenje sopstvenih varijabli unutar skripte. Ove varijable čuvaju vrednost sve dok se izvršavanje skripte ne završi.
Kao i sa sistemskim varijablama, korisničkim varijablama može se pristupiti koristeći znak dolara:
TNW-CUS-FMP — promo kod za 10% popusta na naše usluge, dostupan za aktivaciju u roku od 7 dana
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Evo šta će se dogoditi nakon pokretanja ovakvog skripta.

Korisničke varijable u skripti
Umetanje komandi
Jedna od najkorisnijih mogućnosti bash skripti je mogućnost izvlačenja informacija iz izlaza komandi i dodeljivanja tih informacija varijablama, što omogućava korišćenje tih informacija bilo gde u datoteci skripte.
To se može učiniti na dva načina.
- Korišćenjem obrnutog apostrofa «`»
- Korišćenjem konstrukcije
$()
Koristeći prvi pristup, pobrinite se da ne unesete običnu navodnu umesto obrnutog apostrofa. Komanda treba biti obuhvaćena sa dva takva znaka:
mydir=`pwd`Pri drugom pristupu, to je zapisano ovako:
mydir=$(pwd)I konačni skript može izgledati ovako:
#!/bin/bash
mydir=$(pwd)
echo $mydir Tokom njegovog izvršavanja, izlaz komande pwdbiće sačuvan u varijabli mydir, čiji sadržaj će, pomoću komande echo, biti poslat u konzolu.

Skript koji čuva rezultate rada komande u varijabli
Matematičke operacije
Za izvođenje matematičkih operacija u skriptnom datoteci možete koristiti konstrukciju poput $(a+b):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Matematičke operacije u skripti
Kontrolna konstrukcija if-then
U nekim scenarijima potrebno je upravljati tokom izvršenja komandi. Na primjer, ako je neko vrednost veća od pet, treba izvršiti jednu radnju, u suprotnom - drugu. Ovo je primenjivo u mnogo situacija, i ovde će nam pomoći kontrolna konstrukcija if-then. U svom najjednostavnijem obliku izgleda ovako:
if komanda
then
komande
fiEvo radnog primera:
#!/bin/bash
if pwd
then
echo "It works"
fi U ovom slučaju, ako izvršenje komande pwdzavrši uspešno, u konzoli će se ispisati tekst „it works“.
Iskoristimo svoje postojeće znanje i napišimo složeniju skriptu. Recimo, potrebno je pronaći neku korisnika u /etc/passwd, i ako ga pronađemo, obavestiti o tome da postoji.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiEvo šta se dešava nakon pokretanja ove skripte.

Pretraga korisnika
Ovde smo koristili komandu grepza pretragu korisnika u datoteci /etc/passwd. Ako vam komanda grepnije poznata, opis možete pronaći .
U ovom primeru, ako je korisnik pronađen, skripta će ispisati odgovarajuću poruku. A ako korisnika nije moguće pronaći? U tom slučaju, skripta će se jednostavno završiti, ne obavestivši nas o tome. Hteli bismo da nam kaže i to, pa ćemo poboljšati kod.
Kontrolna konstrukcija if-then-else
Kako bi program mogao obavestiti i o rezultatima uspešne pretrage, i o neuspehu, koristićemo konstrukciju if-then-else. Evo kako je postavljena:
if komanda
then
komande
else
komande
fi Ako prva komanda vrati nulu, što znači njeno uspešno izvršenje, uslov će biti istinit i izvršavanje neće ići po grani else. U suprotnom, ako bude vraćena nešto što se razlikuje od nule, što će značiti neuspeh ili lažan rezultat, izvršiće se komande koje su postavljene nakon else.
Napišimo takvu skriptu:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Njeno izvršavanje je išlo po grani else.

Pokretanje skripte sa konstrukcijom if-then-else
Pa, nastavljamo dalje i postavljamo pitanje o složenijim uvjetima. Što ako treba provjeriti ne jedan uvjet, već nekoliko? Na primjer, ako je potrebni korisnik pronađen, treba ispisati jednu poruku, ako se izvršava još koji uvjet — još jedna poruka, i tako dalje. U takvim će nam slučajevima pomoći ugniježdeni uvjeti. Izgleda ovako:
if команда1
then
команды
elif команда2
then
команды
fi Ako prva komanda vrati nulu, što ukazuje na njezino uspješno izvršenje, izvršit će se komande u prvom bloku. then, inače, ako je prvi uvjet lažan, i ako druga komanda vrati nulu, izvršit će se drugi blok koda.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi U sličnom skriptu možemo, na primjer, stvoriti novog korisnika koristeći komandu useradd, ako pretraživanje nije dalo rezultate, ili učiniti još nešto korisno.
Usporedba brojeva
U skriptama se mogu uspoređivati brojčane vrijednosti. Ispod je popis odgovarajućih komandi.
n1 -eq n2Vraća istinitu vrijednost akon1jednakon2.
n1 -ge n2Vraća istinitu vrijednost akon1veće ili jednakon2.
n1 -gt n2Vraća istinitu vrijednost akon1višen2.
n1 -le n2Vraća istinitu vrijednost akon1manje ili jednakon2.
n1 -lt n2Vraća istinitu vrijednost ako je n1 manjen2.
n1 -ne n2Vraća istinitu vrijednost akon1nije jednakon2.
Kao primjer isprobajmo jedan od operatora usporedbe. Obratite pažnju na to da je izraz zatvoren u uglaste zagrade.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiEvo što će ispisati ova komanda.

Usporedba brojeva u skriptama
Vrijednost varijable val1veće od 5, u konačnici se izvršava grana thenoperatora usporedbe i na konzoli se ispisuje odgovarajuća poruka.
Usporedba stringova
U scenarijima se mogu uspoređivati i string vrijednosti. Operator usporedbe izgleda prilično jednostavno, no operacije usporedbe stringova imaju određene osobitosti na koje ćemo se osvrnuti u nastavku. Evo popisa operatora.
str1 = str2Provjerava stringove na jednakost, vraća istinu ako su stringovi identični.
str1 != str2Vraća istinu ako stringovi nisu identični.
str1 < str2Vraća istinu ako jestr1manje odstr2.
str1 > str2Vraća istinu ako jestr1veće odstr2.
-n str1Vraća istinu ako je dužinastr1veća od nule.
-z str1Vraća istinu ako je dužinastr1jednako nuli.
Evo primjer usporedbe stringova u scenariju:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiKao rezultat izvršenja skripte dobit ćemo sljedeće.

Usporedba stringova u skriptama
Evo jedne karakteristike usporedbe nizova koju vrijedi spomenuti. Naime, operatori „>” i „” kao naredbu za preusmjeravanje izlaza.
Evo kako rad s tim operatorima izgleda u kodu:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiEvo rezultati rada skripte.

Usporedba nizova, ispisana upozorenja
Obratite pažnju na to da skripta, iako se izvršava, ispisuje upozorenje:
./myscript: linija 5: [: previše argumenata Kako bismo se riješili ovog upozorenja, stavit ćemo $val2 u dvostruke navodnike:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiSada sve radi kako treba.

Usporedba stringova
Još jedna karakteristika operatora „>” i „<” je kako rade s velikim i malim slovima. Da bismo razumjeli ovu karakteristiku, pripremit ćemo tekstualnu datoteku s ovim sadržajem:
Likegeeks
likegeeks Spremit ćemo je pod imenom myfile, nakon čega ćemo izvršiti takvu naredbu u terminalu:
sort myfileSortirat će nizove iz datoteke ovako:
likegeeks
Likegeeks Komanda sort, prema zadanim postavkama, sortira nizove u rastućem redoslijedu, što znači da su mala slova u našem primjeru manja od velikih. Sada ćemo pripremiti skriptu koja uspoređuje iste nizove:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAko je pokrenemo, ispostavit će se da je sve obrnuto — mala slova su sada veća od velikih.

Naredba sort i usporedba nizova u skriptnom datoteci
U naredbama usporedbe velika slova su manja od malih. Usporedba nizova ovdje se vrši usporedbom ASCII kodova znakova, pa slijed sortiranja ovisi o kodovima znakova.
Komanda sort, s druge strane, koristi redoslijed sortiranja postavljen u postavkama sistemskog jezika.
Provjere datoteka
Vjerojatno su sljedeće naredbe najčešće korištene u bash skriptama. One omogućuju provjeru različitih uvjeta koji se odnose na datoteke. Evo popisa tih naredbi.
-d fileProvjerava postoji li datoteka i je li direktorij.
-e fileProvjerava postoji li datoteka.
-f fileProvjerava postoji li datoteka i je li ona datoteka.
-r fileProvjerava postoji li datoteka i je li dostupna za čitanje.
-s fileProvjerava postoji li datoteka i nije li prazna.
-w fileProvjerava postoji li datoteka i je li dostupna za pisanje.
-x fileProvjerava postoji li datoteka i je li izvršna.
file1 -nt file2Provjerava je li noviji odfile1, negofile2.
file1 -ot file2Provjerava je li stariji odfile1, negofile2.
-O datotekaProvjerava postoji li datoteka i je li njezin vlasnik trenutni korisnik.
-G datotekaProvjerava postoji li datoteka i odgovara li njezin identifikator grupe identifikatoru grupe trenutnog korisnika.
Ove komande, kao i mnoge druge koje smo danas razmatrali, lako se pamte. Njihova imena, kao skraćenice od različitih reči, jasno ukazuju na provjere koje obavljaju.
Pokušajmo jednu od komandi u praksi:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiOvaj skript, za postojeću direktoriju, ispisat će njezinu sadržinu.

Ispis sadržaja direktorija
Pretpostavljamo da ćete se s ostalim komandama moći eksperimentirati sami, sve se primjenjuju na isti način.
Zaključci
Danas smo govorili o tome kako započeti pisanje bash skripti i razmatrali određene osnovne stvari. Zapravo, tema bash programiranja je ogromna. Ovaj članak je prijevod prvog dijela velike serije od 11 materijala. Ako želite nastavak odmah — evo popisa originala tih materijala. Iz praktičnosti, ovdje je uključen i onaj čiji ste prijevod upravo pročitali.
- — ovdje se radi o tome kako početi s izradom bash skripti, razmatra se korištenje varijabli, opisuju se uvjetne konstrukcije, izračuni, usporedbe brojeva, nizova, kao i pribavljanje informacija o datotekama.
- — ovdje se razmatraju karakteristike rada s petljama for i while.
- — ovaj materijal je posvećen parametrima naredbenih linija i ključevima koji se mogu proslijediti skriptama, radu s podacima koje unosi korisnik i koje se mogu čitati iz datoteka.
- — ovdje se radi o deskriptorima datoteka i radu s njima, o tokovima ulaza, izlaza, grešaka, kao i preusmjeravanju izlaza.
- — ovaj materijal je posvećen signalima u Linuxu, njihovoj obradi u skriptama, pokretanju scenarija prema rasporedu.
- — ovdje možete saznati o stvaranju i korištenju funkcija u skriptama, o razvoju biblioteka.
- — ovaj članak je posvećen radu s tekstualnim uređivačem sed.
- — ovaj materijal je posvećen programiranju u jeziku za obradu podataka awk.
- — ovdje možete pročitati o korištenju regularnih izraza u bash skriptama.
- — ovdje su prikazani načini rada s porukama koje se mogu slati korisnicima, kao i metodologija praćenja diska.
- — ovaj materijal se bavi alatom Expect, uz pomoć kojeg se može automatizirati interakcija s interaktivnim alatima. Konkretno, ovdje se govori o expect skriptama i njihovoj interakciji s bash skriptama i drugim programima.
Vjerujemo da jedna od vrijednih osobina ovog niza članaka leži u tome što, počinjući od najjednostavnijeg, nedostupnog za korisnike bilo kojeg nivoa, postupno vodi do prilično ozbiljnih tema, dajući priliku svima koji žele napredovati u stvaranju skripti za naredbeni redak Linuxa.
Dragi čitatelji! Molimo gurue bash programiranja da podijele svoja iskustva o tome kako su dostigli vrhunac vještine, te da podijele svoje tajne, a od onih koji su tek napisali svoju prvu skriptu očekujemo dojmove.
Samo registrirani korisnici mogu sudjelovati u anketi. , molimo.
Treba li prevesti ostale dijelove ciklusa članaka?
Da!
Ne, ne treba
Glasalo je 1030 korisnika. Suzdržalo se 106 korisnika.
Izvor: habr.com
