Pisanje skripti u Bashu. bash funkcije u skriptama Šta je bash skripta

Svi znaju da Bash shell ima ugrađene komande koje se ne nalaze u /bin ili /usr/bin folderima. Ugrađeni su u ljusku i rade kao funkcije. U jednom od prethodnih članaka razmatrali smo. Tamo smo razgovarali o gotovo svemu, kako bi skripte trebale da izgledaju, upotrebi uslova, petlji, varijabli, ali se nismo zaustavili na funkcijama.

U današnjem članku ćemo ispraviti ovaj nedostatak. Kao i svaki programski jezik, Bash ima funkcije koje mogu biti vrlo korisne za korištenje. Pogledat ćemo korištenje bash funkcija, kako ih pisati, pa čak i kako kreirati biblioteke od ovih funkcija.

Prvo moramo razumjeti što je funkcija u našem kontekstu. Funkcija je skup naredbi, ujedinjenih jednim imenom, koje obavljaju određeni zadatak. Funkcija se poziva svojim imenom, može uzeti parametre i vratiti rezultat rada. Ukratko, Bash funkcije rade isto kao i u drugim programskim jezicima.

Sintaksa za kreiranje funkcije je vrlo jednostavna:

function_name() (popis komandi)

Ime funkcije ne smije odgovarati nijednoj od postojećih naredbi ili funkcija, a sve naredbe u tijelu funkcije su napisane u novom redu.

jednostavna funkcija

Napišimo malu funkciju koja će ispisati niz na ekran:

$ vi function.sh

#!/bin/bash
printstr()(
odjek "zdravo svijete"
}
printstr

Pozivanje bash funkcije se vrši navođenjem njenog imena, kao i za bilo koju drugu naredbu. Pokrenite našu skriptu za izvršenje, ne zaboravite da joj prije toga morate dati prava na izvršenje:

chmod u+x funkcija.sh

Sve radi, sada zakomplikujmo zadatak, pokušajmo prenijeti argumente funkciji.

Argumenti funkcije

Argumenti funkcije moraju biti proslijeđeni prilikom pozivanja i čitaju se na isti način kao i argumenti skripte. Sintaksa za pozivanje funkcije sa bash parametrima je:

function_name argument1 argument2 ... argumentN

Kao što vidite, sve je prilično jednostavno. Parametri su odvojeni razmakom. Sada poboljšajmo našu funkciju tako da ona ispisuje string koji smo naveli:

!/bin/bash
printstr()(
echo $1
}
printstr "Zdravo svijete"

Možete imati više opcija:

!/bin/bash
printstr()(
echo $1
echo $2
echo $3
echo $5
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

Postoji još jedan način za izdvajanje argumenata, kao u C, pomoću steka. Dohvaćamo prvi argument, zatim pomeramo pokazivač steka argumenata za jedan i ponovo preuzimamo prvi argument. I tako dalje:

!/bin/bash
printstr()(
echo $1
smjena
echo $1
smjena
echo $1
smjena
echo $1
}
printstr "arg1" "arg2" "arg3" "arg4"

Vraćanje rezultata funkcije

Ne samo da možete koristiti funkcije s bash parametrima, već i dobiti rezultat rada od toga. Za ovo se koristi naredba return. Prekida funkciju i vraća se numerička vrijednost povratni kod. Može biti od 0 do 255:

!/bin/bash
printstr()(
povratak 134;
}
printstr
echo $?

Ako trebate koristiti povratnu vrijednost bash funkcije umjesto statusnog koda, koristite echo. Niz se ne šalje odmah na terminal, već se vraća kao rezultat funkcije i može se zapisati u varijablu i zatim koristiti:

!/bin/bash
printstr()(
eho "test"
}
VAR=$(printstr)
echo $VAR

Izvozne funkcije

Funkciju možete učiniti dostupnom izvan skripte pomoću naredbe declare:

!/bin/bash
printstr()(
odjek "zdravo svijete"
}
proglasiti -x -f printstr

Zatim pokrenite skriptu sa izvornom komandom:

izvorna funkcija.sh
$printstr

rekurzija

Možete pozvati funkciju iznutra da izvrši rekurziju:

!/bin/bash
printstr()(
odjek "zdravo svijete"
printstr
}
printstr

Možete eksperimentirati s korištenjem rekurzije, to može biti korisno u mnogim slučajevima, samo zapamtite da napravite prvi poziv Bash funkcije.

Lokalne varijable u funkciji

Ako deklarirate običnu varijablu u funkciji, tada će ona biti dostupna u cijeloj skripti, ovo je zgodno za vraćanje vrijednosti funkcije, ali ponekad će možda biti potrebno učiniti je lokalnom varijablom. Za ovo postoji lokalna komanda:

!/bin/bash
printstr()(
lokalni VAR=$1
echo $(var)
}
printstr "Hello World"

Biblioteke funkcija

Možemo uzeti neke bash funkcije i kombinirati ih u jednu biblioteku tako da možemo uvesti ove funkcije jednom naredbom. Ovo se radi na sličan način kao kod eksportovanja funkcija. Prvo, napravimo datoteku biblioteke:

test1()(
eho "Hello World from 1";
}
test2()(
eho "Hello World from 2";
}
test3()(
eho "Hello World from 3";
}

Sada napravimo skriptu koja će koristiti naše funkcije. Možete uvesti biblioteku koristeći izvornu naredbu ili jednostavno navođenjem naziva skripte:

!/bin/bash
izvor lib.sh
test1
test2
test3

zaključci

U ovom članku pogledali smo bash funkcije, kako ih napisati, primijeniti i kombinirati u biblioteke. Ako često pišete skripte u Bashu, onda će vam ove informacije biti korisne. Možete kreirati vlastiti skup funkcija koje ćete koristiti u svakoj skripti i tako olakšati svoj rad.

Bez obzira koliko je grafičko sučelje u Linuxu jednostavno i koliko god funkcija ima, i dalje postoje zadaci koje je zgodnije rješavati preko terminala. Prvo, zato što je brži, a drugo, nemaju sve mašine grafičko sučelje, na primjer, na serverima se sve radnje izvode preko terminala, kako bi se uštedjeli računski resursi.

Ako ste već završili napredni korisnik, onda vjerovatno često obavljate razne zadatke preko terminala. Često postoje zadaci za koje trebate izvršiti nekoliko naredbi zauzvrat, na primjer, da biste ažurirali sistem, prvo morate ažurirati spremišta, a tek onda preuzeti nove verzije paketa. Ovo je samo primjer i ima mnogo takvih radnji, čak napravite sigurnosnu kopiju i otpremite kopirane datoteke na udaljeni server. Stoga, kako ne biste kucali iste komande nekoliko puta, možete koristiti skripte. U ovom članku ćemo pogledati pisanje skripti u Bashu, pogledati osnovne operatore, kao i kako rade, da tako kažem, bash skripte od nule.

Skripta, ili kako se još naziva - skripta, je niz naredbi koje se čitaju i izvršavaju naizmjenično od strane programa tumača, u našem slučaju ovo je program komandna linija- bash.

Scenario je normalan tekstualnu datoteku, koji navodi uobičajene komande koje smo navikli unositi ručno, kao i program koji će ih izvršiti. Učitavač koji će izvršiti skriptu ne zna kako da radi varijable okruženja, tako da mu treba proslijediti tačnu putanju do programa za pokretanje. A onda će proslediti vašu skriptu ovom programu i izvršavanje će početi.

Najjednostavniji primjer skripte za Bash shell:

!/bin/bash
eho "Zdravo svijete"

Uslužni program echo ispisuje niz koji mu je proslijeđen kao parametar na ekran. Prvi red je poseban, on specificira program koji će izvršiti naredbe. Uopšteno govoreći, možemo kreirati skriptu u bilo kom drugom programskom jeziku i odrediti željeni interpreter, na primjer, u pythonu:

!/usr/bin/env python
print("Zdravo svijete")

Ili u PHP-u:

!/usr/bin/env php
eho "Zdravo svijete";

U prvom slučaju smo direktno ukazali na program koji će izvršavati komande, u naredna dva ne znamo tačnu adresu programa, pa tražimo od env uslužnog programa da ga pronađe po imenu i pokrene. Ovaj pristup se koristi u mnogim skriptama. Ali to nije sve. IN Linux sistem, da bi sistem mogao da izvrši skriptu, potrebno je da postavite izvršnu zastavicu na fajl sa njim.

Ova zastavica ne mijenja ništa u samoj datoteci, samo govori sistemu da ovo nije samo tekstualna datoteka, već program i da ga treba izvršiti, otvoriti datoteku, pronaći interpreter i izvršiti. Ako tumač nije naveden, korisnički tumač će se koristiti po defaultu. Ali pošto ne koriste svi bash, ovo morate eksplicitno navesti.

Trčati:

chmod ugo+x script_file

Sada pokrećemo naš mali prvi program:

./script_file

Sve radi. Već znate kako napisati malu skriptu za, recimo, ažuriranje. Kao što vidite, skripte sadrže iste komande koje se izvršavaju u terminalu, vrlo ih je lako napisati. Ali sada ćemo malo zakomplicirati zadatak. Budući da je skripta program, mora sama donijeti neke odluke, pohraniti rezultate izvršenja naredbi i izvršiti petlje. Sve ovo se može uraditi sa Bash školjkom. Istina, ovdje je sve mnogo komplikovanije. Počnimo jednostavno.

Varijable u skriptama

Pisanje skripti u Bashu rijetko je završeno bez pohranjivanja privremenih podataka, što znači kreiranje varijabli. Ni jedan programski jezik ne može bez varijabli, kao ni naš primitivni jezik ljuske.

Možda ste se ranije susreli sa varijablama okruženja. Dakle, to su iste varijable i rade na isti način.

Na primjer, deklarirajmo varijablu niza:

string="Zdravo svijete"

Vrijednost našeg stringa je u navodnicima. Ali u stvari, citati nisu uvijek potrebni. Ovdje je sačuvan glavni princip bash-a - razmak je poseban znak, separator, tako da ako ne koristite navodnike, world će se već smatrati zasebnom komandom, iz istog razloga ne stavljamo razmake ispred i iza jednakih sign.

Simbol $ koristi se za prikaz vrijednosti varijable. Na primjer:

Izmijenimo našu skriptu:

!/bin/bash
string1="zdravo"
string2=svijet
string=$string1$string2
echo $string

I provjeravamo:

Bash ne pravi razliku između tipova varijabli na način na koji to rade jezici visokog nivoa kao što je C++, promenljivoj možete dodeliti i broj i niz. Jednako tako, sve ovo će se smatrati nizom. Shell podržava samo spajanje stringova, da biste to učinili, jednostavno upišite imena varijabli u red:

!/bin/bash
string1="zdravo"
string2=svijet
string=$string1$string2\ i\ ja
string3=$string1$string2" i ja"
echo $string3

Provjeravamo:

Imajte na umu da, kao što sam rekao, navodnici nisu obavezni ako nema posebnih znakova u nizu. Pogledajte bliže oba načina spajanja nizova, ovdje je također prikazana uloga navodnika. Ako su vam potrebni sofisticiraniji načini rukovanja žicama, ili aritmetičke operacije, ovo nije uključeno u mogućnosti ljuske, za to se koriste normalni uslužni programi.

Varijable i izlaz naredbi

Varijable ne bi bile toliko korisne da ne mogu pohraniti rezultat izvršavanja uslužnih programa. Za ovo se koristi sljedeća sintaksa:

$(tim)

Sa ovom konstrukcijom, izlaz naredbe će biti preusmjeren direktno na mjesto odakle je pozvana, a ne na ekran. Na primjer, uslužni program za datum vraća trenutni datum. Ove naredbe su ekvivalentne:

Da li razumiješ? Hajde da napišemo skriptu u kojoj će biti prikazani hello world i datum:

string1="zdravo svijete"
string2=$(datum)

string=$string1$string2

Sada znate dovoljno o varijablama i spremni ste za kreiranje bash skripte, ali ima još toga. Zatim ćemo pogledati parametre i kontrolne strukture. Dozvolite mi da vas podsjetim da su ovo sve redovne bash komande i da ih ne morate spremati u datoteku, možete ih izvršiti odmah u pokretu.

Parametri skripte

Nije uvijek moguće kreirati bash skriptu koja ne ovisi o korisničkom unosu. U većini slučajeva, morate pitati korisnika koju radnju da poduzmu ili koju datoteku da koristi. Kada pozivamo skriptu, možemo joj prenijeti parametre. Svi ovi parametri dostupni su kao varijable nazvane brojevima.

Varijabla pod nazivom 1 sadrži vrijednost prvog parametra, varijable 2, drugog i tako dalje. Ova bash skripta će ispisati vrijednost prvog parametra:

!/bin/bash
echo $1

Kontrolne konstrukcije u skriptama

Kreiranje bash skripte ne bi bilo toliko korisno bez mogućnosti analize određenih faktora i izvođenja potrebnih radnji kao odgovor na njih. Ovo je prilično složena tema, ali je vrlo važna za kreiranje bash skripte.

U Bashu postoji naredba za provjeru uslova čija je sintaksa sljedeća:

ako stanje_komande
onda
tim
ostalo
tim
fi

Ova naredba provjerava izlazni kod naredbe stanja, a ako je 0 (uspjeh) onda izvršava naredbu ili nekoliko naredbi nakon riječi, onda, ako je izlazni kod 1, izvršava se drugi blok, fi znači završetak bloka komande.

Ali kako nas najčešće ne zanima povratni kod naredbe, već upoređivanje stringova i brojeva, uvedena je naredba [[ koja vam omogućava da izvršite različita poređenja i izdate povratni kod ovisno o rezultatu poređenja. Njegova sintaksa je:

[[ parametar1 operator parametar2 ]]

Za poređenje koristimo već poznate operatore<,>,=,!= i tako dalje Ako je izraz tačan, naredba će vratiti 0, ako nije - 1. Možete malo testirati njeno ponašanje u terminalu. Povratni kod posljednje naredbe pohranjen je u varijablu $?:

Sada, kombinovanjem svega ovoga, dobijamo skriptu sa uslovnim izrazom:

!/bin/bash
ako [[ $1 > 2 ]]
onda
echo $1" je veći od 2"
ostalo
echo $1" je manje od 2 ili 2"
fi

Naravno, ovaj dizajn ima moćnije karakteristike, ali je previše komplicirano da ih pokrijemo u ovom članku. Možda ću kasnije pisati o tome. Za sada, pređimo na cikluse.

Petlje u skriptama

Prednost programa je što možemo u nekoliko redova specificirati koje radnje treba izvršiti nekoliko puta. Na primjer, moguće je pisati bash skripte koje se sastoje od samo nekoliko redova, ali rade satima, analizirajući parametre i izvodeći potrebne radnje.

Pogledajmo prvo for petlju. Evo njegove sintakse:

za varijablu u listi
uradi
tim
urađeno

Iterira čitavu listu i dodjeljuje vrijednost sa liste naizmjenično varijabli, nakon svakog dodjeljivanja, izvršava komande koje se nalaze između do i done.

Na primjer, ponovimo preko pet cifara:

za indeks u 1 2 3 4 5
uradi
echo $index
urađeno

Ili možete navesti sve datoteke u trenutnom direktoriju:

za datoteku u $(ls -l); do echo "$file"; urađeno

Kao što razumijete, ne možete samo prikazati imena, već i izvršiti potrebne radnje, što je vrlo korisno kada kreirate bash skriptu.

Druga petlja koju ćemo pogledati je while petlja, koja se pokreće dok naredba uvjeta vraća kod 0, uspjeh. Uzmite u obzir sintaksu:

dok komandni uslov
uradi
tim
urađeno

Razmotrimo primjer:

!/bin/bash
index=1
dok [[ $index< 5 ]]
uradi
echo $index
neka "indeks=indeks+1"
urađeno

Kao što vidite, sve je gotovo, naredba let jednostavno izvodi navedenu matematičku operaciju, u našem slučaju povećava vrijednost varijable za jedan.

Napominjem još nešto. Konstrukcije kao što su while, for, if su dizajnirane da budu napisane u više redova, i ako pokušate da ih napišete u jednom redu, dobićete grešku. Ali ipak je moguće, za ovo, tamo gdje bi trebao biti prijelom reda, staviti tačku i zarez ";". Na primjer, prethodna petlja se mogla izvršiti kao jedan red:

index=1; dok [[ $index< 5 ]]; do echo $index; let "index=index+1"; done;

Sve je vrlo jednostavno, trudio sam se da ne zakompliciram članak dodatnim bash terminima i funkcijama, samo najosnovnijim. U nekim slučajevima, možda ćete morati napraviti gui za bash skriptu, tada možete koristiti programe kao što su zenity ili kdialog, pomoću kojih je vrlo zgodno prikazati poruke korisniku, pa čak i pitati ga za informacije.

zaključci

Sada razumijete osnove skriptiranja u linuxu i možete napisati skriptu koja vam je potrebna, na primjer, za Rezervna kopija. Pokušao sam da pogledam bash skripte od nule. Stoga, nisu uzeti u obzir svi aspekti. Možda ćemo se na ovu temu vratiti u jednom od sljedećih članaka.

Za pisanje jednostavne bash skripte moramo uraditi sljedeće jednostavne korake:

Kako sve funkcionira:

Prvi red naše skripte #!/bin/bash je od suštinskog značaja za uspešno pokretanje naše skripte.

drugi red mkdir testdir kreira direktorij testdir

treći red cd testdir vam omogućava da promijenite kreirani direktorij testdir

tim dodir u sledećem redu dodirnite fajl1 fajl2 fajl3 kreira tri fajla

a posljednja komanda u redu naše skripte ls -al nam omogućava da prikažemo sadržaj trenutnog direktorija, u kojem su se, zahvaljujući prethodnom redu, pojavila tri prazna fajla.

Kao što vidimo, u našoj jednostavna skripta sve naredbe počinju u novom redu. Svaki red, kada se skripta pokrene, uzastopno obavlja svoj posao, izvodeći određene radnje.

Ako pokrenete lanac nekih identičnih naredbi (sa konstantnim parametrima) na Linuxu svaki dan, onda bi moglo imati smisla da napišete isto jednostavna bash skripta, što će vam omogućiti da uštedite svoje vrijeme i automatizirate svoj rad.

Pisanje skripti u Linuxu (učenje na primjerima)

———————————————————————————-

1. Uvod

Šta vam je potrebno za pisanje skripte
Poznavanje alata komandne linije i njihovih potrebnih opcija.
Osnovno poznavanje engleskog jezika na nivou osnovne škole neće smetati.

Zašto su skripte potrebne
Prvo, administracija linux servera, u jednom ili drugom stepenu, svodi se na sistematsko izvršavanje istih komandi. Štaviše, nije neophodno da ove komande izvršava neko lice. Mogu se programirati da ih izvrši mašina.
Drugo, čak i samo obavljanje normalnog zadatka koji (iznenada) iznosi 20-1000 ... ponavljajućih operacija je MNOGO lakše implementirati u skriptu.

Šta je skripta
Skripta je skup instrukcija koje računar mora izvršiti određenim redosledom i u određeno vreme. Instrukcije mogu biti ili interne komande ljuske (petlje, uslovi, obrada tekstualnih informacija, rad sa varijablama okruženja, itd.), ili bilo koji program koji izvršavamo u konzoli sa potrebnim parametrima.

Kako napisati skriptu
U našem slučaju, skripta će biti tekstualna datoteka sa atributima izvršavanja. Ako datoteka skripte počinje s #!, što se u UNIX svijetu naziva sha-bang, to govori sistemu koji interpretator da koristi za izvršavanje skripte. Ako je ovo teško razumjeti, samo zapamtite da ćemo početi pisati sve skripte sa linijom #!/bin/bash ili #!/bin/sh, a zatim će ići naredbe i komentari za njih.

rastanak
Iskreno vam savjetujem da napišete što više komentara na skoro svaki red u scenariju. Vrijeme će proći i morat ćete promijeniti ili modernizirati skriptu napisanu jednom. Ako se ne sjećate ili ne razumijete šta je napisano u skripti, onda postaje teško to promijeniti, lakše je pisati od nule.

Koje skripte bi nam mogle zatrebati:

    postavljanje pravila zaštitnog zida kada se sistem pokrene.
    izvođenje sigurnosne kopije postavki i podataka.
    dodavanje poštanskih sandučića na mail server (tačnije, u mysql bazu podataka)
    pokretanje u određeno vrijeme (po mogućnosti svake noći) programa koji skenira logove proxy servera i izdaje zgodan web izvještaj o količini preuzetog prometa.
    slanje nam poštom informacija da je neko dobio pristup našem serveru putem ssh-a, vremenu veze i adresi klijenta.

O tehnici skriptiranja
Kreiramo tekstualnu datoteku, uređujemo je, postavljamo izvršna prava, pokrećemo je, provjeravamo greške, popravljamo, pokrećemo, provjeravamo greške...
Kada je sve polizano i radi kako treba, stavljamo ga u autoload ili u planer na određeno vrijeme.

———————————————————————————-

2. Učenje pisanja skripti na internom BASH jeziku
original: https://www.linuxconfig.org/Bash_scripting_Tutorial

Ovaj vodič ne pretpostavlja nikakvo prethodno znanje o tome kako pisati skripte (u daljem tekstu skripte) koristeći interni jezik Bash. Uz pomoć ovog vodiča, uskoro ćete otkriti da je pisanje skripti vrlo lak zadatak. Započnimo naš vodič sa jednostavnom skriptom koja ispisuje string "Hello World!" (prevedeno sa engleskog - Pozdrav svima!)

1. Scenario "Zdravo svima"
Evo vašeg prvog primjera bash skripte:

#!/bin/bash
eho "Halo World"

Promijenite u direktorij koji sadrži naš hello_world.sh fajl i učinite ga izvršnim:

Kod: Odaberite sve $ chmod +x hello_world.sh

Pokrenite skriptu za izvršenje

Kod: Odaberite sve $ ./hello_world.sh

2. Jednostavna bash skripta za arhiviranje

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/user

Kod: Odaberite sve $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3. Rad sa varijablama
IN ovaj primjer deklarišemo jednostavnu varijablu i prikazujemo je na ekranu pomoću echo komande

#!/bin/bash
STRING="HELLO WORLD!!!"
eho $STRING

Kod: Odaberite sve $ ./hello_world.sh
ZDRAVO SVIJETE!!!

Naša skripta za arhiviranje sa varijablama:

#!/bin/bash
OF=myhome_directory_$(datum +%Y%m%d).tar.gz
IF=/home/user
tar -czf $OF $IF

Kod: Odaberite sve $ ./backup.sh
tar: Uklanjanje vodećeg "\" iz imena članova
$ du -sh *tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Globalne i lokalne varijable

#!/bin/bash
# Deklarirajte globalnu varijablu
# Ova varijabla se može koristiti bilo gdje u ovoj skripti
VAR="globalna varijabla"
funkcija bash(
# Deklarirajte lokalnu varijablu
# Takva varijabla je važeća samo za funkciju u kojoj je deklarirana
lokalne VAR="lokalne varijable"
echo $VAR
}
echo $VAR
bash
# Imajte na umu da se globalna varijabla nije promijenila
echo $VAR

Kod: Odaberite sve $ ./variables.sh
globalna varijabla
lokalna varijabla
globalna varijabla

4. Prenošenje argumenata u skriptu

#!/bin/bash
# Koristite unaprijed definirane varijable za pristup argumentima
# Ispis argumenata na ekranu
echo $1 $2 $3 ‘ -> echo $1 $2 $3'

#Također možemo pristupiti argumentima kroz poseban niz args=(" [email protected]»)
# Ispis argumenata na ekranu
echo $(args) $(args) $(args) ‘ -> args=(“ [email protected]»); echo $(args) $(args) $(args)'

# Koristite varijablu [email protected] za prikaz svih argumenata odjednom
echo [email protected]' -> eho [email protected]

Koristite varijablu $# za prikaz broja argumenata proslijeđenih skripti
echo Broj proslijeđenih argumenata: $# ‘ -> echo Broj proslijeđenih argumenata: $#’

Kod: Odaberite sve $ ./arguments.sh Vodič za Bash Scripting
Tutorial za Bash skriptiranje -> echo $1 $2 $3
Vodič za Bash skriptiranje -> args=(" [email protected]"); echo $(args) $(args) $(args)
Vodič za Bash Scripting -> echo [email protected]
Broj proslijeđenih argumenata: 3 -> echo Broj proslijeđenih argumenata: $#

5. Izvršavanje naredbi ljuske u skripti

#!/bin/bash
# koristite povratne oznake » ` ` » da izvršite naredbu ljuske
odjek `uname -o`
# sada pokušajmo bez navodnika
odjek uname -o

Šifra: Odaberite sve $ uname -o
GNU/Linux
$ ./bash_backtricks.sh
GNU/Linux
uname-o

Kao što vidite, u drugom slučaju je prikazana sama naredba, a ne rezultat njenog izvršenja.

6. Pročitajte korisnički unos (interaktivnost)

#!/bin/bash
echo -e "Zdravo, upišite riječ: \c"
pročitajte riječ
echo "Riječ koju ste unijeli je: $word"
echo -e "Možete li uneti dvije riječi? »
pročitaj riječ1 riječ2
echo "Ovo je vaš unos: \"$word1\" \"$word2\""
echo -e "Šta mislite o bash skriptiranju? »
# komanda read sada pohranjuje odgovor u zadanu ugrađenu varijablu $REPLY
čitaj
echo "Rekli ste $REPLY, drago mi je to čuti! »
echo -e "Koje su tvoje omiljene boje? »
# -a čini naredbu za čitanje za čitanje u niz
čitaj -a boje
echo "Moje omiljene boje su također $(boje), $(boje) i $(boje):-)"

Kod: Odaberite sve $ ./read.sh
Zdravo, upišite riječ: nešto
Riječ koju ste unijeli je: nešto
Možete li upisati dvije riječi?
Debian Linux
Evo vašeg unosa: "Debian" "Linux"
Šta mislite o bash skriptama?
dobro
Dobro ste rekli, drago mi je da to čujem!
Koje su vaše omiljene boje?
plava zelena crna
Moje omiljene boje su takođe plava, zelena i crna :-)

7. Korištenje zamke

#!/bin/bash
# proglasi zamku
trap bashtrap INT
# obrišite ekran
jasno;
# funkcija hook se izvršava kada korisnik pritisne CTRL-C:
# Prikazaće se => Izvršavanje bash trap podrutine !
# ali će skripta nastaviti da radi
bashtrap()
{
echo "CTRL+C Detected !…izvršavanje bash trap !"
}
# skripta će brojati do 10
za a u `seq 1 10`; uradi
echo "$a/10 za izlaz."
sleep1;
urađeno
echo "Exit Bash Trap Primer!!!"

Šifra: Odaberite sve $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL+C Detected !...izvršavanje bash trap !
10/10
Exit Bash Trap Primer!!!

Kao što vidite, kombinacija tipki Ctrl-C nije zaustavila izvršavanje skripte.

8. Nizovi
8.1 Deklarisanje jednostavnog niza

#!/bin/bash
# Deklarirajte jednostavan niz sa 4 elementa
ARRAY=('Debian Linux' 'Redhat Linux' ubuntu linux)
# Dobiti broj elemenata u nizu
ELEMENTI=$(#NIZ[@])

# petlja kroz svaki element niza
za ((i=0;i<$ELEMENTS;i++)); do
echo $(ARRAY[$(i)])
urađeno

Kod: Odaberite sve $./arrays.sh
Debian Linux
redhat linux
ubuntu
linux

8.2 Popunjavanje niza vrijednostima iz datoteke

#!/bin/bash
# Deklarirajte niz
proglasiti -NIZ
# exec komanda # stdin (obično tastatura) će biti proizveden iz ove datoteke. Ovo omogućava čitanje
# sadržaj datoteke, red po red, i analizirajte svaki red unet sa sed i/ili awk.
exec 10 letcount=0

dok čitate LINE<&10; do

NIZ[$count]=$LINE
((broj++))
urađeno

echo Broj elemenata: $(#ARRAY[@])
# Prikaz vrijednosti niza
echo $(ARRAY[@])
# zatvorite fajl
exec 10>&-

Kod: Odaberite sve $ cat bash.txt
Debian Linux
redhat linux
ubuntu
linux
$ ./arrays.sh
Broj elemenata: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Uslovi ako-onda-drugo
9.1. Jednostavna upotreba uslova "ako-inače".
Obratite pažnju na razmake u uglastim zagradama, bez kojih uslov neće raditi.

#!/bin/bash
direktorij="./BashScripting"

# provjeri da li direktorij postoji
ako [ -d $direktorij]; onda
echo "Direktorijum postoji"
ostalo
echo "Direktorij ne postoji"
fi

Kod: Odaberite sve $ ./if_else.sh
Imenik ne postoji
$ mkdir BashScripting
$ ./if_else.sh
Imenik postoji

9.2 Ugniježđeni uvjeti if-else

#!/bin/bash
# Deklarirajte varijablu sa vrijednošću 4
izbor=4
# Display
eho "1. bash"
eho "2. Skriptiranje»
eho "3. Vodič»

# Izvrši dok je varijabla jednaka četiri
# petlja
dok [ $choice -eq 4 ]; uradi

# čitanje korisničkog unosa
pročitajte izbor
# ugniježđeni uvjet "ako-inače".
ako [ $choice -eq 1 ] ; onda

echo "Odabrali ste riječ: Bash"

ako [ $choice -eq 2 ] ; onda
echo "Odabrali ste riječ: Skriptiranje"
ostalo

ako [ $choice -eq 3 ] ; onda
echo "Odabrali ste riječ: Tutorial"
ostalo
echo "Molim vas da izaberete između 1-3!"
eho "1. bash"
eho "2. Skriptiranje»
eho "3. Vodič»
echo -n "Molimo odaberite riječ? »
izbor=4
fi
fi
fi
urađeno

Šifra: Odaberite sve $ ./nested.sh
1. bash
2. Skriptiranje
3. Tutorial

5

1. bash
2. Skriptiranje
3. Tutorial
Molimo odaberite riječ
4
Molimo odaberite između 1-3!
1. bash
2. Skriptiranje
3. Tutorial
Molimo odaberite riječ
3
Odabrali ste riječ: Tutorial

Dakle, prvo se izvršava tijelo "while" petlje, jer varijabla izbora je inicijalno postavljena na četiri. Zatim u njega učitavamo korisnički unos, a ako unos nije jednak 1.2 ili 3, onda našu varijablu ponovo činimo jednakom 4, u vezi s tim se tijelo petlje ponavlja (potrebno je ponovo unijeti 1.2 ili 3).

10. Poređenja
10.1 Aritmetička poređenja

Lt<
-gt>
-le<=
-ge >=
-eq ==
-ne !=

#!/bin/bash

NUM1=2
NUM2=2
ako [ $NUM1 -eq $NUM2 ]; onda
echo "Obje vrijednosti su jednake"
ostalo
echo "Vrijednosti NISU jednake"
fi

Kod: Odaberite sve $ ./equals.sh
Obje vrijednosti su jednake

#!/bin/bash
# Deklarirajte varijable sa cjelobrojnim vrijednostima
NUM1=2
NUM2=3
ako [ $NUM1 -eq $NUM2 ]; onda
echo "Obje vrijednosti su jednake"
ostalo
echo "Vrijednosti NISU jednake"
fi

Kod: Odaberite sve $ ./equals.sh
Vrijednosti NISU jednake

#!/bin/bash
# Deklarirajte varijable sa cjelobrojnim vrijednostima
NUM1=2
NUM2=1
ako [ $NUM1 -eq $NUM2 ]; onda
echo "Obje vrijednosti su jednake"
elif [ $NUM1 -gt $NUM2 ]; onda
echo "$NUM1 je veće od $NUM2"
ostalo
echo "$NUM2 je veće od $NUM1"
fi

Kod: Odaberite sve $ ./equals.sh
2 je veće od 1

10.2 Poređenje karaktera i teksta

Isto
!= nije isto
< меньще чем
> više od
-n s1 varijabla s1 nije prazna
-z s1 varijabla s1 je prazna

#!/bin/bash

S1="Bash"

S2="Skriptiranje"
ako [ $S1 = $S2 ]; onda

ostalo
echo "Stringovi NISU jednaki"
fi

Šifra: Odaberite sve $ ./statement.sh
Nizovi NISU jednaki

#!/bin/bash
# Deklarirajte simboličku varijablu S1
S1="Bash"
# Deklarirajte simboličku varijablu S2
S2="Bash"
ako [ $S1 = $S2 ]; onda
echo "Oba niza su jednaka"
ostalo
echo "Stringovi NISU jednaki"
fi

Šifra: Odaberite sve $ ./statement.sh
Oba niza su jednaka

11. Provjera datoteka

B ime datoteke Blokirajte posebnu datoteku
-c naziv datoteke Datoteka posebnih znakova
-d ime direktorija Provjerite postojanje direktorija
-e naziv datoteke Provjerite postojanje datoteke
-f ime datoteke Provjerite postojanje redovnog fajla, a ne direktorija
-G ime datoteke Provjerite da li datoteka postoji i da li je u vlasništvu efektivnog ID-a grupe.
-g ime datoteke istina ako datoteka postoji i postavljena je-grupa-id.
-k naziv datoteke Lepljivi bit
-L ime datoteke Simbolička veza
-O ime datoteke Tačno ako datoteka postoji i u vlasništvu je efektivnog korisničkog ID-a.
-r ime datoteke Provjerite da li je datoteka čitljiva
-S ime datoteke Provjerite da li je datoteka utičnica
-s ime datoteke Provjerite da li je veličina datoteke različita od nule
-u ime datoteke Provjerite je li postavljen bit datoteke set-ser-id
-w ime datoteke Provjerite da li se u datoteku može pisati
-x ime datoteke Provjerite da li je datoteka izvršna

#!/bin/bash
file="./file"
ako [ -e $datoteka]; onda
echo "Datoteka postoji"
ostalo
echo "Datoteka ne postoji"
fi

Šifra: Odaberite sve $ls
file.sh
$ ./file.sh
Fajl ne postoji
$ touch fajl
$ls
fajl file.sh
$ ./file.sh
Fajl postoji

Slično za primjer možemo koristiti "while" petlje da provjerimo da li datoteka ne postoji. Ova skripta će spavati dok datoteka ne postoji. Obratite pažnju na Bash negativ "!" što negira (invertuje) opciju -e.

12. Ciklusi
12.1. Za petlju

#!/bin/bash
# for petlja
za f u $(ls /var/); uradi
echo $f
urađeno

Pokretanje for petlje iz bash komandne linije:

Kod: Odaberite sve $ za f u $(ls /var/); do echo $f; Gotovo Kod: Odaberite sve $ za f u $(ls /var/); do echo $f; urađeno
rezervne kopije
skladiste
crash
igrice
lib
lokalni
lock
log
mail
opt
trči
kalem
tmp
www

12.2. while petlja

#!/bin/bash
COUNT=6
# while petlja
dok [ $COUNT -gt 0 ]; uradi

neka COUNT=COUNT-1
urađeno

Kod: Odaberite sve $ ./while_loop.sh
Vrijednost brojanja je: 6
Vrijednost brojanja je: 5
Vrijednost brojanja je: 4
Vrijednost brojanja je: 3
Vrijednost brojanja je: 2
Vrijednost brojanja je: 1

12.3. do petlje

#!/bin/bash
COUNT=0
#until petlja
do [ $COUNT -gt 5 ]; uradi
echo Vrijednost count je: $COUNT
neka COUNT=COUNT+1
urađeno

Kod: Odaberite sve $ ./until_loop.sh
Vrijednost brojanja je: 0
Vrijednost brojanja je: 1
Vrijednost brojanja je: 2
Vrijednost brojanja je: 3
Vrijednost brojanja je: 4
Vrijednost brojanja je: 5

12.4. Petlje s implicitnim uvjetima
U sljedećem primjeru, uvjet while petlje je prisustvo standardnog ulaza.
Tijelo petlje će se izvoditi sve dok postoji nešto što treba preusmjeriti sa standardnog izlaza na naredbu za čitanje.

#!/bin/bash
# Ova skripta će pronaći i ukloniti razmake
# u datotekama, zamjenjujući ih podvlakama
DIR="."
Kontroliranje petlje naredbom za čitanje preusmjeravanjem izlaza u petlji.
nađi $DIR -tip f | dok čita fajl; uradi
# koristite POSIX klasu [:space:] da pronađete razmake u nazivima datoteka
if [[ "$file" = *[[:space:]]* ]]; onda
# zamijenite razmake podvlakama
mv "$file" `echo $file | tr ‘ ‘ ‘_’`
fi;
urađeno

Šifra: Odaberite sve $ ls -1
script.sh
$ dodirnite "fajl sa razmacima"
$ ls -1
fajl sa razmacima
script.sh
$ ./script.sh
$ ls -1
file_with_spaces
script.sh

13. Funkcije

#!/bin/bash
# Funkcije se mogu deklarirati bilo kojim redoslijedom
funkcija funkcija_B(
eho funkcija B.
}
funkcija funkcija_A(
echo $1
}
funkcija funkcija_D(
eho funkcija D.
}
funkcija_C(
echo $1
}
# Funkcije poziva
# prosljeđuje parametar funkciji A
function_A "Funkcija A."
funkcija_B
# prosljeđuje parametar funkciji C funkciji
function_C "Funkcija C."
funkcija_D

Kod: Odaberite sve $ ./functions.sh
Funkcija A.
Funkcija B.
Funkcija C.
Funkcija D.

14. Izaberite operatera - Izaberite

#!/bin/bash
PS3='Odaberi jednu riječ:'
# odaberite
odaberite riječ u "linux" "bash" "scripting" "tutorial"
uradi
echo "Riječ koju ste odabrali je: $word"
# Prekini, inače će petlja biti beskonačna.
break
urađeno
izlaz 0

Kod: Odaberite sve $ ./select.sh
1) linux
2) bash
3) skriptiranje
4) tutorijal
Odaberite jednu riječ: 4
Riječ koju ste odabrali je: tutorial

15. Operator odabira - Slučaj

#!/bin/bash
echo "Koji je vaš preferirani programski / skript jezik"
echo "1) bash"
echo "2) perl"
eho "3) fiton"
echo "4) c++"
echo "5) Ne znam!"
read case;
# jednostavna struktura izbora slučaja
# imajte na umu da je u ovom primjeru $case samo varijabla
# i ne mora se tako zvati. Ovo je samo primjer
$case in
1) echo "Odabrali ste bash";;
2) echo "Odabrali ste perl";;
3) echo "Izabrali ste fiton";;
4) echo "Izabrali ste c++";;
5) izlaz
esac

Šifra: Odaberite sve $ ./case.sh
Koji je vaš preferirani programski/skriptni jezik
1) bash
2) perl
3) fiton
4) c++
5) Ne znam!
4
Izabrali ste c++

———————————————————————————-

Detaljnije informacije možete dobiti iz različitih izvora, na primjer ovdje
original: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin … -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296

Danas ćemo pričati o bash skriptama. Ovo su skripte komandne linije napisane za bash shell. Postoje i druge ljuske, kao što su zsh, tcsh, ksh, ali ćemo se fokusirati na bash. Ovaj materijal je namijenjen svima, jedini uvjet je mogućnost rada na Linux komandnoj liniji.



Skripte komandne linije su skupovi istih komandi koje se mogu uneti sa tastature, sakupiti u fajlove i objediniti nekom zajedničkom svrhom. Istovremeno, rezultati rada timova mogu imati ili nezavisnu vrijednost ili poslužiti kao input za druge timove. Skripte su moćan način za automatizaciju često izvođenih radnji.

Dakle, ako govorimo o komandnoj liniji, ona vam omogućava da izvršite nekoliko naredbi odjednom, unoseći ih tačkom i zarezom:

pwd ; ko sam ja
Zapravo, ako ste ovo isprobali u svom terminalu, vaša prva bash skripta koja koristi dvije komande je već napisana. Radi ovako. Naredba pwd prvo prikazuje informacije o trenutnom radnom direktoriju, a zatim whoami komanda prikazuje informacije o korisniku pod kojim ste prijavljeni.

Koristeći sličan pristup, možete kombinirati koliko god želite naredbi u jednom redu, ograničenje je samo maksimalni broj argumenata koji se mogu proslijediti programu. Ovo ograničenje možete definirati sljedećom naredbom:

Getconf ARG_MAX
Komandna linija je odličan alat, ali morate unijeti komande u nju svaki put kada vam zatrebaju. Šta ako napišemo skup naredbi u datoteku i jednostavno pozovemo tu datoteku da ih izvršimo? U stvari, datoteka o kojoj govorimo zove se skripta komandne linije.

Kako funkcionišu bash skripte

Kreirajte praznu datoteku koristeći dodirnu komandu. U prvom redu morate odrediti koju ljusku ćemo koristiti. Zanima nas bash, tako da će prvi red fajla biti:

#!/bin/bash
Na drugom mjestu u ovoj datoteci, heš simbol se koristi za označavanje komentara koje ljuska ne obrađuje. Međutim, prvi red je poseban slučaj, gde heš znak praćen znakom uzvika (koji se naziva shebang) i putanja do bash govori sistemu da je skripta napisana posebno za bash.

Komande ljuske su odvojene linijom, komentari su odvojeni znakom funte. Evo kako to izgleda:

#!/bin/bash # Ovo je komentar pwd whoami
Ovdje, baš kao i na komandnoj liniji, možete pisati naredbe u jednom redu, odvajajući ih tačkom i zarezom. Međutim, ako pišete naredbe u različitim redovima, fajl je lakše čitati. U svakom slučaju, školjka će ih obraditi.

Postavljanje dozvola za datoteku skripte

Sačuvajte datoteku, nazovite je myscript i skoro ste gotovi sa bash skriptom. Sada jedino što preostaje je da ovu datoteku učinite izvršnom, u suprotnom, kada pokušate da je pokrenete, naići ćete na grešku Permission denied.


Pokušaj pokretanja datoteke skripte s pogrešno konfiguriranim dozvolama

Učinimo datoteku izvršnom:

Chmod +x ./myscript
Sada pokušajmo da ga izvršimo:

./myscript
Nakon postavljanja dozvola, sve radi kako treba.


Uspješno pokrenite bash skriptu

Izlaz poruke

Naredba echo se koristi za ispis teksta na Linux konzoli. Iskoristimo znanje o ovoj činjenici i uredimo našu skriptu, dodajući objašnjenja podacima koji izlaze komande koje su već u njemu:

#!/bin/bash # naš komentar je ovdje echo "Trenutni direktorij je:" pwd echo "Korisnik prijavljen je:" whoami
Evo šta se dešava nakon pokretanja ažurirane skripte.


Izlaz poruka iz skripte

Sada možemo prikazati objašnjenja pomoću komande echo. Ako ne znate kako urediti datoteku pomoću Linux alata ili se ranije niste susreli s komandom echo, pogledajte ovaj članak.

Korištenje varijabli

Varijable vam omogućavaju da pohranite informacije u datoteci skripte, na primjer, rezultate naredbi za korištenje od strane drugih naredbi.

Nema ništa loše u izvršavanju pojedinačnih naredbi bez pohranjivanja rezultata njihovog rada, ali mogućnosti ovog 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 komande ljuske moraju da rade sa nekim sistemskim podacima. Na primjer, evo kako prikazati kućni direktorij trenutnog korisnika:

#!/bin/bash # display user home echo "Dom za trenutnog korisnika je: $HOME"
Imajte na umu da sistemsku varijablu $HOME možemo koristiti u dvostrukim navodnicima, što neće spriječiti sistem da je prepozna. Evo šta se dešava ako pokrenete gornju skriptu.


Korištenje varijable okruženja u skripti

Ali šta ako želite da prikažete znak dolara? Hajde da probamo ovo:

Eho "Imam 1 dolar u džepu"
Sistem će otkriti znak dolara u nizu ograničenom navodnicima i pretpostaviti da smo referencirali varijablu. Skripta će pokušati prikazati vrijednost nedefinirane varijable $1. Ovo nije ono što nam treba. sta da radim?

U ovakvoj situaciji pomaže korištenje kontrolnog znaka obrnute kose crte prije znaka dolara:

Eho "Imam \$1 u džepu"
Skripta će sada ispisati tačno ono što se očekuje.


Korištenje izlazne sekvence za izlaz znaka dolara

Korisničke varijable

Pored varijabli okruženja, bash skripte vam omogućavaju da postavite i koristite vlastite varijable u skripti. Takve varijable drže vrijednost dok se skripta ne završi.

Kao i kod sistemskih varijabli, korisničkim varijablama se može 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 # testiranje varijabli grade=5 person="Adam" echo "$osoba je dobar dečko, on je u razredu $grade"
Evo šta se dešava nakon pokretanja takve skripte.


Prilagođene varijable u skripti

Zamjena komande

Jedna od najkorisnijih karakteristika bash skripti je mogućnost izdvajanja informacija iz izlaza naredbi i dodjeljivanja ih varijablama, što vam omogućava da koristite ove informacije bilo gdje u datoteci skripte.

Ovo se može uraditi na dva načina.

  • Sa pozadinskim znakom "`"
  • Sa $() konstrukcijom
Kada koristite prvi pristup, pazite da ne koristite jedan navodnik umjesto kvačice. Naredba mora biti zatvorena u dvije takve ikone:

mydir=`pwd`
U drugom pristupu, isto se piše ovako:

mydir=$(pwd)
A skripta bi na kraju mogla izgledati ovako:

#!/bin/bash mydir=$(pwd) echo $mydir
U toku svog rada, izlaz naredbe pwd će biti pohranjen u varijablu mydir, čiji će sadržaj, koristeći komandu echo, pasti u konzolu.


Skripta koja sprema rezultate naredbe u varijablu

Matematičke operacije

Da biste izvršili matematičke operacije u datoteci skripte, možete koristiti konstrukciju poput $((a+b)):

#!/bin/bash var1=$((5 + 5)) echo $var1 var2=$(($var1 * 2)) echo $var2


Matematičke operacije u skripti

struktura kontrole ako-onda

U nekim scenarijima, potrebno je kontrolirati tok izvršenja naredbe. Na primjer, ako je određena vrijednost veća od pet, mora se izvršiti jedna radnja, u suprotnom druga. Ovo je primjenjivo u mnogim situacijama, a kontrolna konstrukcija ako-onda će nam ovdje pomoći. U svom najjednostavnijem obliku, to izgleda ovako:

Ako naredba onda komande fi
A evo radnog primjera:

#!/bin/bash ako pwd onda echo "Radi" fi
U ovom slučaju, ako se naredba pwd uspješno završi, tekst "to radi" će biti ispisan na konzoli.

Iskoristimo znanje koje imamo i napišimo složeniji scenario. Recimo da želite da pronađete korisnika u /etc/passwd, i ako ga možete pronaći, prijavite da postoji.

#!/bin/bash user=likegeeks ako grep $user /etc/passwd onda echo "Korisnik $user postoji" fi
Ovo se dešava nakon pokretanja ove skripte.


Pretraga korisnika

Ovdje smo koristili naredbu grep da pronađemo korisnika u /etc/passwd datoteci. Ako vam naredba grep nije poznata, njen opis možete pronaći ovdje.

U ovom primjeru, ako je korisnik pronađen, skripta će prikazati odgovarajuću poruku. Šta ako se korisnik ne može pronaći? U ovom slučaju, skripta će jednostavno završiti izvršenje bez da nam ništa kaže. Volio bih da nam kaže i o tome, pa hajde da poboljšamo kod.

Kontrolna konstrukcija ako-onda-drugo

Da bi program mogao izvesti i rezultate uspješne pretrage i neuspjeha, koristit ćemo konstrukciju if-then-else. Evo kako je postavljeno:

if komanda onda komande else komande fi
Ako prva naredba vrati nulu, što znači da je uspjela, uvjet će biti istinit i izvršenje neće ići niz else granu. U suprotnom, ako se vrati nešto drugačije od nule, što znači neuspjeh ili lažan rezultat, naredbe iza else će se izvršiti.

Hajde da napišemo sledeću skriptu:

#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo "Korisnik $user postoji" inače echo "Korisnik $user ne postoji" fi
Njegovo izvršenje išlo je duž druge grane.


Pokretanje skripte sa konstrukcijom if-then-else

Pa, idemo dalje i zapitamo se o težim uslovima. Što ako trebate provjeriti ne jedan uslov, već nekoliko? Na primjer, ako je traženi korisnik pronađen, jedna poruka bi trebala biti prikazana, ako je ispunjen neki drugi uvjet, trebala bi se prikazati druga poruka itd. U takvoj situaciji će nam pomoći ugniježđeni uslovi. izgleda ovako:

Ako komanda1 onda komanduje elif komanda2 onda komande fi
Ako prva naredba vrati nulu, što ukazuje na uspjeh, izvršit će se naredbe u prvom bloku then, u suprotnom, ako je prvi uvjet netačan, a ako druga naredba vrati nulu, izvršit će se drugi blok koda.

#!/bin/bash user=anotherUser if grep $user /etc/passwd onda echo "Korisnik $user postoji" elif ls /home onda echo "Korisnik ne postoji, ali svejedno postoji direktorij pod /home" fi
U takvoj skripti možete, na primjer, kreirati novog korisnika koristeći naredbu useradd ako pretraga ne daje rezultate ili učiniti nešto drugo korisno.

Poređenje brojeva

U skriptama možete upoređivati ​​numeričke vrijednosti. Ispod je lista relevantnih komandi.
n1 -eq n2 Vraća istinito ako je n1 jednako n2.
n1 -ge n2 Vraća istinito ako je n1 veće ili jednako n2.
n1 -gt n2 Vraća istinito ako je n1 veće od n2.
n1 -le n2 Vraća istinito ako je n1 manje ili jednako n2.
n1 -lt n2 Vraća istinito ako je n1 manje od n2.
n1 -ne n2 Vraća tačno ako n1 nije jednako n2.

Kao primjer, pokušajmo s jednim od operatora poređenja. Imajte na umu da je izraz zatvoren u uglastim zagradama.

#!/bin/bash val1=6 if [ $val1 -gt 5 ] then echo "Test vrijednost $val1 je veća od 5" inače echo "Test vrijednost $val1 nije veća od 5" fi
Evo šta će ova komanda dati.


Upoređivanje brojeva u skriptama

Vrijednost varijable val1 je veća od 5, kao rezultat toga, tada se grana operatora poređenja izvršava i odgovarajuća poruka se prikazuje u konzoli.

Poređenje nizova

Skripte također mogu upoređivati ​​vrijednosti nizova. Operatori poređenja izgledaju prilično jednostavno, ali operatori poređenja nizova imaju određene posebnosti, kojih ćemo se dotaknuti u nastavku. Evo liste operatera.
str1 = str2 Testira stringove na jednakost, vraća true ako su stringovi identični.
s tr1 != str2 Vraća true ako stringovi nisu identični.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1 > str2 Vraća true ako je str1 veći od str2.
-n str1 Vraća tačno ako je dužina str1 veća od nule.
-z str1 Vraća tačno ako je dužina str1 nula.

Evo primjera poređenja nizova u skripti:

#!/bin/bash korisnik ="likegeeks" if [$user = $USER] then echo "Korisnik $user je trenutno prijavljen korisnik" fi
Kao rezultat izvršavanja skripte, dobijamo sljedeće.


Poređenje stringova u skriptama

Evo jedne karakteristike poređenja stringova koja je vrijedna spomena. Naime, operatori ">" i "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>' kao naredba za preusmjeravanje izlaza.

Evo kako rad sa ovim operatorima izgleda u kodu:

#!/bin/bash val1=text val2="drugi tekst" ako [ $val1 \>
Evo rezultata skripte.


Poređenje nizova, upozorenje bačeno

Imajte na umu da skripta, iako se izvršava, daje upozorenje:

./myscript: red 5: [: previše argumenata
Da biste se riješili ovog upozorenja, stavite $val2 u dvostruke navodnike:

#!/bin/bash val1=text val2="drugi tekst" ako [ $val1 \> "$val2" ] onda echo "$val1 je veći od $val2" inače echo "$val1 je manji od $val2" fi
Sada sve radi kako treba.


Poređenje nizova

Još jedna karakteristika ">" i "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks likegeeks
Sačuvajte ga pod imenom myfile , a zatim pokrenite sljedeću naredbu u terminalu:

Sortiraj moj fajl
On će sortirati redove iz datoteke na sljedeći način:

Likegeeks Likegeeks
Naredba sort po defaultu sortira nizove uzlaznim redoslijedom, tj. malo slovo u našem primjeru je manje od velikog slova. Sada pripremimo skriptu koja će upoređivati ​​iste nizove:

#!/bin/bash val1=Likegeeks val2=likegeeks ako [ $val1 \> $val2 ] onda echo "$val1 je veći od $val2" inače echo "$val1 je manji od $val2" fi
Ako ga pokrenete, ispostaviće se da je suprotno - malo slovo je sada veće od velikog.


sortiranje naredbi i poređenje stringova u skript datoteci

U naredbama za poređenje, velika slova su manja od malih slova. Poređenje nizova ovdje se vrši poređenjem ASCII znakovnih kodova, stoga redoslijed sortiranja ovisi o kodovima znakova.

Komanda sortiranja, zauzvrat, koristi redoslijed sortiranja naveden u postavkama jezika sistema.

Provjere datoteka

Možda se donje naredbe najčešće koriste u bash skriptama. Oni vam omogućavaju da provjerite različite uvjete u vezi s datotekama. Evo liste ovih naredbi.
-d datoteka Provjerava da li datoteka postoji i da li je direktorij.
-e datoteka Provjerava da li datoteka postoji.
-f datoteka Provjerava da li datoteka postoji i da li je datoteka.
-r datoteka Provjerava da li datoteka postoji i da li je čitljiva.
-s datoteka Provjerava da li datoteka postoji i nije li prazna.
-w datoteka Provjerava da li datoteka postoji i da li se može pisati.
-x datoteka Provjerava da li datoteka postoji i da li je izvršna.
file1 -nt file2 Provjerava da li je fajl1 noviji od fajla2.
file1 -ot file2 Provjerava da li je fajl1 stariji od fajla2.
-O datoteka Provjerava da li datoteka postoji i da li je u vlasništvu trenutnog korisnika.
-G datoteka Provjerava da li datoteka postoji i da li njen ID grupe odgovara ID-u grupe trenutnog korisnika.

Ove komande, kao i mnoge druge o kojima se danas raspravlja, lako se pamte. Njihova imena, kao skraćenice za različite riječi, direktno ukazuju na provjere koje obavljaju.

Isprobajmo jednu od naredbi u praksi:

#!/bin/bash mydir=/home/likegeeks if [ -d $mydir ] then echo "Direktorij $mydir postoji" cd $ mydir ls else echo "Direktorij $mydir ne postoji" fi
Ova skripta, za postojeći direktorij, će prikazati njegov sadržaj.


Ispisivanje sadržaja direktorija

Vjerujemo da s ostalim naredbama možete sami eksperimentirati, sve se primjenjuju po istom principu.

Rezultati

Danas smo razgovarali o tome kako započeti pisanje bash skripti i pokrili neke osnovne stvari. U stvari, tema bash programiranja je ogromna. Ovaj članak je prijevod prvog dijela velike serije od 11 materijala. Ako želite da nastavite odmah - evo liste originala ovih materijala. Radi praktičnosti, ovdje je uključen onaj čiji ste prijevod upravo pročitali.
mob_info