Danas ćemo govoriti o bash skriptama. ovo - skripte naredbenog retka, napisano za bash ljusku. Postoje i druge ljuske kao što su zsh, tcsh, ksh, ali mi ćemo se fokusirati na bash. Ovaj materijal je namijenjen svima, jedini uvjet je sposobnost rada u naredbeni redak Linux.
Skripte naredbenog retka su zbirke istih naredbi koje se mogu unijeti s tipkovnice, skupljene u datoteke i objedinjene nekom zajedničkom svrhom. U tom slučaju rezultati rada timova mogu imati neovisnu vrijednost ili poslužiti kao ulazni podaci za druge timove. Skripte su moćan način automatizacije radnji koje se često izvode.
Dakle, ako govorimo o naredbenom retku, on vam omogućuje izvršavanje nekoliko naredbi odjednom unosom odvojenih točkom i zarezom:
pwd ; whoami
Zapravo, ako ste ovo pokušali na svom terminalu, vaša prva bash skripta koja uključuje dvije naredbe već je napisana. Radi ovako. Tim prvi pwd prikazuje informacije o trenutnom radnom direktoriju, zatim naredbu whoamiprikazuje podatke o korisniku pod kojim ste prijavljeni.
Koristeći ovaj pristup, možete kombinirati koliko god želite naredbi u jednom retku, jedino ograničenje je najveći broj argumenata koji se mogu proslijediti programu. Ovo ograničenje možete definirati pomoću sljedeće naredbe:
getconf ARG_MAX
Naredbeni redak je izvrstan alat, ali u njega morate unositi naredbe svaki put kada vam zatrebaju. Što ako smo napisali skup naredbi u datoteku i jednostavno pozvali tu datoteku da ih izvrši? Zapravo, datoteka o kojoj govorimo zove se skripta naredbenog retka.
Kako rade bash skripte
Stvorite praznu datoteku pomoću naredbe touch. Njegov prvi red mora naznačiti koju ljusku ćemo koristiti. Zanima nas bash, tako da će prvi redak datoteke biti:
#!/bin/bash
Ostali redovi u ovoj datoteci koriste hash simbol za označavanje komentara koje ljuska ne obrađuje. Međutim, prvi red je poseban slučaj, tu je hash nakon kojeg slijedi uskličnik (ovaj niz se zove šajkača) i put do bash, pokazuju sustavu za koji je skripta posebno stvorena bash.
Naredbe ljuske odvojene su povlačenjem retka, komentari su odvojeni znakom hash. Ovako to izgleda:
#!/bin/bash
# This is a comment
pwd
whoami
Ovdje, baš kao iu naredbenom retku, možete pisati naredbe u jednom retku, odvojene točkom i zarezom. Međutim, ako naredbe pišete u različite retke, datoteku je lakše čitati. U svakom slučaju, školjka će ih obraditi.
Postavljanje dopuštenja datoteke skripte
Spremite datoteku dajući joj naziv myscript, a rad na izradi bash skripte je skoro završen. Sada sve što preostaje je napraviti ovu datoteku izvršnom, inače, ako je pokušate pokrenuti, naići ćete na pogrešku Permission denied.
Pokušaj pokretanja datoteke skripte s netočno konfiguriranim dopuštenjima
Učinimo datoteku izvršnom:
chmod +x ./myscript
Sada pokušajmo to izvršiti:
./myscript
Nakon postavljanja dopuštenja sve radi kako treba.
Bash skripta je uspješno pokrenuta
Izlaz poruke
Za izlaz teksta na Linux konzolu, koristite naredbu echo. Iskoristimo znanje o ovoj činjenici i uredimo našu skriptu, dodajući objašnjenja podacima koje izlaze naredbe koje su već u njoj:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Ovo se događa nakon pokretanja ažurirane skripte.
Izlaz poruka iz skripte
Sada pomoću naredbe možemo prikazati bilješke s objašnjenjima echo. Ako ne znate kako urediti datoteku pomoću Linux alata ili niste prije vidjeli naredbu echo, Pogledaj ovo materijal.
Korištenje varijabli
Varijable vam omogućuju pohranjivanje informacija u datoteku skripte, kao što su rezultati naredbi, za korištenje drugim naredbama.
Nema ništa loše u izvršavanju pojedinačnih naredbi bez pohranjivanja njihovih rezultata, ali ovaj je pristup prilično ograničen u svojim mogućnostima.
Postoje dvije vrste varijabli koje se mogu koristiti u bash skriptama:
Varijable okruženja
Korisničke varijable
Varijable okruženja
Ponekad naredbe ljuske moraju raditi s nekim sistemskim podacima. Evo primjera kako prikazati početni direktorij trenutnog korisnika:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Imajte na umu da možemo koristiti varijablu sustava $HOME u dvostrukim navodnicima, to neće spriječiti sustav da ga prepozna. Ovo ćete dobiti ako pokrenete gornji scenarij.
Korištenje varijable okoline u skripti
Što ako trebate prikazati znak dolara na ekranu? Pokušajmo ovo:
echo "I have $1 in my pocket"
Sustav će detektirati znak dolara u citiranom nizu i pretpostaviti da smo referencirali varijablu. Skripta će pokušati prikazati vrijednost nedefinirane varijable $1. Ovo nije ono što nam treba. Što uraditi?
U ovoj situaciji pomoći će korištenje znaka za izlaz, obrnute kose crte, prije znaka dolara:
echo "I have $1 in my pocket"
Skripta će sada ispisati točno ono što se očekuje.
Korištenje izlazne sekvence za ispis znaka dolara
Korisničke varijable
Uz varijable okruženja, bash skripte vam omogućuju definiranje i korištenje vlastitih varijabli u skripti. Takve varijable drže vrijednost sve dok skripta ne završi izvršenje.
Kao i sistemskim varijablama, korisničkim varijablama može se pristupiti pomoću znaka 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"
To se događa nakon pokretanja takve skripte.
Prilagođene varijable u skripti
Zamjena naredbi
Jedna od najkorisnijih značajki bash skripti je mogućnost izvlačenja informacija iz izlaza naredbe i njihovog dodjeljivanja varijablama, što vam omogućuje korištenje tih informacija bilo gdje u datoteci skripte.
To se može učiniti na dva načina.
Korištenje povratne kvačice "`"
Po dizajnu $()
Kada koristite prvi pristup, pazite da ne uključite jedan navodnik umjesto kvačice. Naredba mora biti zatvorena u dvije takve ikone:
mydir=`pwd`
U drugom pristupu, ista stvar se piše ovako:
mydir=$(pwd)
A skripta bi na kraju mogla izgledati ovako:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Tijekom svog rada, izlaz naredbe pwdće se spremiti u varijablu mydir, čiji se sadržaj pomoću naredbe echo, otići će na konzolu.
Skripta koja sprema rezultate naredbe u varijablu
Matematičke operacije
Za izvođenje matematičkih operacija u datoteci skripte, možete koristiti konstrukciju poput $((a+b)):
U nekim scenarijima morate kontrolirati tijek izvršavanja naredbi. Na primjer, ako je određena vrijednost veća od pet, morate izvršiti jednu radnju, u suprotnom drugu. Ovo je primjenjivo u mnogim situacijama, a tu će nam kontrolna struktura pomoći if-then. U svom najjednostavnijem obliku to izgleda ovako:
if команда
then
команды
fi
Evo primjera rada:
#!/bin/bash
if pwd
then
echo "It works"
fi
U ovom slučaju, ako se naredba izvrši pwduspješno završi, na konzoli će se prikazati tekst "to radi".
Iskoristimo znanje koje imamo i napišimo složeniju skriptu. Recimo da trebamo pronaći određenog korisnika /etc/passwd, a ako ste ga uspjeli pronaći javite da postoji.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Ovo se događa nakon pokretanja ove skripte.
Pretraga korisnika
Ovdje smo upotrijebili naredbu grepza traženje korisnika u datoteci /etc/passwd. Ako tim grepkoji vam nije poznat, možete pronaći njegov opis здесь.
U ovom primjeru, ako je korisnik pronađen, skripta će prikazati odgovarajuću poruku. Što ako se korisnik ne može pronaći? U ovom slučaju, skripta će jednostavno završiti izvršenje bez da nam išta kaže. Voljeli bismo da nam kaže i za ovo, pa ćemo poboljšati kod.
if-then-else kontrolna konstrukcija
Kako bi program mogao prijaviti i rezultate uspješne pretrage i neuspjeh, koristit ćemo konstrukciju if-then-else. Evo kako to funkcionira:
if команда
then
команды
else
команды
fi
Ako prva naredba vrati nulu, što znači da je uspješno izvršena, uvjet će biti istinit i izvođenje se neće nastaviti duž grane else. Inače, ako se vrati nešto osim nule, što bi značilo neuspjeh ili lažni rezultat, naredbe nakon else.
Napišimo sljedeću 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
Njegovo smaknuće je palo u vodu else.
Pokretanje skripte s konstrukcijom if-then-else
Pa idemo dalje i zapitajmo se o složenijim uvjetima. Što ako trebate provjeriti ne jedan uvjet, već nekoliko? Na primjer, ako je željeni korisnik pronađen, treba prikazati jednu poruku, ako je ispunjen neki drugi uvjet, treba prikazati drugu poruku i tako dalje. U takvoj situaciji pomoći će nam ugniježđeni uvjeti. Ovako izgleda:
if команда1
then
команды
elif команда2
then
команды
fi
Ako prva naredba vrati nulu, što ukazuje na njezino uspješno izvršenje, naredbe u prvom bloku bit će izvršene then, inače, ako je prvi uvjet lažan i ako druga naredba 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 takvoj skripti možete, primjerice, stvoriti novog korisnika pomoću naredbe useradd, ako pretraga nije dala rezultate, ili učinite nešto drugo korisno.
Usporedba brojeva
U skriptama možete usporediti numeričke vrijednosti. Dolje je popis relevantnih naredbi.
n1 -eq n2Vraća true if n1 je n2. n1 -ge n2 Vraća true if n1više ili jednako n2. n1 -gt n2Vraća true if n1 više od n2. n1 -le n2Vraća true if n1manje ili jednako n2. n1 -lt n2Vraća true ako je n1 manji od n2. n1 -ne n2Vraća true if n1nije jednak n2.
Kao primjer, pokušajmo s jednim od operatora za usporedbu. Imajte na umu da je izraz u uglastim zagradama.
#!/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"
fi
To je ono što će ova naredba ispisati.
Usporedba brojeva u skriptama
Varijabilna vrijednost val1veći od 5, grananje se završava izvršenjem thenoperator usporedbe i na konzoli se prikazuje odgovarajuća poruka.
Usporedba nizova
Skripte također mogu uspoređivati vrijednosti nizova. Operatori usporedbe izgledaju prilično jednostavno, ali operacije usporedbe nizova imaju određene značajke, kojih ćemo se dotaknuti u nastavku. Ovdje je popis operatera.
str1 = str2 Provjerava jednakost nizova, vraćajući true ako su nizovi identični.
str1 != str2Vraća true ako nizovi nisu identični. str1 < str2Vraća true if str1manje od str2. str1 > str2 Vraća true if str1više od str2. -n str1 Vraća true ako je duljina str1Iznad nule. -z str1Vraća true ako je duljina str1jednaka nuli.
Evo primjera usporedbe nizova u skripti:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Kao rezultat izvršavanja skripte dobivamo sljedeće.
Uspoređivanje nizova u skriptama
Evo jedne značajke usporedbe nizova koju vrijedi spomenuti. Naime, operatori ">" i "<" moraju biti označeni obrnutom kosom crtom, inače skripta neće raditi ispravno, iako se neće pojaviti poruke o pogrešci. Skripta tumači znak ">" kao naredbu za preusmjeravanje izlaza.
Evo kako rad s ovim 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"
fi
Evo rezultata skripte.
Usporedba nizova, dano upozorenje
Imajte na umu da skripta, iako je izvršena, izdaje upozorenje:
./myscript: line 5: [: too many arguments
Da se riješimo ovog upozorenja, zaključujemo $val2 u dvostrukim navodnicima:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Sada sve radi kako treba.
Usporedba nizova
Još jedna značajka operatora ">" i "<" je način na koji rade s velikim i malim slovima. Kako bismo razumjeli ovu značajku, pripremimo tekstualnu datoteku sa sljedećim sadržajem:
Likegeeks
likegeeks
Spasimo ga dajući mu ime myfile, zatim pokrenite sljedeću naredbu u terminalu:
sort myfile
Poredat će retke iz datoteke ovako:
likegeeks
Likegeeks
Momčad sort, prema zadanim postavkama, sortira nizove uzlaznim redoslijedom, odnosno malo slovo u našem primjeru je manje od velikog. Sada pripremimo skriptu koja će usporediti 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"
fi
Ako ga pokrenete, ispada da je sve obrnuto - malo slovo je sada veće od velikog.
Naredba sortiranja i usporedba nizova u datoteci skripte
U naredbama za usporedbu, velika su slova manja od malih slova. Usporedba nizova ovdje se vrši usporedbom ASCII kodova znakova, stoga redoslijed sortiranja ovisi o kodovima znakova.
Momčad sort, pak, koristi redoslijed sortiranja naveden u postavkama jezika sustava.
Provjere datoteka
Možda se sljedeće naredbe najčešće koriste u bash skriptama. Omogućuju vam da provjerite različite uvjete u vezi s datotekama. Ovdje je popis ovih naredbi.
-d fileProvjerava postoji li datoteka i je li direktorij. -e fileProvjerava postoji li datoteka. -f file Provjerava postoji li datoteka i je li datoteka. -r fileProvjerava postoji li datoteka i je li čitljiva. -s file ПProvjerava postoji li datoteka i nije li prazna. -w fileProvjerava postoji li datoteka i može li se pisati. -x fileProvjerava postoji li datoteka i je li izvršna. file1 -nt file2 Provjerava da li je novije file1od file2. file1 -ot file2Provjerava je li starija file1od file2. -O file Provjerava da li datoteka postoji i da li je u vlasništvu trenutnog korisnika. -G fileProvjerava postoji li datoteka i podudara li se ID njezine grupe s ID-om grupe trenutnog korisnika.
Ove naredbe, kao i mnoge druge o kojima se danas raspravlja, lako se pamte. Njihova imena, kao kratice različitih riječi, izravno ukazuju na provjere koje obavljaju.
Isprobajmo jednu od naredbi 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"
fi
Ova skripta, za postojeći imenik, prikazat će njegov sadržaj.
Ispisivanje sadržaja imenika
Vjerujemo da s preostalim naredbama možete sami eksperimentirati, sve se koriste po istom principu.
Rezultati
Danas smo razgovarali o tome kako početi pisati bash skripte i pokrili neke osnovne stvari. Zapravo, tema bash programiranja je ogromna. Ovaj članak je prijevod prvog dijela velike serije od 11 materijala. Ako želite nastaviti odmah, ovdje je popis izvornika ovih materijala. Radi praktičnosti, ovdje je uključen prijevod koji ste upravo pročitali.
Bash skripta korak po korak — ovdje se govori o tome kako započeti kreirati bash skripte, razmatra se upotreba varijabli, opisuju se uvjetne strukture, izračuni, usporedbe brojeva, nizova i pronalaženje informacija o datotekama.
Bash skriptiranje, dio 3, parametri i opcije — ovaj materijal posvećen je parametrima naredbenog retka i ključevima koji se mogu proslijediti skriptama, radeći s podacima koje korisnik unosi i koji se mogu čitati iz datoteka.
Bash skriptiranje, 4. dio, Ulaz i izlaz - ovdje govorimo o deskriptorima datoteka i radu s njima, o ulazu, izlazu, tokovima grešaka i o preusmjeravanju izlaza.
Bash skriptiranje, dio 11, naredba Expect — ovaj materijal posvećen je alatu Expect, s kojim možete automatizirati interakciju s interaktivnim uslužnim programima. Konkretno, govorimo o očekivanim skriptama i njihovoj interakciji s bash skriptama i drugim programima.
Vjerujemo da je jedna od vrijednih značajki ove serije članaka to što, počevši od najjednostavnijeg, prikladnog za korisnike bilo koje razine, postupno vodi do vrlo ozbiljnih tema, dajući svima priliku za napredovanje u stvaranju skripti naredbenog retka za Linux .
Poštovani čitatelji! Molimo gurue bash programiranja da govore o tome kako su dosegli vrhunac svog majstorstva, podijele svoje tajne i veselimo se dojmovima onih koji su upravo napisali svoju prvu skriptu.
U anketi mogu sudjelovati samo registrirani korisnici. Prijaviti se, molim.
Trebam li prevesti ostatak serije članaka?
Da!
Ne, nema potrebe
Glasovalo je 1030 korisnika. Suzdržano je bilo 106 korisnika.