Streamovi, programski kanali i preusmjeravanja. Jednostavna sigurnosna skripta

Danas ćemo početi razmatrati mogućnosti basha. Budući da je ovo pitanje prilično opsežno, morat ćemo ga podijeliti u nekoliko dijelova. Pa idemo od jednostavnog prema složenom. Usput, postoji vrlo velika vjerojatnost da će informacije naučene tijekom učenje bash, bit će korisne pri radu s drugim tumačima naredbi.
Standardni ulazni i izlazni tok.
Ovi prilično važni koncepti jednostavno znače odakle program čita podatke prema zadanim postavkama (stdin) i odakle ispisuje rezultate svog rada (stdout). Postoji i standardni izlazni tok pogrešaka (stderr). Obično je to ekran (točnije korisnički terminal) + tipkovnica. Zašto to trebate znati? Ali činjenica je da se svi ti tokovi mogu preusmjeriti. Najčešće se datoteke koriste za ulaz/izlaz.
Na primjer, na ovaj način možete stvoriti datoteku koja sadrži popis datoteka u navedenom direktoriju.
$ ls -l > ~/datoteka_s_datotekama
Usput, vrijedi zapamtiti da će sljedeći put kada ga izvršite datoteka biti potpuno prepisana i sve što je bilo prije bit će izgubljeno. Ako trebate dodati na kraj datoteke, trebate koristiti “>>” umjesto “>”
$ ls -l >> ~/datoteka_s_datotekama
Također, prilikom izvršavanja naredbe, možete odvojiti niti.
stdin je broj 0
stdout je broj 1
stderr je broj 2
To jest, možete ispisati pogreške u zasebnu datoteku i redovne poruke bit će prikazan kao i obično. Da biste to učinili, trebate staviti broj 2 ispred “>” (broj niti, slično za stdin, stdout). Na primjer ovako
$ find / -name .bashrc 2> ~/finderrors.txt
Osim toga, postoji uređaj koji se zove /dev/null, na koji također možete preusmjeriti izlaz. U tom slučaju ništa poslano neće biti nigdje prikazano.
$ pronađi / -name asdf 2 > /dev/null
Izlaz se također može poslati drugoj naredbi. Na primjer, sljedeća naredba će ispisati broj riječi u datoteci
$ cat ~/finderrors.txt > wc -w
Ako trebate napisati skriptu u kojoj neki program zahtijeva unos, tada mu možete poslati sadržaj datoteke
$wc -w< ~/finderrors.txt
Bilješka. ">" bez navođenja broja niti tumači se kao "1 >". To jest, izlaz će biti samo stdin.
Transportne trake.
Sigurno ste vidjeli timove sljedeći tip:
$ cat /etc/bash.bashrc | više
Kao rezultat njegovog rada, izlaz će biti pauziran kada se zaslon ispuni. Dakle, "|" i tu je upravo ovaj transporter. Pametno rečeno, ovo je kanal u koji jedan proces može samo pisati, a drugi samo čitati. Uzorkovanje i stavljanje u takav transporter odvija se po principu FIFO (First In - First Out). Ovaj princip se također naziva red čekanja, koji vrlo jednostavno i točno karakterizira njegov rad. Cjevovodi se koriste za kombiniranje rada nekoliko malih programa.
Pogledajmo rad sljedeće naredbe.
$ mačka moja datoteka | grep Linux | mi -1
Prvo cat myfile ispisuje sadržaj datoteke myfile, zatim grep Linux čita izlaz i odabire samo retke koji sadrže riječ Linux. Tada wc -l broji broj redaka. Kao rezultat, dobit ćemo broj redaka koji sadrže riječ Linux.
Vrlo je zgodno koristiti uslužni program xargs zajedno s “|”. xargs čita stdin izlazne elemente odvojene razmacima i izvršava program prosljeđujući ih jednom ili više puta.
Na primjer
$ pronađi /tmp -naziv jezgre -tip f -ispis | xargs /bin/rm -f
Ova naredba pronalazi datoteke pod nazivom core u direktoriju /tmp i briše ih.
Posebni simboli.
Za razliku od Windowsa, nazivi datoteka u Linuxu mogu sadržavati gotovo sve znakove (na primjer, naziv datoteke example*of:file je sasvim moguć). Ali bash koristi neke znakove kao servisne znakove. I za ispravan rad Od ovih znakova treba pobjeći. To se može učiniti na nekoliko načina.
Izraz možete staviti u navodnike. Na primjer
$ cp "primjer*od:datoteke" ~
Također možete koristiti jednostruke navodnike
$ cp "primjer*od:datoteke" ~
Razlika je u tome što u jednostrukim navodnicima svi posebni znakovi gube svoje značenje, u dvostrukim navodnicima - svi osim $ i \
Ali najuniverzalniji je C-lik način poništavanja posebnih znakova. Da biste to učinili, samo stavite “\” (bez navodnika) ispred simbola. Na primjer, naša naredba će izgledati ovako.
$ cp primjer\*of\:datoteka ~
Izvršavanje naredbi.
Postoji nekoliko simbola za organiziranje izvršavanja naredbi.
Ako trebate izvršiti nekoliko naredbi uzastopno, one bi trebale biti odvojene simbolom “;”. Na primjer, sljedeći nizće kompajlirati datoteku (a kompilacija je dug proces, za to vrijeme možete spavati!), zatim isključite računalo.
$ napraviti; sudo shutdown -h sada
Ako trebate pokrenuti program pozadina(odnosno, vratite kontrolu korisniku odmah nakon pokretanja, to može biti zgodno prilikom pokretanja grafičkih aplikacija), tada trebate staviti simbol "&" nakon naredbe. Na primjer
$sudo synaptic &
Kao rezultat toga, Synaptic će se pokrenuti i možemo koristiti trenutni emulator terminala bez napuštanja.
Ali što ako trebamo izvršiti naredbu samo ako je operacija uspješno dovršena. Na primjer, postoji sljedeći zadatak:
Morate kompajlirati datoteku. Da biste to učinili morate pokrenuti configure, make, sudo make install. Štoviše, potrebno ju je izvršiti samo ako je prethodna naredba uspješno završila.
U takvim slučajevima koristi se niz “&&”. Operator nakon “&&” izvršava se samo ako je prethodni uspješno završen. Odnosno, za nas će izgledati ovako:
$ ./configure && make && sudo make install
Ako trebate izvršiti samo ako program završi s pogreškom, tada morate koristiti “||”. Na primjer, zakomplicirajmo problem. Ako postoji greška, morat ćete je zapisati u datoteku, a zatim, bez obzira na kraj, isključiti računalo.
$ ./configure && make && make install || echo fail > ~/errorfile; sudo shutdown -h sada
Obrasci imena datoteka
Najlakše ih je nabrojati na tanjur. Vrijedno je zapamtiti da se predlošci mogu kombinirati u jednoj naredbi.
Značenje uzorka
* Bilo koji niz znakova, uključujući prazne
? Bilo koji pojedinačni znak
(a,b,c,d) Bilo koji od znakova navedenih u zagradama
Bilo koji znak iz navedenih intervala
[^0-6] Svaki znak koji nije uključen u navedene intervale
Najlakše ih je razumjeti na primjeru.
Recimo da imamo mapu koja sadrži sljedeće datoteke.
Glava01, Glava02, Glava03, Glava04, Glava05, Glava15, Glava17.
Primijenimo predložak Glava0* i dobijemo listu Glava01, Glava02, Glava03, Glava04, Glava05.
Primijenimo predložak Glava?5 i dobijemo listu Glava05, Glava15.
Primijenimo predložak Glava?(4,5) i dobijemo listu Glava04, Glava05, Glava15.
Primijenimo predložak Glava0 i dobijemo listu Glava01, Glava02, Glava03.
Izvođenje aritmetičkih izraza.
Da, bash može i to. Za to postoje dva oblika
prvi $[izraz]
drugi $((izraz))
Na primjer
$echo$
Rezultat izvršenja bit će broj 6. Ako izraz nije točan, bash će prikazati poruku o pogrešci.
Zamjena naredbi.
Zamjena naredbi je vrlo moćan alat udarac. Poanta je da se napisana naredba mijenja u rezultat njenog izvršenja. Postoje dva oblika snimanja
$(naredba) i `naredba` (u ovom slučaju se ne koriste jednostruki navodnici, već znakovi dobiveni kombinacijom SHIFT+~). Na primjer, ovdje svijetli primjer, koji se koristi u Debianu prilikom instaliranja paketa zaglavlja za trenutni kernel.
# apt-get install linux-headers-`uname -r`
Naredba uname -r, kada se izvrši, prikazuje verziju kernela koji se koristi. Odnosno, kad ga izvršim, mijenja se u
# apt-get install linux-headers-2.6.25-2-686
Štoviše, za vas može poprimiti drugačiji izgled. Također možete promijeniti kernel i instalirati pakete istom naredbom.
Filteri
Ovo su naredbe koje mogu transformirati ulazni tok podataka i ispisati rezultat na standardni izlaz.
Tim Kratki opis
cat Na standardni izlaz (tj.
na zaslonu) prikazuje se sadržaj navedene datoteke (ili više datoteka).
hvata ako su njihova imena uzastopno navedena kao argumenti naredbe).
grep, fgrep, egrep Traži u ulazna datoteka odnosno podatke iz standardni unos linije koje sadrže navedeni uzorak i ispisuje ih na standardni izlaz
tr Zamjenjuje sve znakove koji se pojavljuju u ulaznom toku navedene na danom popisu s odgovarajućim znakovima s drugog navedenog popisa
comm Uspoređuje dvije datoteke redak po redak i ispisuje 3 stupca na standardni izlaz: prvi - retke koji se pojavljuju samo u 1. datoteci, drugi - retke koji se pojavljuju samo u 2. datoteci i treći - retke koji se pojavljuju u obje datoteke
pr Formati za ispis tekstualna datoteka ili sadržaj standardnog unosa
sed Editor niza koji se koristi za izvođenje nekih transformacija na ulaznom toku podataka (preuzetom iz datoteke ili standardnog unosa)
više i manje Prikažite sadržaj datoteke na ekranu u zasebnim stranicama točno veličine cijelog ekrana.
wc Broji broj riječi, redaka ili bajtova u toku.
Na primjer,
$grep CONFIG_XEN. -Rl | xargs -i sed -i -e "s/CONFIG_XEN/CONFIG_LUPO/g" ()
Traži datoteke u trenutna mapa, koji sadrži redak “CONFIG_XEN” i mijenja ga u “CONFIG_LUPO” u svim pronađenim datotekama.
Ovdje ćemo napraviti pauzu kako bismo razumjeli cjelokupnu količinu materijala. Bash je vrlo moćan tumač i potrebna je praksa da se njime ovlada. Sljedeći članak govori o izradi skripti za njega. Krenimo s programiranjem. Do sljedećeg puta!
Oznake: Linux, članci

Oznake: Zašto vam je potreban cjevovod naredbi u bashu?

Kad radite u timu, hranite jedni druge emocijama, svojim radom, uspjesima i postignućima....

Naredbe /scoreboard teams add name /scoreboard teams list /scoreboard teams join name /scoreboard teams leave ...

google.com/bin/echo foo | grep bar" .... getpid() = 13726<– PID ..... 1 · Почему в Ubuntu 16.04 медленный apt-get dist-upgrade? ... Спасибо, очень интересная статься… но как всегда нужна мера, чтобы не полочалось такого:

25. veljače 2009. - naredba do izvršena. Pogledajmo mali primjer: #!/bin/bash .... Cjevovod je vrlo moćan alat za rad s Bash konzolom. .... napraviti neke stvari i pokušati shvatiti zašto direktorij programa za rad nije pronađen... ... Možda ovo zahtijeva neke postavke, ali u isto vrijeme imam...

Molim vas, pomozite mi riješiti nekoliko problema. #!/bin/bash | Autor teme: Ilya

30. Napravite cjevovod za popis samo imena i dopuštenja datoteka koje se trenutno nalaze u vašem radnom direktoriju. 31. Promijenite konstruirani cjevovod tako da popis bude spremljen u datoteku spisok vašeg HOME direktorija, i da se prikazuje samo broj datoteka na popisu. 32. Prikažite sadržaj /etc/passwd datoteke, organiziran po polju korisničkog imena. 33. Napravite alias pod nazivom loggedon koji će prikazati abecedno poredan popis imena korisnika prijavljenih na sustav. 34. Dodijelite varijabli IAM svoje ime za prijavu. Pokrenite drugu ljusku. Vidite li ovu varijablu? Što trebate učiniti da biste ga vidjeli u generiranoj ljusci? Promijenite vrijednost varijable IAM u stvorenoj ljusci. Izađite iz stvorene ljuske. Potražite vrijednost ove varijable u izvornoj ljusci. Objasnite rezultat. 40. Napišite shell program hello koji daje sljedeći odgovor na argumente naredbenog retka: - argument “-d” - program će izvršiti naredbu date; - argument “-l” - program će prikazati sadržaj trenutnog direktorija; Ako u naredbenom retku nema argumenata ili su nevažeći, program će ispisati pomoć o svojim opcijama. 41. Napišite program za riječi koji će od korisnika tražiti da unese jednu po jednu riječ sve dok ne unese riječ "end". Zapamtite sve riječi koje ste unijeli. Nakon unosa riječi “end”, prikazati sve unesene riječi. Hvala vam ako možete predložiti barem jedno od ovoga

Vitalij  32. mačka /etc/passwd | vrsta

Napredni vodič za bash skriptiranje - Linux na ruskom

Zašto je potrebno poznavanje Shell jezika? 2. ..... Prijenos izlaza iz naredbe echo u naredbu read, duž cjevovoda; 33-1. omotna skripta; 33-2. Više...

I/O preusmjeravanje - OpenNet

Napredni Bash-Scripting Guide: The Art of Language Programming... Jednolinijske naredbe za preusmjeravanje # (utječu samo na liniju... Samo stderr se prenosi. exec 3>&1 # Spremi trenutni...

Operator for-in namijenjen je sekvencijalnom pristupu vrijednostima navedenim na popisu. Svaka vrijednost na popisu dodijeljena je varijabli. Sintaksa je sljedeća:

za varijablu u value_list do izvršene naredbe

Pogledajmo mali primjer:

#!/bin/bash za i u 0 1 2 3 4 #mi ćemo naizmjenično dodijeliti vrijednosti od 0 do 4 uključujući varijablu $i do echo "Broj konzole je $i ">> /dev/pts/$i #Napišite redak "Broj konzole je $i" u datoteku /dev/pts/$i (datoteka virtualnog terminala) gotovo #petlja završena izlaz 0

Nakon izvođenja primjera, redak s njegovim brojem pojavit će se u prvih 5 virtualnih konzola (terminala). Varijabla $i se naizmjenično zamjenjuje vrijednostima s liste i u petlji radovi u tijeku s vrijednošću ove varijable.

Ciklusi. while petlja

While petlja je složenija od for-in petlje i koristi se za ponavljanje naredbi sve dok je neki izraz istinit (povratni kod = 0). Sintaksa operatora je sljedeća:

dok izraz ili naredba vraća povratni kod naredbe do done

Pogledajmo sljedeći primjer kako radi petlja:

#!/bin/bash again =da #ponovno dodijelite vrijednost "yes" varijabli dok [" $opet"= "da" ] #Petljat ćemo sve dok $again ne bude jednako "yes" do echo "Molimo unesite ime:" pročitajte ime echo "Ime koje ste unijeli je $name" echo "Želite li nastaviti?" pročitaj ponovno učinjeno echo "Bye-Bye"

A sada rezultat skripte:

Ite@ite-desktop:~$ ./bash2_primer1.sh Unesite ime: ite Ime koje ste unijeli je ite Želite li nastaviti? da Molimo unesite ime: mihail Ime koje ste unijeli je mihail Želite li nastaviti? nema Bye-Bye

Kao što vidite, petlja se izvodi sve dok ne unesemo nešto osim "da". Između do i done možete opisati bilo koje strukture, operatore, itd., svi će se izvršiti u petlji, ali trebate biti oprezni s ovom petljom, ako pokrenete bilo koju naredbu u njoj bez promjene varijable izraza, možete dobiti. uhvaćen u beskrajnu petlju.

Sada o uvjetu istine. Nakon vremena, kao u uvjetnoj naredbi if-then-else, možete umetnuti bilo koji izraz ili naredbu koja vraća povratni kod, a petlja će se izvršavati sve dok povratni kod ne bude = 0! Operator "[" je analog naredbe test, koja provjerava istinitost uvjeta koji joj je proslijeđen.

Pogledajmo još jedan primjer, uzeo sam ga iz knjige Advanced Bash scripting. Jako mi se svidio Smile, ali sam ga malo pojednostavio. U ovom primjeru ćemo predstaviti drugu vrstu UNTIL-DO petlje. Ovaj je praktički potpuni analog WHILE-DO ciklus, izvršava se samo dok je neki izraz lažan.

Evo primjera:

#!/bin/bash odjek "Unesite brojnik: "čitati dividenda odjek "Unesite nazivnik: "čitaj djelitelj dnd =$dividenda #promijenit ćemo varijable dividenda i djelitelj, #čuvajmo njihovo znanje u drugim varijablama, jer... daju nam#će trebati dvs =$djelitelj ostatak =1 do [ " $ostatak "-eq 0 ] dopustiti "ostatak = dividenda % djelitelj" dividenda =$divisor divisor =$remainder done echo "GCD brojeva $dnd i $dvs = $dividenda "

Rezultat izvršenja skripte:

Ite@ite-desktop:~$ ./bash2_primer3.sh Unesite brojnik: 100 Unesite nazivnik: 90 GCD od 100 i 90 = 10

Matematičke operacije

neka zapovjedi.

Naredba let proizvodi aritmetičke operacije preko brojeva i varijabli.

Pogledajmo mali primjer u kojem izvodimo neke izračune nad unesenim brojevima:

#!/bin/bash echo "Unesite a: " read a echo "Unesite b: " read b let "c = a + b" #addition echo "a+b= $c" neka "c = a / b" #division echo "a/b= $c" neka "c<<= 2" #pomiče c 2 bita ulijevo jeka "c nakon pomaka za 2 bita: $c " neka je "c = a % b" # pronalazi ostatak a podijeljen s b jeka " $a / $b . ostatak: $c "

Rezultat izvršenja:

Ite@ite-desktop:~$ ./bash2_primer2.sh Unesite a: 123 Unesite b: 12 a+b= 135 a/b= 10 c nakon pomaka za 2 znamenke: 40 123 / 12. ostatak: 3

Pa, kao što vidite, nema ništa komplicirano, popis matematičkih operacija je standardan:

Dodatak
- - oduzimanje
* - množenje
/ - podjela
** - potenciranje
% - modul (modulo dijeljenje), ostatak dijeljenja

let vam omogućuje korištenje kratica za aritmetičke upute, čime se smanjuje broj korištenih varijabli.

Na primjer: a = a+b je ekvivalentno a +=b, itd.

Rad s vanjskim programima pri pisanju shell skripti

Prvo, malo korisne teorije.

Preusmjeravanje streama

Bash (kao i mnoge druge ljuske) ima ugrađene deskriptore datoteka: 0 (stdin), 1 (stdout), 2 (stderr).

stdout - standardni izlaz. Ovdje ide sve što programira
stdin - standardni unos. To je sve što korisnik upisuje u konzolu
stderr - Standardni izlaz pogreške.

Za operacije s ovim ručicama postoje posebni znakovi: > (preusmjeravanje izlaza),< (перенаправление ввода). Оперировать ими не сложно. Например:

mačka /dev/random > /dev/null

preusmjeriti izlaz cat /dev/random na /dev/null (potpuno beskorisna operacija) ili

ls -la > popis

zapišite sadržaj trenutnog direktorija u datoteku popisa (korisnije)

Ako postoji potreba za dodavanjem u datoteku (kada se koristi ">" zamjenjuje se), morate koristiti ">>" umjesto ">"

sudo< my_password

nakon što sudo zatraži lozinku, ona će biti preuzeta iz datoteke my_password, kao da ste je unijeli s tipkovnice.

Ako u datoteku trebate upisati samo pogreške koje se mogu pojaviti tijekom izvođenja programa, možete koristiti:

./ program_s_greškom 2 > datoteka_greške

broj 2 ispred ">" znači da morate preusmjeriti sve što završi u deskriptoru 2 (stderr).

Ako trebate prisiliti stderr da piše u stdout, to možete učiniti na sljedeći način. put:

./ program_with_error 2 >& 1

simbol "&" znači pokazivač na deskriptor 1 (stdout)

(Prema zadanim postavkama, stderr piše u konzolu na kojoj korisnik radi (odnosno, piše na zaslon)).

2. Transporteri

Cjevovod je vrlo moćan alat za rad s Bash konzolom. Sintaksa je jednostavna:

tim1 | naredba 2 - znači da će izlaz naredbe 1 biti proslijeđen kao ulaz naredbi 2

Cjevovodi se mogu grupirati u lance i izlaziti pomoću preusmjeravanja u datoteku, na primjer:

ls -la | grep "hash" | poredaj > sortilg_list

Izlaz naredbe ls -la prosljeđuje se naredbi grep, koja odabire sve retke koji sadrže riječ hash i prosljeđuje je naredbi sort, koja zapisuje rezultat u datoteku sorting_list. Sve je sasvim jasno i jednostavno.

Najčešće se Bash skripte koriste za automatizaciju nekih rutinskih operacija u konzoli, stoga ponekad postoji potreba da se stdout jedne naredbe obradi i prebaci u stdin u drugu naredbu, dok se rezultat izvršavanja jedne naredbe mora obraditi u nekom put. U ovom odjeljku pokušat ću objasniti osnovna načela rada s vanjskim naredbama unutar skripte. Mislim da sam dao dovoljno primjera i sada mogu napisati samo ono najvažnije.

1. Prijenos izlaza varijabli

Za snimanje izlaza naredbe u varijablu, jednostavno stavite naredbu u navodnike, na primjer

A = ` echo "qwerty" ` echo $a

Rezultat: qwerty

Međutim, ako želite pohraniti popis direktorija u varijablu, morate pravilno obraditi rezultat da biste podatke smjestili u varijablu. Pogledajmo mali primjer:

POPIS =` pronađi / svn/ -tip d 2>/ dev/ null| awk "(FS="/") (ispiši $4)" | sortirati | jedinstven | tr "\n" " " ` za ONE_OF_LIST u $LIST uradi svnadmin hotcopy / svn/ $ONE_OF_LIST / svn/ temp4backup/ $ONE_OF_LIST gotovo

Ovdje koristimo za petlju-do-done za arhiviranje svih direktorija u mapi /svn/ pomoću naredbe svnadmin hotcopy (koja u našem slučaju nikome nije bitna, samo kao primjer). Linija od najvećeg interesa je: LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (ispiši $4)"| sort|jedinstven | tr "\n" " "` U njoj je varijabli LIST dodijeljeno izvršenje naredbe find, obrađene naredbama awk, sort, uniq, tr (nećemo razmatrati sve ove naredbe, jer je ovo poseban članak) . Varijabla LIST će sadržavati nazive svih direktorija u mapi /svn/ smještene u jednom retku (kako bi se unijela u ciklus.

Kao što vidite, sve nije teško, samo shvatite princip i napišite nekoliko vlastitih skripti. Na kraju članka, želio bih vam puno sreće u učenju BASH-a i Linuxa općenito. Kritika je, kao i obično, dobrodošla. Sljedeći članak može biti posvećen korištenju programa kao što su sed, awk.

Što je potrebno?

Trebali biste se upoznati s naredbenim redom kao i s osnovnim konceptima programiranja. Iako ovo nije vodič za programiranje, on objašnjava (ili, kao barem, pokušava objasniti) mnoge osnovne pojmove.
Korištenje ovog dokumenta

Ovaj dokument može biti neophodan u sljedećim situacijama:

Imate ideje vezane uz programiranje, a postoji potreba za provedbom procesa kodiranja nekih shell skripti.

Vaše programske ideje nisu dovoljno specifične i zahtijevaju dodatne smjernice.

Želite li pogledati neke skripte ljuske i komentare kao primjer za stvaranje vlastitih?

Migrirate s DOS/Windows (ili ste to već učinili) i želite stvoriti "batch" datoteke.

Vi ste potpuni štreber i čitate sve upute koje vam dođu pod ruku.

Najjednostavnije skripte

Ovaj HOW-TO pokušava vam dati neke smjernice za programiranje ljuske, samo na temelju primjera.

U ovom odjeljku pronaći ćete male skripte koje će vam vjerojatno biti od koristi prilikom svladavanja nekih tehnika.

Tradicionalna skripta "zdravo svijetu".

#!/bin/bash echo Pozdrav svijete!

Ova skripta sadrži samo dva retka. Prvi govori sustavu koji se program koristi za pokretanje datoteke.

Drugi red je jedina radnja koju ova skripta izvodi, ispisuje "Hello world" na terminalu.

Ako primite nešto poput ./hello.sh: Naredba nije pronađena. , onda je možda prvi red "#!/bin/bash" pogrešan; pokrenite whereis bash ili pogledajte pronalaženje basha da shvatite što bi ovaj redak trebao biti.

Jednostavna sigurnosna skripta

#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

U ovoj skripti, umjesto ispisa poruke na terminalu, stvaramo tar arhivu korisničkog matičnog direktorija. Skripta NIJE namijenjena za praktičnu upotrebu. Učinkovitija skripta bit će predstavljena kasnije u ovom dokumentu. Rezervni primjerak.

Sve o teoriji preusmjeravanja i brzom pregledu

Postoje 3 deskriptora datoteka: stdin - standardni ulaz, stdout - standardni izlaz i stderr - standardna pogreška.

Vaše glavne karakteristike:
preusmjeriti stdout u datoteku
preusmjeriti stderr u datoteku
preusmjeriti stdout na stderr
preusmjeriti stderr na stdout
preusmjeriti stderr i stdout u datoteku
preusmjeriti stderr i stdout na stdout
preusmjeriti stderr i stdout na stderr

1 znači stdout, a 2 znači stderr. Kratka napomena za daljnje razumijevanje: s manje naredbom možete vidjeti i stdout, koji ostaje u međuspremniku, i stderr, koji se ispisuje na ekranu. Međutim, briše se kada pokušate "pretraživati" međuspremnik.

Primjer: stdout u datoteku

Ova akcija zapisuje standardni izlaz programa u datoteku.

ls -l > ls-l.txt

Ovo stvara datoteku pod nazivom "ls-l.txt". Sadržat će sve što biste vidjeli da jednostavno pokrenete naredbu "ls -l". 3.3 Primjer: stderr u datoteku
Ova radnja zapisuje standardni tok pogrešaka programa u datoteku.
grep da * 2> grep-errors.txt

Ovo stvara datoteku pod nazivom "grep-errors.txt". Ovo će sadržavati dio standardne pogreške izlaza naredbe "grep;da;*". 3.4 Primjer: stdout u stderr

Ova akcija zapisuje standardni izlaz programa u istu datoteku kao i standardni tok pogrešaka.
grep da * 1>&2

Ovdje se standardni izlaz naredbe šalje standardnoj pogrešci. To možete vidjeti na različite načine. 3.5 Uzorak: stderr 2 stdout

Ova akcija zapisuje standardni tok pogrešaka programa na isto mjesto kao i standardni izlaz.
grep * 2>&1
Ovdje se standardni tok pogrešaka naredbe šalje na standardni izlaz; Ako usmjerite rezultat (|) na manje, vidjet ćete da su linije koje bi inače bile izgubljene (kao što su napisane standardnom pogreškom) u ovom slučaju spremljene (kao što jesu na standardnom izlazu). 3.6 Primjer: stderr i stdout u datoteku

Ova radnja stavlja sav izlaz programa u datoteku. Ovo je dobra opcija za cron poslove: ako želite da se naredba izvodi potpuno tiho.
rm -f $(nađi / -ime jezgre) &> /dev/null

Ovo (pod pretpostavkom za cron) briše sve datoteke pod nazivom "core" u bilo kojem direktoriju. Zapamtite da biste trebali biti potpuno sigurni što naredba radi ako želite prebrisati njezin izlaz. 4. Transporteri

Ovaj odjeljak na prilično jednostavan i praktičan način objašnjava kako se transporteri trebaju koristiti i zašto bi vam mogli trebati.
Što je to i zašto biste ga trebali koristiti?

Cjevovodi vam daju mogućnost korištenja (autor je uvjeren da je to vrlo jednostavno) izlaza jednog programa kao ulaza drugog.

Primjer: jednostavan cjevovod sa sed

Ovo je vrlo jednostavan način korištenja pokretnih traka.

ls -l | sed -e "s//u/g"

Ono što se ovdje događa je da se naredba ls;-l inicijalno izvršava, a njen izlaz, umjesto da bude prikazan na ekranu, šalje sed programu, koji zauzvrat ispisuje ono što bi trebao na ekranu. 4.3 Primjer: alternativa za ls;-l;*.txt

Ovo može biti znatno složenije od ls;-l;*.txt, ali je ovdje predstavljeno samo da ilustrira rad s cjevovodima, a ne da se odluči između dvije metode popisa.

ls -l | grep "\.txt$"

Ovdje se izlaz ls -l šalje grepu, koji zauzvrat ispisuje retke koji odgovaraju regularnom izrazu "\.txt$". 5. Varijable

Varijable možete koristiti na isti način kao u bilo kojem programskom jeziku. Nema tipova podataka. Varijabla u bashu može biti broj, znak ili niz znakova.

Ne biste trebali deklarirati varijablu. Zapravo, dodjeljivanje vrijednosti njegovom pokazivaču već ga stvara.

Primjer: "Hello World!" pomoću varijabli

#!/bin/bash
STR="Zdravo svijete!"
echo $STR

Drugi redak stvara varijablu pod nazivom STR i dodjeljuje joj vrijednost niza "Hello World!". VRIJEDNOST ove varijable se zatim izdvaja dodavanjem znaka "$" na početku. Zapamtite (potrudite se) da ako ne koristite znak "$", izlaz programa može biti drugačiji. Vjerojatno ne onaj koji vam treba.
Primjer: vrlo jednostavna sigurnosna skripta (učinkovitija)
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz #OF - Izlazna datoteka - izlazna datoteka
tar -cZf $OF /dom/ja/

Ova skripta uvodi još jedan koncept. Prije svega, trebali biste se pozabaviti drugom linijom. Obratite pozornost na izraz "$(datum +%Y%m%d)". Ako pokrenete ovu skriptu, primijetit ćete da izvršava naredbu unutar zagrada, presrećući njezin izlaz.

Imajte na umu da će se u ovoj skripti naziv izlazne datoteke svakodnevno mijenjati na temelju formata naredbenog ključa datum;(+%Y%m%d). Ovo možete zamijeniti drugim dodjeljivanjem formata.
Ostali primjeri:
jeka ls
echo $(ls)

Lokalne varijable

Lokalne varijable mogu se stvoriti pomoću ključne riječi local.
#!/bin/bash
HELLO=Zdravo
funkcija zdravo(
lokalni HELLO=Svijet
echo $HELLO
}
echo $HELLO
zdravo
echo $HELLO
Ovaj bi primjer trebao biti dovoljan da pokaže kako se lokalne varijable mogu koristiti.

Uvjetne izjave

Uvjetne naredbe vam daju mogućnost da odlučite hoćete li izvršiti radnju ili ne; odluka se donosi pri izračunavanju vrijednosti izraza.

Samo teorija

Postoje mnogi oblici uvjetnih izjava. Elementarni oblik je if izraz then naredba, gdje se "naredba" izvršava samo ako "izraz" ima vrijednost "true". "2<1" - это выражение, имеющее значение "ложь", в то время как "2>1" - "istina".

Postoje i drugi oblici uvjetnih iskaza kao što su: if izraz then iskaz1 else iskaz2. Ovdje se "operator1" izvršava ako je "expression" istinit; inače se izvršava "statement2".

Drugi oblik uvjetnih iskaza je: if izraz1 onda operator1 else ako izraz2 onda operator2 else operator3. Ovaj obrazac samo dodaje niz "ELSE IF "expression2" THEN "statement2"", uzrokujući izvršenje "statement2" ako "expression2" ima vrijednost "true". Sve ostalo odgovara vašoj predodžbi o ovome (vidi prethodne obrasce).

Nekoliko riječi o sintaksi:
Osnovna konstrukcija naredbe "if" u bashu izgleda ovako:
if [izraz];
zatim
kod ako je "izraz" istinit.
fi

Primjer: osnovni primjer uvjetne naredbe if;..;then
#!/bin/bash
if ["foo" = "foo" ]; zatim

fi

Ako je izraz unutar uglatih zagrada istinit, tada je kod koji se treba izvršiti iza riječi "then" i prije riječi "fi", što označava kraj koda koji se treba izvršiti kada se uvjet ispuni.
Primjer: osnovni primjer uvjetne naredbe if;..;then;...;else
#!/bin/bash
if ["foo" = "foo" ]; zatim
echo izraz procjenjuje se na true
drugo

fi

Primjer: Uvjetne izjave s varijablama
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; zatim
echo izraz procjenjuje se na true
drugo
echo izraz procjenjuje se na lažno
fi
for, while i until petlje
U ovom odjeljku upoznat ćete se s petljama for, while i until.
For petlja se malo razlikuje od svojih parnjaka u drugim programskim jezicima. Prije svega, daje vam mogućnost izvođenja uzastopnih radnji na "riječima" u nizu.
while petlja izvršava dio koda ako je izraz koji se testira istinit; i zaustavlja se ako je false (ili se unutar koda za izvođenje naiđe na eksplicitno specificiran prekid petlje).
Dok je petlja gotovo identična while petlji. Jedina razlika je u tome što se kod izvršava ako je izraz koji se testira lažan.
Ako pretpostavite da su while i until vrlo slični, u pravu ste.

Primjer za petlju

#!/bin/bash
za i u $(ls); čini
echo stavka: $i
učinjeno

U drugom redu predstavljamo i kao varijablu koja prima različite vrijednosti sadržane u $(;ls;).

Ako je potrebno, treći red može biti duži; ili može biti nekoliko redaka prije gotovog (4. redak).

"gotovo" (4. red) označava da kod koji koristi $i završava i $i dobiva novu vrijednost.

Ova skripta nije od velike važnosti. Korisnija uporaba petlje for bila bi njezina uporaba za odabir samo određenih datoteka u prethodnom primjeru.
C-kao za

fiesh je predložio dodavanje ovog oblika petlje. Ovo je for petlja, najsličnija for petlji u C-u, Perlu itd.

#!/bin/bash
za i u `seq 1 10`;
čini
odjek $i
učinjeno
Primjer while petlje:
#!/bin/bash
BROJAČ=0
while [ $COUNTER -lt 10 ]; čini
echo Brojač je $COUNTER
neka COUNTER=COUNTER+1
učinjeno

Ova skripta "emulira" dobro poznatu (u C, Pascal, perl, itd.) strukturu "for".

Primjer do petlje:

#!/bin/bash
BROJAČ=20
do [$COUNTER -lt 10]; čini
echo BROJAČ $BROJAČ
neka BROJAČ-=1
učinjeno

Funkcije

Baš kao i svaki drugi programski jezik, možete koristiti funkcije za grupiranje dijelova koda zajedno na logičniji način, kao i vježbati čarobnu umjetnost rekurzije.

Deklaracija funkcije samo je unos funkcije my_func (my_code).

Pozivanje funkcije provodi se na isti način kao i pozivanje drugih programa. Samo napiši njeno ime.

Primjeri funkcija
#!/bin/bash
funkcija zatvoriti (
Izlaz
}
funkcija zdravo(
echo Pozdrav!
}
zdravo
prestati
jeka foo
Linije 2-4 sadrže funkciju "quit". Linije 5-7 sadrže funkciju "hello". Ako ne razumijete proces koji izvodi ova skripta, isprobajte je!

Treba napomenuti da nije potrebno deklarirati funkcije bilo kojim određenim redoslijedom.

Ako pokrenete skriptu, primijetite da se prvo poziva funkcija "hello", a zatim funkcija "quit". Što se tiče programa, on nikad ne dođe do 10. reda.

Primjer funkcija s parametrima
#!/bin/bash
funkcija zatvoriti (
Izlaz
}
funkcija e (
echo $1
}
zdravo
e Svijet
prestati
jeka foo
Ova skripta je gotovo identična prethodnoj. Glavna razlika je funkcija "e". Ispisuje prvi argument koji primi. Argumenti u funkcijama obrađuju se na isti način kao argumenti proslijeđeni skripti.

Korisnička sučelja

Korištenje odabira za izradu jednostavnih izbornika
#!/bin/bash
OPTIONS="Hello Quit"
odaberite opciju $OPTIONS; čini
if [ "$opt" = "Odustani" ]; zatim
odjek učinjeno
Izlaz
elif [ "$opt" = "Zdravo" ]; zatim
echo Zdravo svijete
drugo
čisto
echo loša opcija
fi
učinjeno
Ako pokrenete ovu skriptu, vidjet ćete da je to programerov san o tekstualnom izborniku. Vjerojatno ćete primijetiti da je ovo vrlo slično konstrukciji "za", ali umjesto da prolazi kroz svaku "riječ" u $OPTIONS, program anketira korisnika.
Korištenje naredbenog retka
#!/bin/bash
if [ -z "$1" ]; zatim
echo use: $0 imenik
Izlaz
fi
SRCD=$1 #SRCD - SourCe Directory - izvorni direktorij

tar -cZf $TGTD$OF $SRCD
Trebalo bi vam biti jasno što ova skripta radi. Izraz u prvom uvjetnom iskazu provjerava je li program primio argument ($1). Ako nije, prekida program, prikazujući korisniku malu poruku o pogrešci. Preostali dio scenarija za sada je očito sam po sebi razumljiv.

Razno

Čitanje korisničkog unosa s čitanjem

U nekim slučajevima može biti potrebno zatražiti od korisnika da nešto unese. Postoje različiti načini za to. Jedan način je sljedeći:

#!/bin/bash
echo Molimo unesite svoje ime
pročitaj IME
echo "Zdravo $NAME!"

Alternativno, možete dobiti više vrijednosti odjednom koristeći read. Sljedeći primjer to objašnjava:
#!/bin/bash
echo "Molimo unesite svoje ime i prezime"
čitati FN LN #FN - First Name - ime; LN - Prezime - prezime
echo "Bok! $LN, $FN !"

Aritmetički proračuni

U naredbenom retku (ili ljusci) pokušajte upisati sljedeće:
odjek;1;+;1
Ako očekujete da ćete vidjeti "2", bit ćete razočarani. Što biste trebali učiniti ako vam je potreban BASH za izvođenje izračuna na vašim brojevima? Rješenje je ovo:
echo;$((1+1))
Kao rezultat toga, zaključak će biti "logičniji". Ovaj zapis se koristi za procjenu aritmetičkih izraza. Možete to učiniti i ovako:
odjek;$
Ako trebate koristiti razlomke ili složeniju matematiku, možete koristiti bc za procjenu aritmetičkih izraza.
Kad je autor pokrenuo "echo;$" u ljusci, vratila je vrijednost 0. To je zato što ako bash odgovori, koristi samo cjelobrojne vrijednosti. Ako pokrenete "echo;3/4|bc;-l", ljuska će vratiti točnu vrijednost 0,75.

bash pretraga

Iz poruke od mike (pogledajte odjeljak "Zahvale"):

Uvijek koristite #!/bin/bash .. Možete li dati primjer kako otkriti gdje se bash nalazi.
Poželjno je koristiti "locate bash", ali locate nije dostupan na svim strojevima.
"find ./ -name bash" iz korijenskog direktorija obično radi.
Možete provjeriti sljedeće lokacije:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash
(autor se ne može odmah sjetiti bilo kojeg drugog imenika... Pronašao je bash na većini ovih mjesta na raznim sustavima).

Također možete pokušati "which bash".

Dobivanje povratne vrijednosti programa

U bashu, povratna vrijednost programa pohranjuje se u posebnu varijablu koja se zove $?.

Ovaj primjer ilustrira kako presresti povratnu vrijednost programa; autor je pretpostavio da imenik dada ne postoji (to je također predložio mike).
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?


Presretanje izlaza naredbe

Ova mala skripta prikazuje sve tablice iz svih baza podataka (pod pretpostavkom da imate instaliran MySQL). Osim toga, trebali biste razmisliti o načinima pretvaranja naredbe "mysql" u korištenje odgovarajućeg korisničkog imena i lozinke.
#!/bin/bash
DBS=`mysql -uroot -e"prikaži baze podataka"`
za b u $DBS;
čini
mysql -uroot -e"prikaži tablice iz $b"
učinjeno

Više izvornih datoteka

Možete pokrenuti više datoteka koristeći izvornu naredbu.

NAPRAVITI__
11. Tablice
11.1 Operatori za usporedbu nizova
(1) s1 = s2
(2) s1 != s2
(3) s1< s2
(4) s1 > s2
(5) -n s1
(6) -z s1
(1) s1 se poklapa sa s2
(2) s1 ne koincidira sa s2
(3) s1 abecednim redom prethodi s2 (prema trenutnom jeziku)
(4) s1 dolazi abecednim redom nakon s2 (prema trenutnoj lokalnoj postavci)
(5) s1 ima vrijednost različitu od nule (sadrži jedan znak ili više)
(6) s1 ima vrijednost nula
11.2 Primjeri usporedbi nizova

Usporedba dva niza.
#!/bin/bash
S1="niz"
S2="Niz"
if [ $S1=$S2 ];
zatim
echo "S1("$S1") nije jednako S2("$S2)"
fi
if [ $S1=$S1 ];
zatim
echo "S1("$S1") jednako je S1("$S1)"
fi
U ovom trenutku, autor smatra potrebnim citirati opasku iz e-poruke primljene od Andreasa Becka u vezi s upotrebom if [ $1 = $2 ].
Ovo nije dobra ideja, jer ako je $S1 ili $S2 prazna linija Primit ćete sintaktičku pogrešku. Bilo bi prihvatljivije koristiti x$1;=;x$2 ili "$1";=;"$2" .
11.3 Aritmetički operatori
+
-
*
% (ostatak)
11.4 Operatori aritmetičke usporedbe
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)
C programeri jednostavno trebaju odabrati operator koji odgovara odabranom operatoru u zagradama.

Korisne naredbe

Ovaj odjeljak je prepisao Kees (vidi odjeljak Zahvale).

Neke od ovih naredbi praktički sadrže potpune naredbene jezike. Ovdje su objašnjene samo osnove takvih naredbi. Za više detalja pažljivo pregledajte stranice priručnika za svaku naredbu.
sed (uređivač toka)
Sed je neinteraktivni uređivač. Umjesto mijenjanja datoteke pomicanjem pokazivača na ekranu, trebali biste koristiti sed skriptu s uputama za uređivanje zajedno s nazivom datoteke koju uređujete. Sed možete zamisliti i kao filtar. Pogledajte neke primjere:
$sed "s/to_be_replaced/replaced/g" /tmp/dummy
Sed zamjenjuje niz "to_be_replaced" nizom "replaced" čitajući datoteku /tmp/dummy. Rezultat se šalje na standardni izlaz (obično konzola), ali također možete dodati ">;capture" u gornji red kako bi sed poslao izlaz u datoteku "capture".
$sed 12, 18d /tmp/dummy
Sed prikazuje sve retke osim redaka od 12 do 18. Izvorna datoteka ne mijenja se ovom naredbom.
awk (manipulacija podatkovnom datotekom, dohvaćanje i obrada teksta)
Postoji veliki broj implementacija programskog jezika AWK (najčešći tumači su gawk iz GNU projekta i "novi awk" mawk.) Princip je vrlo jednostavan: AWK traži uzorak; Za svaki odgovarajući predložak izvodi se neka radnja.
Autor je ponovno stvorio lažnu datoteku koja sadrži sljedeće retke:
"test123
test
tteesstt"

$awk "/test/ (ispis)" /tmp/dummy
test123
test
Uzorak koji AWK traži je "test", a radnja koju AWK poduzima kada naiđe na red u /tmp/dummy s podstringom "test" je "print".
$awk "/test/ (i=i+1) END (ispis i)" /tmp/dummy
Ako tražite više uzoraka, zamijenite tekst između navodnika s "-f;file.awk". U tom slučaju možete napisati sve predloške i akcije u datoteku "file.awk".
grep (ispisuje retke koji odgovaraju uzorku pretraživanja)
Pogledali smo nekoliko grep naredbi u prethodnim poglavljima koje prikazuju retke koji odgovaraju uzorku. Međutim, grep može učiniti mnogo više.
$grep "potraži ovo" /var/log/messages -c
String "potraži ovo" pronađen je 12 puta u /var/log/messages.
wc (broji linije, riječi i bajtove)
U sljedećem primjeru primijetit ćete da rezultat nije ono što očekujemo. U ovom slučaju lažna datoteka sadrži sljedeći tekst:
"bash uvod
kako testirati datoteku"
$wc --words --lines --bytes /tmp/dummy
2 5 34 /tmp/dummy
wc ne mari za redoslijed parametara. Uvijek ih izvadi standardni postupak: <число;строк><число;слов><число;байтов><имя;файла>.
sortiraj (razvrstava retke tekstualne datoteke)

U ovom slučaju lažna datoteka sadrži sljedeći tekst:
"b
c
a"
$sort /tmp/dummy
Izlaz izgleda ovako:
a
b
c
Naredbe ne bi trebale biti tako jednostavne :-)
bc (jezik računalnog programiranja)
bc izvodi izračune iz naredbenog retka (unos iz datoteke, ali ne putem preusmjeravanja ili cjevovoda) kao i iz korisničkog sučelja. Sljedeći primjer prikazuje neke naredbe. Imajte na umu da je autor upotrijebio bc s opcijom -q da potisne prompt poruku.
$bc -q
1 == 5
0
0.05 == 0.05
1
5 != 5
0
2 ^ 8
256
sqrt (9)
3
dok (i != 9) (
i = i + 1;
ispisati i
}
123456789
prestati
tput (inicijalizira terminal ili postavlja upit terminfo bazi podataka)
Mala ilustracija tput-ovih mogućnosti:

$tstavite šalicu 10 4
Naredbeni redak pojavit će se na koordinatama (y10,x4).
$tput poništi
Zaslon se briše i upit se pojavljuje na (y1,x1). Imajte na umu da je (y0,x0) gornji lijevi kut.
$tputcols
80 Prikazuje mogući broj znakova u x-smjeru.
Strogo se preporučuje poznavanje ovih programa (barem). Postoji ogroman broj malih programa koji vam daju priliku napraviti pravu magiju na naredbenom retku.
[Neki primjeri su preuzeti sa man stranica ili FAQ.]

Više skripti

Primijenite naredbu na sve datoteke u direktoriju.

Primjer: vrlo jednostavna sigurnosna skripta (učinkovitija)

#!/bin/bash
SRCD="/home/" #SRCD - SourCe Directory - izvorni direktorij
TGTD="/var/backups/" #TGTD - TarGeT direktorij - konačni direktorij
OF=home-$(date +%Y%m%d).tgz #OF - Izlazna datoteka - izlazna datoteka
tar -cZf $TGTD$OF $SRCD

Program za preimenovanje datoteka

#!/bin/sh
# renna: preimenujte više datoteka pomoću posebnih pravila
# Autor - felix hudson siječanj - 2000

#Prije svega, pogledajte različite "načine" koje ovaj program ima.
#Ako je prvi argument ($1) prikladan, izvršavamo ovaj dio
#programi i odlazi.

# Provjerite postoji li mogućnost dodavanja prefiksa.
if [$1 = p]; zatim

#Sada idemo dalje od varijabla moda($1) i prefiks ($2)
prefiks=$2 ; pomaknuti ; pomaknuti

# Mora provjeriti je li navedena barem jedna datoteka.
# Inače, bolje je ne raditi ništa nego preimenovati nepostojeće
# datoteke!!

if [$1 =]; zatim

izlaz 0
fi

# Ova for petlja obrađuje sve datoteke koje smo naveli
# program.
# Izvodi jedno preimenovanje po datoteci.
za datoteku u $*
čini
mv $(datoteka) $prefiks$datoteka
učinjeno

#Nakon toga izlazi iz programa.
izlaz 0
fi

# Provjerite uvjet dodavanja sufiksa.
# Inače, ovaj dio gotovo identičan prethodnom odjeljku;
# pogledajte komentare sadržane u njemu.
if [$1 = s]; zatim
sufiks=$2 ; pomaknuti ; pomaknuti
if [$1 =]; zatim
echo "nije navedena datoteka"
izlaz 0
fi
za datoteku u $*
čini
mv $(datoteka) $datoteka$sufiks
učinjeno
izlaz 0
fi

# Provjerite stanje preimenovanja sa zamjenom.
if [$1 = r]; zatim
pomaknuti
# Iz sigurnosnih razloga, autor je uključio ovaj dio kako ne bi oštetio nijednu datoteku ako korisnik
# nije definirao što učiniti:
if [$# -lt 3] ; zatim
echo "Pogreška; ispravan unos: renna r [izraz] [zamjenske] datoteke..."
izlaz 0
fi

# Pogledajmo ostale informacije
STARI=$1 ; NOVO=$2 ; pomaknuti ; pomaknuti

# Ova for petlja uzastopno prolazi kroz sve datoteke koje mi
# dodijeljen programu.
# Radi jedno preimenovanje po datoteci pomoću programa "sed".
# Ovo jednostavan program iz naredbenog retka, koji analizira standard
# unos i zamjenjuje regularni izraz zadanim nizom.
# Ovdje dajemo sed naziv datoteke (kao standardni unos) i zamijenimo
# potreban tekst.
za datoteku u $*
čini
novo=`echo $(datoteka) | sed s/$(STARO)/$(NOVO)/g`
mv $(datoteka) $novo
učinjeno
izlaz 0
fi
# Ako dođemo do ove linije, to znači da je program zadan
# nevažeći parametar. U tom smislu korisniku treba objasniti kako
# koristiti
echo "koristi:"
echo "renna p [prefiks] datoteke.."
echo "renna s [sufiks] datoteke.."
echo "renna r [izraz] [zamjenske] datoteke.."
izlaz 0
#gotovo!

Program za preimenovanje datoteka (jednostavan)
#!/bin/bash
#preimenuje.sh
# jednostavan program za preimenovanje

kriterij=$1
re_match=$2
zamijeni=$3

Za i u $(ls *$kriteriji*);
čini
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
mv $src $tgt
učinjeno

Ako se ono što se dogodi razlikuje od onoga što očekujete (otklanjanje pogrešaka)

Kako mogu nazvati BASH?

Bilo bi lijepo dodati u prvom redu

#!/bin/bash -x
Ovo će proizvesti neke zanimljive izlazne informacije.

O dokumentu

Ne biste se trebali ustručavati napraviti ispravke, dodatke ili bilo što drugo što smatrate da bi trebalo biti uključeno u ovaj dokument. Autor će ga nastojati ažurirati kad god je to moguće.

Ova varalica pokriva sljedeće teme: uvod u ljusku, navigacija, osnovne naredbe, varijable okoline, konektori, cjevovodi, I/O preusmjeravanje, dopuštenja i kombinacije tipki.

Bash Shell: Uvod

Shell ili shell je program, u našem slučaju nazvan "bash", što je skraćenica od Bourne Again Shell. Ljuska prihvaća vaše naredbe i prosljeđuje ih dalje operacijski sustav. Za interakciju sa sustavom koriste se terminali kao što su gnome-terminal, eterm, nxterm itd.

Navigacija

U Linux datoteke a imenici imaju hijerarhijska organizacija, odnosno postoji određeni početni direktorij koji se naziva korijen. Sadrži datoteke i poddirektorije, koji zauzvrat sadrže datoteke i svoje poddirektorije.

pwd

Naredba pwd, skraćenica za ispisati radni imenik, prikazuje Trenutna lokacija u strukturi imenika.

CD

Naredba cd omogućuje vam promjenu u novi direktorij.

mkdir

Naredba mkdir stvara novi direktorij u trenutnom direktoriju.

Osnovne naredbe

čovjek

Naredba man prikazuje priručnike za naredbe. Na primjer, sljedeća naredba prikazat će sve informacije o mačka naredba:

$ čovjek mačka

mačka

Naredba cat čita datoteku proslijeđenu kao argument i ispisuje njen sadržaj standardni kanal izlaz. Prosljeđivanjem više datoteka kao argumenta ispisat će se povezani sadržaji svih datoteka.

jeka

Naredba echo ispisuje svoje argumente na standardni izlaz.

$ echo Zdravo svijete Zdravo svijete

Ako pozovete echo bez argumenata, ispisat će se prazan niz.

glavu

Naredba head čita prvih 10 redaka bilo kojeg proslijeđenog teksta i šalje ih u standardni kanal. Broj prikazanih redaka može se promijeniti:

$head -50 test.txt

rep

Naredba tail radi slično naredbi head, ali čita retke s kraja:

$ rep -50 test.txt

Također možete vidjeti retke koji se dodaju datoteci u stvarnom vremenu pomoću zastavice -f:

$ tail -f test.txt

manje

Naredba less omogućuje vam kretanje kroz prenesenu datoteku ili dio teksta, u oba smjera.

$ manje test.txt $ ps aux | manje

Saznajte više o namjeni simbola | bit će obrađeno u nastavku u odjeljku povijesti naredbe.

Uobičajeni tipkovnički prečaciOpis
GPomiče se na kraj datoteke
gPomiče na početak datoteke
:50 Prelazi na redak 50 datoteke
qIzlazi manje
/pojam za pretraživanjePotražite niz koji odgovara 'pojmu za pretraživanje' ispod trenutna linija
/
?pojam za pretraživanjePronalaženje retka koji odgovara 'pojmu za pretraživanje' iznad trenutnog retka
? Pomiče se na sljedeći odgovarajući rezultat pretraživanja
gorePomiče se jedan redak gore
doljePomiče jedan red prema dolje
pageupPomiče se za jednu stranicu gore
stranica nižePomiče jednu stranicu prema dolje

pravi

True naredba uvijek vraća nulu kao izlazni status koji označava uspjeh.

lažno

Naredba false uvijek vraća različitu od nule kao izlazni status koji označava neuspjeh.

$?

$? je varijabla koja sadrži izlazni status posljednjeg naredba za pokretanje. Status se obično odnosi na povratni kod programa. 0 znači uspješno izvršenje programa, svaka vrijednost veća od 0 odražava činjenicu da je došlo do nekih grešaka tijekom izvođenja. Usput, zato se u bashu 0 smatra istinitim, a sve što nije 0 je lažnim:

$pravi$jeka$? 0 $ lažno $ echo $? 1

grep

Naredba grep traži proslijeđeni niz navedena datoteka:

$ cat korisnici.txt korisnik: lozinka učenika: 123 korisnik: lozinka nastavnika: 321 $ grep "student` file1.txt korisnik: lozinka učenika: 123

grep također može prihvatiti više datoteka i regularni izrazi da pojasnim format teksta.

povijesti

Naredba history prikazuje povijest naredbenog retka. Obično se koristi zajedno s naredbom grep za traženje određene naredbe. Na primjer, sljedeći kod će pronaći sve naredbe koje sadrže niz g++:

$povijest | grep g++ 155 g++ datoteka1.txt 159 g++ datoteka2.txt

Ovdje se također koristi simbol |. - ovo je takozvani transporter (cijev). Zahvaljujući njemu, možete preusmjeriti izlaz jedne naredbe na ulaz druge – tako je u gornjem primjeru cijela priča, koja u normalni mod izlaz naredbom history izravno na izlaz terminala bit će preusmjeren na grep kao ulaz. Nećemo vidjeti izlaz naredbe history, ali ćemo vidjeti izlaz naredbe grep.

Ovo može biti prilično teško razumjeti bez vježbe, pa sami eksperimentirajte s naredbama ls, history, ps (opisanim u nastavku) preusmjeravajući njihov izlaz na grep, sed ili, na primjer, manje.

izvoz

Naredba za izvoz postavlja varijable okoline koje se prosljeđuju podređenim procesima. Na primjer, ovako možete proslijediti varijablu imena s vrijednošću student:

$ ime izvoza=student

p.s

Naredba ps prikazuje informacije o pokrenuti procesi.

$ ps PID TTY VRIJEME CMD 35346 pts/2 00:00:00 bash

Izlaze četiri elementa:

  • ID procesa (PID),
  • vrsta terminala (TTY),
  • vrijeme rada procesa (TIME),
  • naziv naredbe koja je pokrenula proces (CMD).

nezgodno

Naredba awk pronalazi i zamjenjuje tekst u datotekama pomoću zadanog uzorka: awk "uzorak (akcija)" test.txt

wget

Naredba wget preuzima datoteke s Interneta i postavlja ih trenutni imenik.

$ wget https://github.com/mikeizbicki/ucr-cs100

nc

ping

Naredba ping testira Mrežna veza.

$ ping google.com PING google.com (74.125.224.34) 56(84) bajtova podataka. 64 bajta od lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- statistika pinga google.com --- 1 paket poslano, 1 primljeno, 0% gubitka paketa , vrijeme 8ms rtt min/avg/max/mdev = 7,794/8,422/10,792/0,699 ms

Statistika na kraju pokazuje broj veza napravljenih prije dovršetka naredbe i vrijeme koje je bilo potrebno da se dovrše.

git

Varijable okoline

Varijable okoline su imenovane varijable koje sadrže vrijednosti koje koristi jedna ili više aplikacija.

Varijabla PATH sadrži popis direktorija u kojima sustav traži izvršne datoteke.

Varijabla HOME sadrži put do kućni imenik trenutni korisnik.

Priključci

Konektori vam omogućuju istovremeno pokretanje više naredbi.

$ true && echo Hello Hello $ false || echo Zdravo Zdravo $ echo Zdravo ; ls Pozdrav test.txt file1.txt file2.txt

Transportne trake

Transporteri, odnosno cijevi, omogućuju spajanje ulaznih i izlaznih kanala različitih timova. U sljedećem primjeru, izlaz naredbe ls bit će proslijeđen u head i kao rezultat će biti ispisano samo prvih 10 elemenata.

$ ls -l | glava

I/O preusmjeravanje

Preusmjeravanje izlaza

Za standardno preusmjeravanje Koriste se izlazni simboli > i >>.

Na primjer, ovaj kod će ispisati ls izlaz u datoteku, a ne na ekran:

$ ls > files.txt $ cat files.txt file1.cpp sample.txt

Ako datoteka ne postoji, kreira se, a ako postoji, prebriše se. Da biste izbjegli prepisivanje, trebali biste koristiti naredbu >> - ona dodaje podatke na kraj datoteke.

Preusmjeravanje unosa

Za standardno preusmjeravanje izlaza koristite simbol< . В следующем примере sort берет входные данные из файла, а не с клавиатуры:

$ cat files.txt c b $ sort< files.txt b c

Naredba sort ispisuje sadržaj datoteke na ekran jer nismo preusmjerili izlaz. To se može učiniti ovako:

$sortirati< files.txt >datoteke_razvrstane.txt

Napredno preusmjeravanje

Dodavanje & u > rezultira preusmjeravanjem like-a standardni tok izlaz i tok grešaka. Na primjer, datoteka test.cpp ispisat će liniju stdout u cout i liniju stderr u cerr.

$ g++ test.cpp $ ./a.out >& test.txt $ cat test.txt stdout stderr

Ako želite ispisati određeni deskriptor datoteke, možete dodijeliti njegov broj > .

ImeDeskriptorOpis
stdin0 Standardni unos
stdout1 Standardni izlaz
stderr2 Standardni izlaz pogreške

Na primjer, da preusmjerite stderr na test.txt učinili biste sljedeće:

$ g++ test.cpp $ ./a.out 2> test.txt stdout $ cat test.txt stderr

Prava pristupa

Naredba ls -l prikazuje puno informacija o dopuštenjima svake datoteke:

chmod

Naredba chmod mijenja dopuštenja datoteke. Ovdje su tipične kombinacije zastavica za promjenu prava određenih korisnika:

Možete pozvati chmod s opisom što učiniti na određenoj datoteci. Simbol - znači uklanjanje prava, simbol + znači dodavanje. Sljedeći primjer učinit će datoteku čitljivom i pisati od strane vlasnika i grupe:

$ chmod ug+rw test.txt $ ls -l test.txt -rw-rw---- 1 korisnička grupa 1097374 26. siječnja 2:48 test.txt

Osim toga, chmod se može koristiti s oktalni brojevi, gdje je 1 prisutnost prava, a 0 odsutnost:

Rwx = 111 = 7 rw- = 110 = 6 r-x = 101 = 5 r-- = 100 = 4

Sljedeća naredba će raditi isto kao i prethodna.