Astăzi vom vorbi despre scripturile bash. Acest - , scris pentru shell-ul bash. Există și alte shell-uri, cum ar fi zsh, tcsh, ksh, dar ne vom concentra pe bash. Acest material este destinat tuturor, singura condiție este capacitatea de a lucra Linux.
Scripturile de linie de comandă sunt seturi de aceleași comenzi care pot fi introduse de la tastatură, colectate în fișiere și unite printr-un scop comun. În același timp, rezultatele muncii echipelor pot fi fie de valoare independentă, fie pot servi drept input pentru alte echipe. Scripturile sunt o modalitate puternică de a automatiza acțiunile efectuate frecvent.
Deci, dacă vorbim despre linia de comandă, vă permite să executați mai multe comenzi deodată, introducându-le cu punct și virgulă:
pwd ; whoami De fapt, dacă ați încercat acest lucru în terminalul dvs., primul dvs. script bash care utilizează două comenzi a fost deja scris. Funcționează așa. Echipa mai întâi pwd afișează informații despre directorul de lucru curent, apoi comanda whoamiafișează informații despre utilizatorul la care sunteți autentificat.
Folosind această abordare, puteți combina câte comenzi doriți pe o singură linie, limita fiind doar numărul maxim de argumente care pot fi transmise programului. Puteți defini această limită cu următoarea comandă:
getconf ARG_MAXLinia de comandă este un instrument grozav, dar trebuie să introduceți comenzi în ea de fiecare dată când aveți nevoie de ele. Ce se întâmplă dacă scriem un set de comenzi într-un fișier și pur și simplu apelăm acel fișier pentru a le executa? De fapt, fișierul despre care vorbim se numește script de linie de comandă.
Cum funcționează scripturile bash
Creați un fișier gol folosind comanda touch. În prima linie, trebuie să specificați ce shell vom folosi. Suntem interesati de bash, deci prima linie a fișierului ar fi:
#!/bin/bash În altă parte în acest fișier, simbolul hash este folosit pentru a indica comentariile pe care shell-ul nu le procesează. Totuși, prima linie este un caz special, este semnul lire sterline urmat de un semn de exclamare (această secvență se numește ) și calea către bash, indicați sistemului pentru care a fost creat special scriptul bash.
Comenzile Shell sunt separate printr-un avans de linie, comentariile sunt separate prin semnul lire sterline. Iată cum arată:
#!/bin/bash
# This is a comment
pwd
whoamiAici, la fel ca pe linia de comandă, puteți scrie comenzi pe o singură linie, separându-le cu punct și virgulă. Cu toate acestea, dacă scrieți comenzi pe linii diferite, fișierul este mai ușor de citit. În orice caz, shell-ul le va procesa.
Setarea permisiunilor pe un fișier script
Salvați fișierul dându-i un nume myscript, iar scriptul bash este aproape terminat. Acum rămâne doar să faceți acest fișier executabil, altfel, când încercați să-l executați, veți întâlni o eroare Permission denied.

Încercarea de a rula un fișier script cu permisiuni configurate incorect
Să facem fișierul executabil:
chmod +x ./myscriptAcum să încercăm să-l executăm:
./myscriptDupă setarea permisiunilor, totul funcționează așa cum ar trebui.

Rulați cu succes scriptul bash
Ieșire mesaj
Pentru a imprima text pe consola Linux, utilizați comanda echo. Să folosim cunoștințele despre acest fapt și să ne edităm scriptul, adăugând explicații la datele care scot comenzile deja în el:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiIată ce se întâmplă după rularea scriptului actualizat.

Ieșirea mesajelor dintr-un script
Acum putem afișa etichete explicative folosind comanda echo. Dacă nu știți cum să editați un fișier utilizând instrumentele Linux sau dacă nu ați văzut comanda înainte echo, aruncăm o privire la materiale.
Utilizarea variabilelor
Variabilele vă permit să stocați informații într-un fișier script, cum ar fi rezultatele comenzilor, pentru a fi utilizate de alte comenzi.
Nu este nimic greșit în a executa comenzi individuale fără a stoca rezultatele muncii lor, dar posibilitățile acestei abordări sunt foarte limitate.
Există două tipuri de variabile care pot fi utilizate în scripturile bash:
- variabile de mediu
- Variabile utilizator
variabile de mediu
Uneori, comenzile shell trebuie să funcționeze cu unele date de sistem. De exemplu, iată cum să afișați directorul principal al utilizatorului curent:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Vă rugăm să rețineți că putem folosi variabila de sistem $HOME între ghilimele duble, acest lucru nu va împiedica sistemul să-l recunoască. Iată ce se întâmplă dacă rulați scriptul de mai sus.

Utilizarea unei variabile de mediu într-un script
Dar dacă doriți să afișați un semn dolar? Să încercăm asta:
echo "I have $1 in my pocket" Sistemul va detecta un semn dolar într-un șir delimitat de ghilimele și va presupune că am referit o variabilă. Scriptul va încerca să afișeze valoarea unei variabile nedefinite. $1. Nu de asta avem nevoie. Ce să fac?
Într-o situație ca aceasta, folosirea caracterului de control backslash înainte de semnul dolar ajută:
echo "I have $1 in my pocket"Scriptul va afișa acum exact ceea ce este așteptat.

Utilizarea unei secvențe de evacuare pentru a afișa un semn dolar
Variabile utilizator
Pe lângă variabilele de mediu, scripturile bash vă permit să setați și să utilizați propriile variabile în script. Astfel de variabile păstrează o valoare până la sfârșitul scriptului.
Ca și în cazul variabilelor de sistem, variabilele utilizator pot fi accesate folosind semnul dolar:
TNW-CUS-FMP - cod promoțional pentru o reducere de 10% la serviciile noastre, disponibil pentru activare în 7 zile
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Iată ce se întâmplă după rularea unui astfel de script.

Variabile personalizate în Script
Înlocuirea comenzilor
Una dintre cele mai utile caracteristici ale scripturilor bash este capacitatea de a extrage informații din ieșirea comenzilor și de a le atribui variabilelor, ceea ce vă permite să utilizați aceste informații oriunde în fișierul script.
Acest lucru se poate face în două moduri.
- Cu caracterul backtick „`”
- Cu ajutorul construcției
$()
Când utilizați prima abordare, aveți grijă să nu folosiți un singur ghilimeleu în loc de un backtick. Comanda trebuie să fie inclusă în două astfel de pictograme:
mydir=`pwd`În a doua abordare, același lucru este scris astfel:
mydir=$(pwd)Și scenariul, în cele din urmă, ar putea arăta astfel:
#!/bin/bash
mydir=$(pwd)
echo $mydir În timpul funcționării sale, ieșirea comenzii pwdva fi stocat într-o variabilă mydir, al cărui conținut, folosind comanda echo, va merge la consolă.

Script care salvează rezultatele comenzii într-o variabilă
Operatii matematice
Pentru a efectua operații matematice într-un fișier script, puteți utiliza o construcție a formularului $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operații matematice într-un script
dacă-atunci structura de control
În unele scenarii, este necesar să se controleze fluxul de execuție a comenzii. De exemplu, dacă o anumită valoare este mai mare de cinci, trebuie efectuată o acțiune, în caz contrar, alta. Acest lucru este aplicabil în foarte multe situații, iar aici structura de control ne va ajuta if-then. În forma sa cea mai simplă, arată astfel:
if команда
then
команды
fiȘi iată un exemplu de lucru:
#!/bin/bash
if pwd
then
echo "It works"
fi În acest caz, dacă executarea comenzii pwdse finalizează cu succes, textul „funcționează” va fi afișat în consolă.
Să folosim cunoștințele pe care le avem și să scriem un scenariu mai complex. Să presupunem că trebuie să găsim un utilizator în /etc/passwd, iar dacă a fost găsit, raportați că există.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiAcesta este ceea ce se întâmplă după rularea acestui script.

Căutare utilizator
Aici am folosit comanda greppentru a căuta un utilizator într-un fișier /etc/passwd. Dacă echipa grepnecunoscut pentru tine, descrierea acesteia poate fi găsită .
În acest exemplu, dacă utilizatorul este găsit, scriptul va afișa un mesaj corespunzător. Ce se întâmplă dacă utilizatorul nu ar putea fi găsit? În acest caz, scriptul va finaliza pur și simplu execuția fără a ne spune nimic. Aș vrea să ne spună și despre asta, așa că haideți să îmbunătățim codul.
Construcția de control dacă-atunci-altfel
Pentru ca programul să poată raporta atât rezultatele unei căutări reușite, cât și ale unui eșec, folosim construcția if-then-else. Iată cum este configurat:
if команда
then
команды
else
команды
fi Dacă prima comandă returnează zero, ceea ce înseamnă că a fost executată cu succes, condiția va fi adevărată și execuția nu va merge de-a lungul ramurii else. În caz contrar, dacă se returnează altceva decât zero, ceea ce înseamnă eșec, sau un rezultat fals, comenzile de după else.
Să scriem următorul script:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Execuția lui a mers pe linie else.

Rularea unui script cu un construct if-then-else
Ei bine, să trecem mai departe și să ne întrebăm despre condiții mai dificile. Ce se întâmplă dacă trebuie să verificați nu o singură condiție, ci mai multe? De exemplu, dacă este găsit utilizatorul necesar, ar trebui să fie afișat un mesaj, dacă este îndeplinită o altă condiție, ar trebui să fie afișat un alt mesaj și așa mai departe. Într-o astfel de situație, condițiile imbricate ne vor ajuta. Arata cam asa:
if команда1
then
команды
elif команда2
then
команды
fi Dacă prima comandă returnează zero, ceea ce indică executarea sa cu succes, comenzile din primul bloc vor fi executate then, în caz contrar, dacă prima condiție este falsă și dacă a doua comandă returnează zero, se va executa al doilea bloc de cod.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi Într-un astfel de script, puteți, de exemplu, să creați un utilizator nou folosind comanda useradd, dacă căutarea nu a returnat niciun rezultat sau faceți altceva util.
Comparație de numere
În scripturi, puteți compara valori numerice. Mai jos este o listă de comenzi relevante.
n1 -eq n2Returnează adevărat dacăn1esten2.
n1 -ge n2Returnează adevărat dacăn1mai mult sau egaln2.
n1 -gt n2Returnează adevărat dacăn1mai mult decâtn2.
n1 -le n2Returnează adevărat dacăn1mai putin sau egaln2.
n1 -lt n2Returnează adevărat dacă n1 este mai mic decâtn2.
n1 -ne n2Returnează adevărat dacăn1nu egaln2.
De exemplu, să încercăm unul dintre operatorii de comparație. Rețineți că expresia este cuprinsă între paranteze drepte.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiIată ce va scoate această comandă.

Compararea numerelor din scripturi
Valoare variabilă val1mai mare de 5, eventual ramura este executată thenoperator de comparație și mesajul corespunzător este afișat în consolă.
Comparație de șiruri
Scripturile pot compara, de asemenea, valorile șirurilor. Operatorii de comparație par destul de simpli, dar operatorii de comparație de șiruri au anumite particularități, pe care le vom atinge mai jos. Iată o listă de operatori.
str1 = str2Testează șirurile de caractere pentru egalitate, returnează adevărat dacă șirurile sunt identice.
str1 != str2Returnează adevărat dacă șirurile nu sunt identice.
str1 < str2Returnează adevărat dacăstr1mai puțin decâtstr2.
str1 > str2Returnează adevărat dacăstr1mai mult decâtstr2.
-n str1Returnează adevărat dacă lungimestr1Peste zero.
-z str1Returnează adevărat dacă lungimestr1este egal cu zero.
Iată un exemplu de comparație de șiruri într-un script:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiCa rezultat al execuției scriptului, obținem următoarele.

Comparație de șiruri în scripturi
Iată o caracteristică a comparației șirurilor care merită menționată. Și anume, operatorii „>” și „<” trebuie evadați cu o bară oblică inversă, altfel scriptul nu va funcționa corect, deși nu vor apărea mesaje de eroare. Scriptul interpretează semnul „>” ca o comandă de redirecționare a ieșirii.
Iată cum arată lucrul cu acești operatori în cod:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiIată rezultatele scenariului.

Comparație șiruri, avertisment aruncat
Rețineți că scriptul, deși se execută, dă un avertisment:
./myscript: line 5: [: too many arguments Pentru a scăpa de acest avertisment, conchidem $val2 între ghilimele duble:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAcum totul funcționează așa cum ar trebui.

Comparație de șiruri
O altă caracteristică a operatorilor „>” și „<” este modul în care aceștia lucrează cu litere mari și mici. Pentru a înțelege această caracteristică, să pregătim un fișier text cu următorul conținut:
Likegeeks
likegeeks Salvați-l cu un nume myfileși apoi executați următoarea comandă în terminal:
sort myfileVa sorta liniile din fișier astfel:
likegeeks
Likegeeks Echipă sort, în mod implicit, sortează șirurile în ordine crescătoare, ceea ce înseamnă că litera minusculă din exemplul nostru este mai mică decât litera mare. Acum să pregătim un script care va compara aceleași șiruri de caractere:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiDacă îl rulați, se dovedește că opusul este adevărat - litera mică este acum mai mare decât cea mare.

comanda de sortare și compararea șirurilor în fișierul script
În comenzile de comparație, literele mari sunt mai mici decât literele mici. Compararea șirurilor aici se face prin compararea codurilor de caractere ASCII, ordinea de sortare este astfel dependentă de codurile de caractere.
Echipă sort, la rândul său, utilizează ordinea de sortare specificată în setările limbii sistemului.
Verificări ale fișierelor
Poate că comenzile de mai jos sunt folosite cel mai des în scripturile bash. Acestea vă permit să verificați diferite condiții privind fișierele. Iată o listă cu aceste comenzi.
-d fileVerifică dacă un fișier există și dacă este un director.
-e fileVerifică dacă există un fișier.
-f fileVerifică dacă un fișier există și dacă este un fișier.
-r fileVerifică dacă fișierul există și este ușor de citit.
-s file ПVerifică dacă fișierul există și nu este gol.
-w fileVerifică dacă fișierul există și poate fi scris.
-x fileVerifică dacă un fișier există și este executabil.
file1 -nt file2Verifică dacă este mai noufile1decâtfile2.
file1 -ot file2Verifică dacă mai vechifile1decâtfile2.
-O fileVerifică dacă fișierul există și este deținut de utilizatorul curent.
-G fileVerifică dacă fișierul există și dacă ID-ul său de grup se potrivește cu ID-ul de grup al utilizatorului curent.
Aceste comenzi, precum și multe altele discutate astăzi, sunt ușor de reținut. Numele lor, fiind abrevieri pentru diverse cuvinte, indică direct verificările pe care le efectuează.
Să încercăm una dintre comenzile în practică:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiAcest script, pentru un director existent, își va afișa conținutul.

Listarea conținutului unui director
Credem că puteți experimenta cu restul comenzilor pe cont propriu, toate se aplică după același principiu.
Rezultatele
Astăzi am vorbit despre cum să începem să scriem scripturi bash și am acoperit câteva lucruri de bază. De fapt, tema programării bash este uriașă. Acest articol este o traducere a primei părți a unei serii mari de 11 materiale. Dacă doriți să continuați chiar acum, iată o listă cu originalele acestor materiale. Pentru comoditate, cel a cărui traducere tocmai ați citit-o este inclus aici.
- - aici vorbim despre cum să începem crearea scripturilor bash, se ia în considerare utilizarea variabilelor, sunt descrise construcții condiționate, calcule, comparații de numere, șiruri de caractere, aflarea informațiilor despre fișiere.
- - aici sunt dezvăluite caracteristicile de lucru cu bucle for și while.
- - acest material este dedicat parametrilor liniei de comandă și cheilor care pot fi transmise scripturilor, lucrând cu date pe care utilizatorul le introduce și care pot fi citite din fișiere.
- - aici vorbim despre descriptori de fișiere și lucrul cu aceștia, despre intrare, ieșire, erori, fluxuri de redirecționare a ieșirii.
- — acest material este dedicat semnalelor Linux, procesării lor în scripturi, lansării programate de script.
- - aici puteți afla despre crearea și utilizarea funcțiilor în scripturi, despre dezvoltarea bibliotecilor.
- — acest articol este despre lucrul cu editorul de text sed stream.
- — acest material este dedicat programării în limbajul de procesare a datelor awk.
- - aici puteți citi despre utilizarea expresiilor regulate în scripturile bash.
- - aici sunt metode de lucru cu mesaje care pot fi trimise utilizatorilor, precum și o metodă de monitorizare a discului.
- - acest material este dedicat instrumentului Expect, cu ajutorul căruia poți automatiza interacțiunea cu utilități interactive. În special, este vorba despre scripturile de așteptare și despre modul în care acestea interacționează cu scripturile bash și alte programe.
Credem că unul dintre lucrurile grozave la această serie de articole este că începe de la cele mai elementare, potrivite pentru utilizatorii de orice nivel, duce treptat la subiecte destul de serioase, oferind tuturor șansa de a avansa în scripting-ul liniei de comandă Linux.
Dragi cititori! Le rugăm guru-urilor de programare bash să vorbească despre cum au ajuns la culmile stăpânirii, să împărtășească secrete și așteptăm impresii de la cei care tocmai au scris primul lor scenariu.
Numai utilizatorii înregistrați pot participa la sondaj. , Vă rog.
Traduceți restul seriei de articole?
Da!
Nu, nu e nevoie
Au votat 1030 utilizatori. 106 utilizatori s-au abținut.
Sursa: www.habr.com
