Bash în exemple

Bazele programării bash

Probabil nu știți încă de ce trebuie să înveți programarea în bash. Iată câteva motive:

Bash există deja în sistemul dvs.

Dacă verificați. atunci cel mai probabil veți găsi că bash rulează deja în sistemul dvs. Chiar dacă utilizați o shell diferită ca shell, bash este cu siguranță instalat, deoarece este shell-ul standard în linux. Din moment ce bash rulează deja, scrierea scripturilor scrise în bash este eficientă deoarece acestea partajează o parte din memoria principală cu procesul de bash deja executat. Și de ce descărcați un alt interpret dacă aveți deja bash, care își face treaba și o face bine?







O utilizați deja

Dar bash nu rulează doar pe sistemul tău, ci încă interacționezi cu el zilnic. El este mereu acolo, deci este logic să înveți să se descurce cu el pentru a putea folosi pe deplin toate posibilitățile sale. După aceasta, comunicarea cu Linux va deveni mult mai distractivă și mai productivă. Dar de ce ar trebui să înveți să programezi? Este simplu: gândiți-vă deja în ceea ce privește executarea programelor, copierea fișierelor și redirecționarea rezultatelor programelor. Nu ar trebui să înveți acum o limbă care să vă permită să construiți din aceste elemente simple modele de economisire a timpului cu care sunteți deja familiar? Carcasa vă oferă întregul potențial al UNIX. Și bash este shell-ul de comandă pentru Linux. Vă conectează la computer. După ce ați studiat bash, veți crește automat productivitatea utilizând UNIX sau Linux - totul este atât de simplu.

Înainte de a începe

O abordare incorectă a bash-ului de învățare poate fi confuză pentru dvs. Mulți începători intră în comanda om bash pentru a citi pagina de ajutor, care conține doar o scurtă descriere tehnică a funcției shell shell. Alții numesc info bash (pentru a vedea documentația în formatul info), dar primesc fie aceeași pagină manuală, fie un material ușor mai ușor de utilizat.

Începătorii ar putea fi puțin dezamăgiți să afle că ajutorul standard nu poate furniza toate informațiile și este destinat utilizatorilor deja familiarizați cu elementele de bază ale programării în limba shell. În manual există o mulțime de informații tehnice remarcabil de organizate, dar pentru începători, beneficiile sale nu sunt mari.

Această serie de articole vă va ajuta să obțineți confortabil în linia de comandă. Acest tutorial descrie modul de utilizare a sintaxei de bază a limbajului shell pentru a scrie scripturile. Voi încerca să explic totul într-un limbaj simplu, astfel încât să înțelegeți nu numai cum funcționează acest lucru, ci și cum să-l folosiți. După ce ați citit această serie de articole, veți învăța cum să vă scrieți propriile scenarii și să vă simțiți confortabil pe linia de comandă. După aceea, veți putea să vă completați cunoștințele prin citirea (și înțelegerea!) Documentația standard pentru bash. Să începem.

Variabile de mediu

Variabila în bash poate fi definită în felul următor:

$ myvar = 'Aceasta este variabila mea de mediu!'

Această comandă creează o variabilă numită "myvar" care conține șirul "Aceasta este variabila mea de mediu!". Trebuie notat că: În primul rând, lângă semnul "=" nu ar trebui să existe spații; (încercați și veți vedea că interpretul dă o eroare comenzii cu spații). În al doilea rând, dacă valoarea variabilei noastre conține spații sau file, trebuie să o includeți în ghilimele.

Notă: Pentru informații detaliate despre utilizarea ghilimelelor în bash, consultați secțiunea "QUOTATION" a paginii bash. Existența unor secvențe speciale de caractere pe care interpretul le înlocuiește cu alte valori face ca explicația de a lucra cu șiruri în bash să fie prea complexă. Prin urmare, vom vorbi doar despre cele mai utilizate moduri de a aplica cotații.

În al treilea rând, puteți utiliza, de obicei, ghilimele duble în loc de un singur, dar, în acest exemplu, utilizarea de ghilimele duble va cauza o eroare a interpretului, din moment ce valoarea variabilei noastre conține unul dintre caracterele speciale (din care cele de mai sus menționată în observația) - dar în interiorul „!“ citate unice nu funcționează caractere speciale. „!“ Caracterul în bash este responsabil pentru așa-numita „extinderilor ISTORIC“ - lucrul cu istoria liniei de comandă fișier (a se vedea detalii în manualul.). Privind la faptul că funcția funcționează cu o istorie de comenzi folosind „!“ Poate fi foarte util chiar acum vrem să-l văd pur și simplu ca un semn de exclamare.

Să vedem cum puteți citi valoarea variabilei noastre:

$ echo $ myvar Aceasta este variabila mea de mediu!

Punerea semnul $ înainte de numele variabilei. informăm interpretul că trebuie să îl înlocuim cu o valoare. Aceasta se numește înlocuire / extindere variabilă.

Trebuie notat că numele variabilelor în bash sunt sensibile la litere mari și mici. De exemplu, myvar și Myvar sunt nume de variabile diferite.

Dar ce se va întâmpla dacă încercăm să facem acest lucru:

$ echo foo $ myvarbar foo

Am vrut să afișăm inscripția "foo This is my variable environment! Bar", dar nu sa întâmplat nimic. Ce sa întâmplat? Interpretul nu a putut determina valoarea care variabilă să înlocuiască ($ m, $ my, $ myvar, $ myvarbar, etc.) În astfel de cazuri ambigue, puteți specifica în mod explicit bash la numele variabilei:

$ echo foo $ bar foo Aceasta este variabila mea de mediu!

După cum puteți vedea, prin includerea numelui variabilei dorite în bretele, am indicat explicit interpretului unde se află variabila și unde este textul simplu. Expresia $ myvar este mai rapidă pentru imprimare și funcționează în majoritatea cazurilor, dar $ va funcționa întotdeauna corect. Ambele expresii indică o variabilă, dar trebuie să utilizați a doua (cu paranteze curbate) dacă numele variabilei nu este separat de textul înconjurător prin spații sau file.

Să revenim la oportunitatea pe care am menționat-o pentru a exporta variabilele. Variabila exportată este disponibilă automat pentru orice script sau program care se execută după export. Scriptul shell poate citi valoarea unei variabile utilizând instrumentele integrate ale shell-ului pentru a lucra cu variabilele de mediu și programele din C utilizând funcția getenv (). Iată un mic exemplu de cod în C, pe care îl puteți tipări și compila. Acesta vă va ajuta să vă uitați la variabilele de mediu din limbajul C:

Salvați acest cod în myenv.c. și apoi compilați:

$ gcc myenv.c -o myenv

Apoi, fișierul executabil "myenv" apare în directorul dvs. de lucru. Rulați-o și vă va afișa valoarea variabilei "EDITOR" (dacă este atribuită). Iată ce am primit:

$ ./myenv Variabila de mediu a editorului este setată la (null)

Întrucât variabila nu este definită, programul nostru nu poate accesa. Să creăm această variabilă și să o atribuim unei anumite valori:







$ EDITOR = mousepad $ ./myenv Variabila de mediu a editorului este setată la (null)

Deci nici nu funcționează. Ne-am aștepta ca programul să introducă "mousepad", dar rezultatul nu sa schimbat. Acest lucru sa întâmplat deoarece am uitat să exportăm variabila "EDITOR". De data aceasta ar trebui să funcționeze:

$ export EDITOR $ ./myenv Variabila de mediu a editorului este setată la mousepad

Deci, am văzut prin exemplu că un proces terță parte (în cazul nostru, un program în C) nu poate accesa variabila de mediu până când nu este exportat. În plus, puteți defini o variabilă și o exportați cu o singură comandă:

Această comandă efectuează aceeași acțiune ca și versiunea în doi pași (atribuire valoare și export). A fost un moment bun pentru a arăta cum să resetați variabila de mediu (cu alte cuvinte, ștergeți variabila) cu "unset":

$ unset EDITOR $ ./myenv Variabila de mediu a editorului este setată la (null)

Cum pot parsa un șir?

Pentru a parsa un șir este să-l împărți în cele mai scurte. Aceasta este una dintre operațiile frecvente care apar atunci când scrii scripturile shell. Uneori, un script trebuie să determine numele unui anumit fișier sau director, cunoscând calea completă (absolută) la acesta. La bash, puteți face acest lucru cu o singură comandă:

$ basename /usr/local/share/doc/foo/foo.txt foo.txt $ basename / usr / home / drobbins drobbins

'basename' este un utilitar foarte util pentru divizarea șirurilor în componente. A doua comandă, "dirname", returnează cealaltă parte a liniei (calea către directorul unde este localizat fișierul):

$ dirname /usr/local/share/doc/foo/foo.txt / usr / local / share / doc / foo $ dirname / usr / home / drobbins / / usr / home

Notă. comenzile "basename" și "dirname" nu specifică prezența unui fișier sau a unui director în sistemul de fișiere, ci doar lucrează cu șiruri de caractere.

Command substitution

Este foarte util să știm cum să atribuim rezultatul unei comenzi unei variabile. Este foarte simplu să faceți acest lucru:

$ MYDIR = $ (nume /usr/local/share/doc/foo/foo.txt) $ echo $ MYDIR / usr / local / share / doc / foo

Ceea ce am făcut este denumită înlocuire de comandă. În prima linie a exemplului, am înfășurat comanda în construcția $ ().

Rețineți că puteți face același lucru folosind butoanele backquotes `` (tasta de tastatură imediat deasupra tastei Tab) în loc de constructul $ ():

$ MYDIR = `dirname / usr / local / share / doc / foo / foo.txt` $ echo $ MYDIR / usr / local / share / doc / foo

În bas, după cum vedem, puteți face o acțiune în mai multe moduri diferite. Folosind substituția de comandă, putem pune orice comandă în backquote sau în constructul $ () și alocăm rezultatele sale unei variabile. Lucru foarte util! Iată un exemplu de utilizare a înlocuirii unei serii de comenzi conectate printr-o conductă:

$ MYFILES = $ (ls-1 / etc | grep ^ pa) $ echo $ MYFILES pam.conf pam.d pango papersize passwd passwd-

$ MYFILES = $ ($ $ (dirname foo / bar / oni))

Împărțirea șirurilor pentru profesioniști

"nume de bază" și "dirname" sunt utilități extraordinare, dar există momente când trebuie să efectuați operații mai complexe pe șiruri decât manipularea căilor. Pentru o lucrare mai eficientă cu șiruri de caractere, puteți utiliza mijloacele încorporate pentru a înlocui valorile variabilelor bash. Anterior am folosit deja o înlocuire a variabilelor, care arătau astfel: $. Dar în bash există instrumente încorporate pentru manipularea șirurilor. Să examinăm următorul exemplu:

$ MYVAR = foodforthought.jpg $ echo $ rthought.jpg $ echo $ odforth.jpg

Ce înseamnă designul $ din exemplul anterior? Am scris în interiorul lui $<> numele variabilei, apoi două caractere hash (sau clare, pentru care, ca de obicei) și un șablon ("* fo"). Bash-ul a luat nostru „myvar“ variabilă, a găsit cea mai mare parte din lungimea șirului subșir „foodforthought.jpg“ (de la începutul liniei), care a coincis cu modelul „* FO“ și elimină-l. Din prima dată în aceste subtilități este greu de înțeles. Pentru a înțelege cum funcționează construcția ##. să ne uităm pas cu pas la modul în care bash caută o potrivire a unui substring cu un model. Începem căutarea unui substring care să corespundă modelului "* fo" de la începutul liniei "foodforthought.jpg". Iată o listă cu toate subrețelele:

f fo coincide cu modelul "* FO" foo alimente foodf foodfo se potrivește cu modelul "* FO" foodfor foodfort foodforth foodfortho foodforthou foodforthoug foodforthought foodforthought.j foodforthought.jp foodforthought.jpg

După verificarea tuturor acestor opțiuni, am găsit două linii care se încadrează în șablon. Bash selectează cea mai lungă dintre ele, apoi șterge acest substring și returnează rezultatul.

Cea de-a doua formă de substituție variabilă prezentată în exemplu diferă de prima dată numai prin prezența unui semn hash (#), și nu a două. Și bash efectuează aceleași acțiuni, cu excepția faptului că elimină nu cea mai lungă, dar cea mai scurtă dintre substring-urile care se potrivesc cu modelul. După cum se poate observa, după îndepărtarea cel mai scurt subșirul potrivit cu un șablon (fo) am rămas cu șirul „odforthought.jpg“.

Acest lucru poate părea foarte confuz, așa că vă voi arăta cum să vă amintiți rapid această caracteristică a bash-ului. Atunci când căutăm cea mai lungă potrivire, folosim două clase (##), de atunci "##" este mai lungă decât "#". Când căutăm cea mai scurtă potrivire, folosiți #. Vezi, nu e așa de dificil! Așteaptă, dar cum îți amintești că căutarea începe de la începutul liniei? Este foarte simplu! Rețineți că în structura tastaturii engleză, combinația Shift-4 ne dă semnul $ utilizat în bash pentru a înlocui valoarea variabilei. Chiar înainte ca semnul $ de pe tastatură să fie # (ca și când la început) și astfel "#" șterge caracterele de la începutul liniei. Veți dori să aflați cum să ștergeți o secvență de caractere de la sfârșitul liniei. Așa cum ați putea ghici, acest lucru se face cu semnul (%), situat pe tastatură imediat după "$". Iată un mic exemplu de ștergere a sfârșitului unei linii:

$ MYFOO = "chickensoup.tar.gz" $ echo $ chickensoup $ echo $ chickensoup.tar

După cum puteți vedea, semne simple și duble la sută (%% și%), de asemenea, funcționează ca „#“ și „##“, dar îndepărtați substringul potrivit cu un șablon de la capătul liniei. Rețineți că nu puteți utiliza caracterul "*" dacă doriți să ștergeți un anumit capăt al unei linii.

În acest exemplu, nu este deloc important să utilizați% sau %% încă există o singură coincidență. Și nu uitați să selectați "#" sau "%" pentru a vă uita la tastele 3.4 și 5 ale tastaturii.

Putem folosi o altă formă de înlocuire a valorii unei variabile pentru a extrage un substring cu o anumită lungime și poziție de început:

Acest formular este foarte convenabil. Specificați pur și simplu poziția de pornire a subreversului separând începutul subreversului - primul număr și lungimea substringului - al doilea număr.

Aplicarea pauzelor de linie

Am învățat cum să separăm șirurile, acum să scriem un script de shell. Scriptul nostru va avea un argument - numele fișierului și dacă acest fișier are o extensie .tar, scriptul va raporta că este un tarball. (De fapt, nu este complet corect să determinați tipul de fișier prin extensie, în acest scop există comanda de fișier.) Un exemplu este doar pentru demonstrație.) Aici este acest script:

#! / bin / bash dacă ["$" = "tar"] apoi echo "Se pare ca un tarball." altceva ecou "La prima vedere, acest lucru nu este ca un tarball." Fi

Prima linie trebuie să fie prezentă în fiecare scenariu. Aceasta arată calea către interpretul care va executa scriptul. Sintaxa sa, așa cum se vede din exemplu - "#!<путь к интерпретатору>“.

Salvați textul scriptului din exemplu în fișierul mytar.sh. apoi schimbați permisiunile la "chmod 755 mytar.sh" (acest lucru va face fișierul executabil). În cele din urmă, executați scriptul cu argumentul ca nume de fișier, așa cum se arată în următorul exemplu:

$ ./mytar.sh thisfile.tar Se pare că acesta este un tarball. $ ./mytar.sh thatfile.gz La prima vedere, acest lucru nu este ca un tarball.

Ei bine, pare să funcționeze, dar nu foarte funcțional. Înainte de a ne îmbunătăți scenariul, să ne uităm la construcția dacă. folosite în el. În paranteze pătrate, se compară două linii ("=" este un operator de comparare în bash). Rezultatul comparației este o expresie booleană "falsă" sau "adevărată" (adevărată sau falsă). Dar să vedem ce linii sunt comparate. În dreapta, totul este clar - șirul "gudron". De la stânga la noi este să înțelegem expresia de mai sus, elimină partea de sus a liniei în $ 1 la modelul „*“ (întregul rând la ultimul punct, deoarece se utilizează două hash ##). După această operație de substituire, rămâne doar o parte a liniei după ultimul punct, o extensie cu alte cuvinte. Dacă variabila $ 1 conține numele fișierului cu „tar“ extensie, rezultatul unei comparații șir va fi un adevărat boolean.

Probabil că vă întrebați de ce, atunci când verificăm condiția, am folosit variabila "$ 1". Totul este foarte simplu: variabila $ 1 conține primul argument transmis scriptului ($ 2 este al doilea argument și așa mai departe). Cu această funcție, ne-am dat seama, acum luăm în considerare în detaliu construirea alegerii condiționate "dacă".

În cazul în care

Ca și în multe limbi de programare, bash are construite condiționate. Acestea au formatul descris mai jos. Aveți grijă: cuvintele "dacă" și "atunci" ar trebui să fie pe linii diferite. Încercați să aliniați întreaga structură pe orizontală, inclusiv finala "fi" și tot "altceva". Acest lucru face ca codul să fie mult mai ușor de citit și de depanat. În plus față de forma simplă "dacă, altfel" există mai multe alte forme de construcții condiționate:

dacă [condiție] atunci acțiunea fi

În exemplul de mai sus, acțiunea este executată numai dacă "condiția" este adevărată, în caz contrar scriptul continuă executarea instrucțiunilor din rândul următor "fi".

dacă [condiție] atunci acțiunea elif [condiție_2] atunci action_2 elif [condiție_3] atunci. altceva action_x fi

Și acest design verifică în mod constant condițiile și, dacă acestea sunt corecte, efectuează acțiunea corespunzătoare. Dacă niciuna dintre condiții nu este adevărată, atunci "action_x" după "else" (dacă există) este executată. Apoi, executarea comenzilor care urmează acestei construcții "dacă, atunci, altfel" continuă, dacă este cazul.

În partea următoare

În acest articol, am analizat funcționalitatea de bază a bash-ului. Este timpul să accelerați puțin și să începeți să scrieți propriile scenarii de shell. În următoarea parte a tutorialului, voi vorbi despre funcții, cicluri, spațiu de nume și alte lucruri importante. După aceasta, vom fi gata să scriem scripturi relativ complexe. Ne vedem curând!

Uite, de asemenea







Articole similare

Trimiteți-le prietenilor: