Bash skripte: uvod

Bash skripte: uvod
Bash skripte, dio 2: petlje
Bash skripte, dio 3: parametri i opcije naredbenog retka
Bash skripte, dio 4: ulaz i izlaz
Bash skripte, dio 5: signali, pozadinski zadaci, upravljanje skriptama
Bash skripte, dio 6: funkcije i razvoj biblioteka
Bash skripte, dio 7: sed i obrada teksta
Bash skripte, dio 8: jezik za obradu podataka awk
Bash skripte, dio 9: regularni izrazi
Bash skripte, dio 10: praktični primjeri
Bash skripte, dio 11: expect i automatizacija interaktivnih alata

Danas ćemo razgovarati o bash skriptama. To su naredbeni skripti, 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 naredbenom retku Linux-a.

Bash skripte: uvod

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.

Bash skripte: uvod

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_MAX

Naredbeni 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 shebang) 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
whoami

Ovdje, 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.

Bash skripte: uvod
Pokušaj pokretanja datoteke skripte s pogrešno postavljenim dopuštenjima

Učinit ćemo datoteku izvršnom:

chmod +x ./myscript

Sada ćemo pokušati izvršiti:

./myscript

Nakon postavljanja dopuštenja, sve radi kako treba.

Bash skripte: uvod
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:"
whoami

Evo što će se dogoditi nakon pokretanja ažurirane skripte.

Bash skripte: uvod
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 ovaj 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.

Bash skripte: uvod
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.

Bash skripte: uvod
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.

Bash skripte: uvod
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.

Bash skripte: uvod
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

Bash skripte: uvod
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
fi

Evo 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"
fi

Evo šta se dešava nakon pokretanja ove skripte.

Bash skripte: uvod
Pretraga korisnika

Ovde smo koristili komandu grepza pretragu korisnika u datoteci /etc/passwd. Ako vam komanda grepnije poznata, opis možete pronaći ovdje.

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.

Bash skripte: uvod
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 ako n1 jednako n2.
n1 -ge n2 Vraća istinitu vrijednost ako n1veće ili jednako n2.
n1 -gt n2Vraća istinitu vrijednost ako n1 više n2.
n1 -le n2Vraća istinitu vrijednost ako n1manje ili jednako n2.
n1 -lt n2Vraća istinitu vrijednost ako je n1 manje n2.
n1 -ne n2Vraća istinitu vrijednost ako n1nije jednako n2.

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"
fi

Evo što će ispisati ova komanda.

Bash skripte: uvod
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 = str2 Provjerava 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 je str1manje od str2.
str1 > str2 Vraća istinu ako je str1veće od str2.
-n str1 Vraća istinu ako je dužina str1veća od nule.
-z str1Vraća istinu ako je dužina str1jednako 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"
fi

Kao rezultat izvršenja skripte dobit ćemo sljedeće.

Bash skripte: uvod
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"
fi

Evo rezultati rada skripte.

Bash skripte: uvod
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"
fi

Sada sve radi kako treba.

Bash skripte: uvod
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 myfile

Sortirat ć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"
fi

Ako je pokrenemo, ispostavit će se da je sve obrnuto — mala slova su sada veća od velikih.

Bash skripte: uvod
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 file Provjerava 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 file2 Provjerava je li noviji od file1, nego file2.
file1 -ot file2Provjerava je li stariji od file1, nego file2.
-O datoteka Provjerava 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"
fi

Ovaj skript, za postojeću direktoriju, ispisat će njezinu sadržinu.

Bash skripte: uvod
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.

  1. Bash skripta korak po korak — 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.
  2. Bash skriptiranje dio 2, Bash nevjerojatno — ovdje se razmatraju karakteristike rada s petljama for i while.
  3. Bash skriptiranje dio 3, Parametri & opcije — 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.
  4. Bash skriptiranje dio 4, Ulaz & Izlaz — ovdje se radi o deskriptorima datoteka i radu s njima, o tokovima ulaza, izlaza, grešaka, kao i preusmjeravanju izlaza.
  5. Bash skriptiranje dio 5, Signali & Poslovi — ovaj materijal je posvećen signalima u Linuxu, njihovoj obradi u skriptama, pokretanju scenarija prema rasporedu.
  6. Bash skriptiranje dio 6, Funkcije — ovdje možete saznati o stvaranju i korištenju funkcija u skriptama, o razvoju biblioteka.
  7. Bash skriptiranje dio 7, Koristeći sed — ovaj članak je posvećen radu s tekstualnim uređivačem sed.
  8. Bash skriptiranje dio 8, Koristeći awk — ovaj materijal je posvećen programiranju u jeziku za obradu podataka awk.
  9. Bash skriptiranje dio 9, Regularni izrazi — ovdje možete pročitati o korištenju regularnih izraza u bash skriptama.
  10. Bash Scripting Dio 10, Praktični Primjeri — ovdje su prikazani načini rada s porukama koje se mogu slati korisnicima, kao i metodologija praćenja diska.
  11. Bash Scripting Dio 11, Expect Komanda — 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.

Bash skripte: uvod

Samo registrirani korisnici mogu sudjelovati u anketi. Prijavite se, molimo.

Treba li prevesti ostale dijelove ciklusa članaka?

  • Da!

  • Ne, ne treba

Glasalo je 1030 korisnika. Suzdržalo se 106 korisnika.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster