Acest tutorial discută modul în care puteți scrie cu ușurință propriile scripturi Bash pe Linux.
Ca administrator de sistem, este foarte probabil să executați sarcini repetitive care ar putea fi automatizate.
Din fericire pentru dumneavoastră, există un limbaj de programare care poate fi folosit pe Linux pentru a scrie scripturi : limbajul de programare Bash.
Utilizând Bash, puteți programa copii de rezervă ale întregului sistem specificând câte comenzi doriți în scripturile Bash.
Puteți avea, de asemenea, scripturi personalizate care să creeze și să șteargă utilizatori și să elimine fișierele asociate acestora.
Cu Bash, puteți avea, de asemenea, scripturi care rulează și descarcă într-un fișier sau într-o bază de date măsurători utile de performanță.
Bash este un limbaj de programare foarte puternic pentru administratorii de sistem.
În tutorialul de astăzi, vom învăța toate elementele de bază pe care trebuie să le cunoaștem despre Bash : cum să creăm și să rulăm scripturi, cum să folosim eficient variabilele și modulele construite în shell.
Tabloul de materii
- Ce veți învăța
- Începem cu Bash
- Istoria lui Bash
- Limbajul de programare Bash
- Crearea și rularea scripturilor Bash
- Specificarea shell-ului folosind shebang
- Executați scripturi Bash
- Specificarea interpretorului de shell
- Specificarea căii către script
- Adăugarea scriptului la PATH
- Explicații despre modulele construite în shell
- Utilizarea variabilelor Bash
- Executarea comenzilor în scripturi
- Înțelegerea stărilor de ieșire
- Manipularea condițiilor în Bash
- Caz practic : verificarea dacă utilizatorul este root
- Concluzie
Ce veți învăța
Dacă citiți acest tutorial până la sfârșit, veți învăța următoarele concepte referitoare la Bash
- Cum să creați și să rulați scripturi Bash folosind linia de comandă;
- Ce este shebang și cum este folosit de Linux pentru scripturi;
- Ce sunt și cum diferă ele de programele obișnuite de sistem;
- Cum se utilizează variabilele Bash și ce sunt variabilele speciale;
- Cum se utilizează substituirea comenzilor Bash;
- Cum să folosiți instrucțiuni IF simple în Bash;
După cum puteți vedea, acesta este un program destul de lung, așa că, fără alte formalități, să începem prin a vedea cum puteți crea și rula scripturi Bash.
Începem cu Bash
Înainte de a lansa orice comandă, haideți să spunem câteva cuvinte despre istoricul comun al lui Bash și al shell-ului.
Istoria lui Bash
Prima versiune a shell-ului Bash a fost lansată în 1989 de Brian Fox și vine ca o implementare open-source a shell-ului Unix.
La acea vreme, când au început să apară sistemele Unix, astfel de sisteme foloseau shell-uri Unix standard numite Bourne shells.
La începuturile Unix, sistemele dezvoltate de companii precum MIT sau Bell Labs nu erau libere și nu erau open-source.
Chiar dacă pentru aceste instrumente era furnizată documentație, a devenit o prioritate pentru inițiativa GNU (condusă de Richard Stallman) să aibă propria versiune a shell-ului Unix.
La șase ani după anunțarea proiectului GNU, s-a născut shell-ul Bash (Bourne-Again Shell) cu chiar mai multe caracteristici decât shell-ul Bourne original.
Limbajul de programare Bash
Când se lucrează cu un sistem de tip Unix, cum ar fi Linux, Bash are de obicei două semnificații :
- Bash este un interpretor de linii de comandă sau, cu alte cuvinte, un shell Unix. Aceasta înseamnă că, ori de câte ori deschideți un terminal, vă veți confrunta cu un shell Unix care, de cele mai multe ori, este un shell Bash.
Când tastați comenzi direct în terminal, comenzile sunt interpretate de shell, executate folosind apeluri de sistem și valorile de retur sunt date înapoi utilizatorului final.
Dacă nu sunteți sigur de interpretorul curent pe care îl folosiți, variabila de mediu SHELL indică ce shell folosiți în prezent.
$ printenv SHELL
Cum puteți vedea, în acest caz, folosim corect interpretorul de comenzi Bash pentru a lucra.
Este important să rețineți că, chiar dacă termeni precum „scripting Bash” și „scripting Shell” sunt utilizați interschimbabil, este posibil ca aceștia să nu descrie de fapt același lucru, în funcție de distribuția dvs.
Câteva distribuții recente (cum ar fi Debian 10) au legături simbolice de la shell-ul Bourne original (numit sh) către propriile implementări de shell (în acest caz Dash sau Debian Almquist shell)
- Bash descrie, de asemenea, un limbaj de linie de comandă și este denumit și limbajul Bash. Bash expune un set de operatori și operanzi care pot fi utilizați pentru a avea unele caracteristici de bază, cum ar fi pipeing sau executarea mai multor comenzi simultan.
Când se execută niște pipeing-uri de bază, sunteți obișnuiți să lucrați cu simbolul „|”. Acest simbol face parte din limbajul liniei de comandă Bash.
Aceeași logică este valabilă și pentru simbolul „&&” care execută a doua comandă dacă și numai dacă prima comandă a reușit.
$ command1 && command2
Crearea și rularea scripturilor Bash
Acum că aveți câteva cunoștințe despre shell-ul Bash și limbajul de linie de comandă Bash, să începem prin crearea și rularea unor scripturi Bash simple.
Pentru a crea primul dvs. script Bash, creați pur și simplu un fișier numit „script.sh”.
După cum probabil ați observat deja, încă folosim extensia „sh” referindu-ne la shell-ul Bourne original (denumit și sh).
$ touch script.sh
Acum, crearea unui fișier care se termină cu extensia „sh” nu este suficientă pentru ca scriptul dvs. să fie considerat un script shell.
De fapt, puteți vedea că fișierul dvs. nu este încă considerat un script shell prin rularea comenzii file.
$ file script.sh
Așa cum puteți vedea aici, fișierul dvs. este descris doar ca un simplu fișier gol.
Pentru ca fișierul dvs. să fie descris ca un fișier script shell, trebuie să specificați linia shebang în partea de sus a fișierului dvs.
Specificarea shell-ului folosind shebang
Dacă utilizați Linux de ceva timp, este foarte probabil că ați întâlnit deja linia shebang la începutul fișierului dvs.
Shebang, prescurtare de la „Hash + „Bang”, este o linie de un singur rând așezată la începutul scripturilor shell pentru a specifica ce shell va fi folosit pentru a interpreta acest script.
#!/bin/<shell>
În cazul nostru, dorim să lucrăm cu scripturi Bash. Cu alte cuvinte, dorim ca scripturile noastre să fie interpretate de un interpretor Bash.
Pentru a determina calea către interpretor, puteți folosi comanda „which”.
$ which bash/bin/bash
Acum că știți calea către interpretorul dumneavoastră, editați fișierul de script și adăugați linia shebang în partea de sus a fișierului dumneavoastră.
#!/bin/bash
Acum că ați adăugat această linie la începutul fișierului dumneavoastră, reexecutați comanda „file” pentru a vedea diferența.
După cum puteți vedea, ieșirea este ușor diferită : de data aceasta, scriptul dumneavoastră este văzut ca un „Bourne-Again shell script” și, mai ales, ca un executabil.
Ce s-ar întâmpla dacă nu ați specifica linia shebang în partea de sus a scriptului.
Când nu se specifică linia shebang, scriptul este rulat folosind shell-ul curent folosit pentru a porni comanda de execuție.
Acum că știți cum să creați scripturi Bash, să vedem cum le puteți executa.
Executați scripturi Bash
Pentru a executa scripturi Bash pe Linux, aveți în esență două opțiuni :
- Specificând interpretorul de shell pe care doriți să îl utilizați și fișierul script;
- Utilizând calea către fișierul script
Specificarea interpretorului de shell
Prima metodă este destul de simplă.
Pentru a executa scriptul bash, veți specifica singur interpretul pe care doriți să îl folosiți.
$ bash <script>$ /bin/bash <script>
Utilizând exemplul pe care l-am folosit mai devreme, acest lucru ne-ar da următoarea ieșire.
După cum puteți vedea, această metodă nici măcar nu necesită permisiuni de execuție pe fișier, trebuie doar să puteți folosi executabilul bash.
Așa cum puteți vedea, atunci când sunt logat ca un alt utilizator, fără permisiuni de execuție, sunt în continuare capabil să execut acest script.
Aceasta este o observație importantă, deoarece este posibil să doriți să vă stocați fișierele de script în directoare protejate (pe care numai dumneavoastră le puteți accesa) pentru a împiedica alți utilizatori să vă execute fișierele.
Specificarea căii către script
O altă modalitate de a executa scripturi bash este de a specifica calea către fișier.
Pentru a folosi această metodă, fișierul trebuie să aibă permisiuni de execuție.
În primul rând, folosiți comanda „chmod” pentru a seta permisiunile de execuție pentru utilizatorul curent.
$ chmod u+x <script>
După cum puteți vedea, culoarea fișierului este destul de diferită : terminalul dvs. curent evidențiază fișierele executabile folosind culori specifice, în acest caz culoarea verde.
Acum că scriptul dvs. este executabil, îl puteți executa specificând calea relativă sau absolută către script.
Utilizând un fișier numit „script.sh” situat în directorul meu de lucru curent, scriptul poate fi executat prin rularea
$ ./script.sh
Dacă vă aflați într-un alt director, va trebui să specificați calea absolută către fișierul script.
$ /home/user/script.sh
După cum probabil v-ați dat seama până acum, această metodă nu este foarte convenabilă dacă trebuie să specificați de fiecare dată calea către script.
Din fericire pentru dumneavoastră, există o modalitate de a vă executa scriptul prin simpla tastare a numelui fișierului în linia de comandă.
Adăugarea scriptului la PATH
Extensiunea „.sh” nu este necesară pentru ca un script să fie considerat un fișier script.
De dragul simplității, vom redenumi fișierul existent „script.sh” existent în „script”.
Pentru a redenumi fișierele pe Linux, folosiți pur și simplu comanda „mv” și specificați țintele sursă și destinație.
$ mv script.sh script
Acum, ce se întâmplă dacă ați dori să executați scriptul dvs. prin tastarea „script”?
Pentru a face acest lucru, trebuie să adăugați calea către scriptul dvs. la variabila de mediu PATH.
Pentru a imprima valoarea curentă a variabilei de mediu PATH, utilizați „printenv” cu argumentul „PATH”.
$ printenv PATH
Pentru a actualiza PATH în mediul dvs. de lucru actual, editați variabila de mediu PATH folosind următoarea sintaxă.
$ export PATH="<path_to_script>:$PATH"
Acum, comanda „script” pe care tocmai ați definit-o va fi direct disponibilă fără a specifica nicio cale de acces : o puteți lansa ca orice altă comandă.
Nota : dacă doriți ca modificările să fie permanente, urmați acești pași pentru a vă actualiza corect variabila PATH.
Explicații despre modulele construite în shell
Înainte de a declara orice variabilă în scriptul dvs. shell, este important să știți despre modulele construite în shell.
Când lucrați cu shell-ul Bash, de cele mai multe ori executați „programe”.
Exemple de programe sunt „ls”, „fdisk” sau „mkdir”. Ajutorul pentru aceste comenzi poate fi găsit folosind comanda „man”, prescurtare de la „manual”.
Astăzi, ați încercat vreodată să citiți documentația pentru comanda „source”?
Nu veți putea citi documentația folosind „man” deoarece comanda „source” este o funcție încorporată în shell.
Pentru a citi documentația pentru funcțiile încorporate în shell, trebuie să folosiți comanda „help”.
$ help <command>
Lista de shell built-ins este destul de extinsă, dar iată o captură de ecran a fiecărei comenzi încorporate în bash pe care o puteți găsi pe sistemele Ubuntu.
Utilizarea variabilelor Bash
Acum că știți despre Bash built-ins, este timpul să începeți să vă scrieți propriile scripturi Bash.
Ca un memento, comenzile tastate în terminalul dvs. pot fi folosite într-un script Bash exact în același mod.
De exemplu, dacă doriți un script care să execute pur și simplu comanda „ls -l”, editați pur și simplu scriptul dvs., adăugați linia shebang și comanda.
#!/bin/bash# This simple script executes the ls commandls -l
Acum, ce se întâmplă dacă ați dori să aveți variabile Bash?
Variabilele Bash sunt variabile simple de program care pot stoca o mare varietate de intrări diferite.
Pentru a declara o variabilă Bash, pur și simplu specificați numele variabilei și valoarea acesteia separate de un semn egal.
VAR=value
Pentru a putea folosi conținutul variabilei Bash în scriptul dumneavoastră, folosiți „$” și adăugați numele variabilei dumneavoastră.
echo $VAR
Chiar dacă puteți folosi această sintaxă pentru a avea valoarea variabilei, puteți folosi și notația „paranteze”.
echo ${VAR}
Utilizând această sintaxă, variabilele pot fi combinate între ele.
Dacă aveți două variabile Bash numite VAR1 și VAR2, de exemplu, le puteți avea pe amândouă tipărite folosind următoarea sintaxă
echo "${VAR1}${VAR2}"
Executarea comenzilor în scripturi
Pentru a executa comenzi în interiorul scripturilor Bash, trebuie să folosiți substituirea comenzilor.
Substituirea comenzilor este o tehnică folosită în shell-urile Bash pentru a stoca rezultatul unei comenzi într-o variabilă.
Pentru a substitui o comandă în Bash, folosiți semnul dolar și închideți comanda între paranteze.
VAR=$(command)
De exemplu, pentru a obține rezultatul numerelor de fișiere din directorul curent, veți scrie
#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"
După cum puteți vedea, substituirea comenzilor este destul de utilă deoarece poate fi folosită pentru a executa dinamic comenzi într-un script shell și a returna valoarea înapoi utilizatorului.
Vorbind despre returnarea rezultatelor către utilizatorul final, cum vă ocupați de scripturile care nu se termină corect?
Ce se întâmplă dacă o comandă din interiorul scriptului nu s-a executat corect?
Înțelegerea stărilor de ieșire
Când executați un script, chiar dacă nu returnați o valoare, scriptul returnează întotdeauna ceea ce numim „o stare de ieșire”.
O stare de ieșire în scripturile Bash indică dacă execuția scriptului a avut succes sau nu.
Dacă codul de stare este zero, execuția scriptului dumneavoastră a avut succes. Cu toate acestea, dacă valoarea este diferită de zero (să spunem unu, doi sau mai mulți), indică faptul că execuția scriptului nu a avut succes.
Pentru a demonstra starea de ieșire, rulați orice comandă validă în shell-ul Bash.
echo "This is a simple working command"
Acum, folosiți această comandă pentru a inspecta statusul de ieșire al ultimei comenzi executate.
echo ${?}
După cum puteți vedea, ieșirea acestei comenzi este „0” sau statusul de ieșire al ultimei comenzi pe care am executat-o.
Această sintaxă („${?}”) poate fi folosită în scripturi pentru a ne asigura că comenzile au fost executate corect.
Statul de ieșire poate fi folosit în scripturi pentru a ieși din script cu un anumit cod de stare.
De exemplu, dacă doriți să ieșiți din script cu o eroare, puteți utiliza următoarea comandă în scriptul dumneavoastră.
exit 1
În mod similar, puteți utiliza codul de ieșire „zero” pentru a specifica faptul că scriptul s-a executat cu succes.
exit 0
Pentru a verifica dacă codul de stare a fost corect, veți avea nevoie de instrucțiuni condiționale de bază, cum ar fi instrucțiunea IF.
Manipularea condițiilor în Bash
Câteodată, executarea de scripturi bash nu înseamnă doar să ai mai multe comenzi una lângă alta : vrei să ai acțiuni condiționate.
În unele cazuri, ar putea fi la îndemână să aveți o condiție care să verifice dacă utilizatorul curent este utilizatorul root (sau doar un anumit utilizator de pe sistem).
Un mod simplu de a avea condiții în Bash este de a folosi instrucțiunea if.
„If” este încorporat în shell, ca o consecință, manualul este disponibil prin intermediul comenzii „help”
$ help if
Pagina de ajutor descrie sintaxa pentru comanda if folosind punct și virgulă, dar noi vom folosi această sintaxă (care este echivalentă)
if ]then <commands>else <command>fi
Caz practic : verificarea dacă utilizatorul este root
Pentru a arăta la ce poate fi folosită instrucțiunea if, vom scrie un script simplu care să verifice dacă un utilizator este sau nu root.
Ca un memento, utilizatorul root are întotdeauna UID-ul setat la zero pe orice sistem Unix.
Cunoscând această informație, vom verifica dacă UID-ul este setat la zero, dacă este cazul, vom executa restul scriptului, în caz contrar vom ieși din script.
Așa cum s-a explicat în alte tutoriale (despre administrarea utilizatorilor), puteți obține ID-ul curent al utilizatorului folosind comanda „id”.
$ id -u1000
Vom folosi această comandă pentru a verifica dacă utilizatorul care execută scriptul este root sau nu.
Creați un nou script și adăugați-i linia shebang.
#!/bin/bash
Dreapta sub ea, adăugați comanda „id” și stocați rezultatul într-o variabilă numită „USERID” folosind substituirea comenzii.
USERID=$(id -u)
Acum că „USERID” conține ID-ul utilizatorului curent, folosiți o instrucțiune IF pentru a verifica dacă ID-ul utilizatorului este zero sau nu.
Dacă este cazul, scrieți un simplu mesaj informativ, dacă nu, ieșiți din script cu un status de ieșire de 1.
if ]then echo "This is root"else exit 1fi
Acum, dacă executați scriptul ca utilizator curent, scriptul va ieși pur și simplu cu un status de ieșire de 1.
Acum, încercați să executați scriptul ca utilizator root (cu comanda sudo)
Cum vedeți, mesajul dvs. informativ a fost afișat și scriptul a ieșit cu un cod de eroare de zero.
Concluzie
În acest tutorial, ați învățat despre limbajul de programare Bash și cum poate fi folosit pentru a crea scripturi Bash pe sistemul dumneavoastră.
Ați învățat, de asemenea, despre stările de ieșire și declarațiile condiționale care sunt esențiale pentru a avea o logică personalizată stabilită în scripturile dumneavoastră.
Acum că aveți mai multe cunoștințe despre Bash, ar trebui să începeți prin a scrie propriile scripturi pentru nevoile dumneavoastră : puteți începe prin a avea un tutorial despre crearea de fișiere de backup de arhivă, de exemplu.
Dacă sunteți interesat de administrarea sistemelor Linux, avem o secțiune completă dedicată acesteia pe site, așa că nu uitați să o consultați!