Astăzi vom discuta despre bash-scripte. Acestea sunt , scrise pentru shell-ul bash. Există și alte shell-uri, de exemplu — zsh, tcsh, ksh, dar ne vom concentra pe bash. Acest material este destinat tuturor celor interesați, singura condiție fiind abilitățile de lucru în Linux.
Scripturile pentru linia de comandă sunt seturi de comenzi identice cu cele pe care le poți introduce de la tastatură, adunate în fișiere și unite cu un anumit scop comun. Rezultatele execuției comenzilor pot avea fie o valoare proprie, fie pot servi ca date de intrare pentru alte comenzi. Scripturile sunt o modalitate puternică de automatizare a acțiunilor frecvent efectuate.
Deci, dacă ne referim la linia de comandă, aceasta permite executarea mai multor comenzi deodată, introducându-le prin punct și virgulă:
pwd ; whoami De fapt, dacă ai încercat asta în terminalul tău, primul tău bash-script, care implică două comenzi, deja a fost scris. Funcționează astfel. Mai întâi, comanda pwd arată pe ecran informații despre directorul de lucru curent, apoi comanda whoamiafişează informații despre utilizatorul cu care ai intrat în sistem.
Folosind o abordare similară, poți combina câte comenzi dorești într-o singură linie, limitarea fiind doar numărul maxim de argumente care pot fi transmise programului. Această limitare poate fi determinată folosind comanda:
getconf ARG_MAXLinia de comandă este un instrument excelent, dar comenzile trebuie introduse de fiecare dată când este necesar. Ce-ar fi să scrii un set de comenzi într-un fișier și să apelezi pur și simplu acel fișier pentru a le executa? De fapt, fișierul despre care vorbim se numește script pentru linia de comandă.
Cum sunt structurate bash-scriptele
Creează un fișier gol folosind comanda touch. În prima sa linie, trebuie să specificăm ce shell dorim să utilizăm. Ne interesează bash, așa că prima linie a fișierului va arăta astfel:
#!/bin/bash În celelalte linii ale acestui fișier, simbolul hash este folosit pentru a desemna comentarii pe care shell-ul le ignoră. Totuși, prima linie este un caz special, aici hash-ul urmat de un semn de exclamare (această secvență se numește ) și calea către bash, indică sistemului că scriptul este creat pentru bash.
Comenzile shell sunt separate printr-o linie nouă, comentariile sunt evidențiate prin simbolul hash. Iată cum arată:
#!/bin/bash
# This is a comment
pwd
whoamiAici, la fel ca în linia de comandă, poți scrie comenzi într-o singură linie, separându-le cu un punct și virgulă. Totuși, dacă scrii comenzile pe linii diferite, fișierul devine mai ușor de citit. În orice caz, shell-ul le va procesa.
Setarea permisiunilor pentru fișierul script
Salvează fișierul, dându-i un nume myscript, iar lucrul de creare a scriptului bash este aproape finalizat. Acum rămâne doar să facem acest fișier executabil, altfel, atunci când încerci să-l rulezi, te vei confrunta cu eroarea Permission denied.

Încercarea de a rula fișierul 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ă corect.

Rularea cu succes a scriptului bash
Ieșirea mesajelor
Pentru a afișa text în consola Linux, se folosește comanda echo. Să folosim acest fapt și să edităm scriptul nostru, adăugând explicații pentru datele pe care le scot deja comenzile existente în el:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiIată ce va rezulta după rularea scriptului actualizat.

Ieșirea mesajelor din script
Acum putem afișa etichete explicative folosind comanda echo. Dacă nu știi cum să editezi un fișier folosind uneltele Linux, sau nu ai mai întâlnit până acum comanda echo, aruncă o privire la material.
Folosirea variabilelor
Variabilele permit stocarea de informații în fișierul script, de exemplu - rezultatele comenzii pentru a fi utilizate de alte comenzi.
Nu este nimic în neregulă cu execuția comenzilor individuale fără a stoca rezultatele acestora, dar posibilitățile acestui abordaj sunt foarte limitate.
Există două tipuri de variabile care pot fi utilizate în scripturile bash:
- Variabile de mediu
- Variabilele utilizatorului
Variabile de mediu
Uneori, în shell, trebuie să lucrăm cu anumite date de sistem. Iată, de exemplu, cum să afișăm directorul home al utilizatorului curent:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Rețineți că putem utiliza variabila de sistem $HOME în ghilimele, nu va împiedica sistemul să o recunoască. Iată ce se va întâmpla dacă executăm scenariul de mai sus.

Utilizarea variabilei de mediu într-un script
Și ce se întâmplă dacă trebuie să afișăm simbolul dolar? Să încercăm astfel:
echo "I have $1 in my pocket" Sistemul va detecta simbolul dolar în stringul delimitat de ghilimele și va decide că ne referim la o variabilă. Scriptul va încerca să afișeze valoarea unei variabile nedefinite $1. Asta nu este ceea ce ne dorim. Ce să facem?
Într-o astfel de situație, ne va ajuta utilizarea caracterului de control, a barei inverse, înainte de simbolul dolar:
echo "I have $1 in my pocket"Acum scriptul va afișa exact ceea ce ne așteptăm.

Utilizarea secvenței de control pentru a afișa simbolul dolar
Variabilele utilizatorului
În plus față de variabilele de mediu, scripturile bash permit definirea și utilizarea propriilor variabile în script. Aceste variabile păstrează valoarea până când execuția scriptului se finalizează.
La fel ca în cazul variabilelor de sistem, variabilele personale pot fi accesate folosind simbolul dolar:
TNW-CUS-FMP — cod promoțional pentru o reducere de 10% la serviciile noastre, disponibil pentru activare timp de 7 zile
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Iată ce se va întâmpla după rularea unui astfel de script.

Variabilele personale în script
Substituirea comenzilor
Una dintre cele mai utile funcționalități ale scripturilor bash este capacitatea de a extrage informații din ieșirea comenzilor și de a le asigna variabilelor, ceea ce permite utilizarea acestei informații oriunde în fișierul script.
Acest lucru se poate face în două moduri.
- Folosind caracterul de backquote „`”
- Folosind construcția
$()
Folosind prima abordare, asigurați-vă că nu introduceți o ghilimea simplă în loc de backquote. Comanda trebuie închisă în două astfel de caractere:
mydir=`pwd`În a doua abordare, același lucru se scrie astfel:
mydir=$(pwd)Și scriptul, în cele din urmă, poate arăta astfel:
#!/bin/bash
mydir=$(pwd)
echo $mydir În timpul execuției sale, ieșirea comenzii pwdva fi salvată în variabila mydir, conținutul căreia, folosind comanda echo, va ajunge în consolă.

Scriptul care salvează rezultatele execuției comenzii într-o variabilă
Operații matematice
Pentru a efectua operații matematice într-un fișier script, se poate utiliza o construcție de tipul $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operații matematice în script
Construcția de control if-then
În unele scripturi, este necesară gestionarea fluxului de execuție al comenzilor. De exemplu, dacă o anumită valoare este mai mare de cinci, trebuie să se execute o acțiune, iar în caz contrar – alta. Aceasta se aplică în multe situații, iar construcția de control ne va ajuta aici if-then. În cea mai simplă formă, aceasta arată astfel:
if comandă
then
comenzi
fiIată un exemplu de lucru:
#!/bin/bash
if pwd
then
echo "It works"
fi În acest caz, dacă execuția comenzii pwdse finalizează cu succes, textul „it works” va fi afișat în consolă.
Să folosim cunoștințele noastre existente și să scriem un script mai complex. Să zicem că trebuie să găsim un anumit utilizator în /etc/passwd, iar dacă l-am găsit, să comunicăm că acesta există.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiIată ce obținem după executarea acestui script.

Căutarea utilizatorului
Aici am folosit comanda greppentru a căuta utilizatorul în fișierul /etc/passwd. Dacă comanda grepîți este necunoscută, descrierea ei poate fi găsită .
În acest exemplu, dacă utilizatorul este găsit, scriptul va afișa un mesaj corespunzător. Iar dacă nu reușim să găsim utilizatorul? În acest caz, scriptul se va finaliza fără a ne oferi nicio informație. Ne-am dori ca el să ne spună și despre aceasta, așa că vom îmbunătăți codul.
Construcția de control if-then-else
Pentru ca programul să poată comunica atât despre rezultatele găsirii cu succes, cât și despre eșec, vom folosi construcția if-then-else. Iată cum este structurat:
if comandă
then
comenzi
else
comenzi
fi Dacă prima comandă returnează zero, ceea ce indică o execuție cu succes, condiția va fi adevărată și execuția nu va merge pe ramura altfel. În caz contrar, dacă se va returna ceva diferit de zero, ceea ce va indica un eșec sau un rezultat fals, comenzile plasate după altfel.
vor fi executate.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Să scriem un astfel de script: altfel.

Executarea acestuia a mers pe ramura
Ei bine, să continuăm să avansăm și să ne punem întrebarea despre condiții mai complexe. Ce se întâmplă dacă trebuie să verificăm nu o singură condiție, ci mai multe? De exemplu, dacă utilizatorul dorit este găsit, trebuie să afișăm un mesaj, dacă se îndeplinește o altă condiție — un alt mesaj și așa mai departe. Într-o astfel de situație, condițiile încastrate ne vor ajuta. Arată așa:
if comanda1
then
comenzi
elif comanda2
then
comenzi
fi Dacă prima comandă va returna zero, ceea ce indică succesul ei, comenzile din primul bloc vor fi executate. atunci, altfel, 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, putem, de exemplu, crea un nou utilizator cu ajutorul comenzii useradd, dacă căutarea nu a dat rezultate, sau putem face altceva util.
Compararea numerelor
În scripturi, putem compara valori numerice. Iată o listă cu comenzile corespunzătoare.
n1 -eq n2Returnează adevărat, dacăn1este egal cun2.
n1 -ge n2Returnează adevărat, dacăn1mai mare sau egal cun2.
n1 -gt n2Returnează adevărat, dacăn1mai.n2.
n1 -le n2Returnează adevărat, dacăn1mai mic sau egal cun2.
n1 -lt n2Returnează adevărat dacă n1 este mai mic decâtn2.
n1 -ne n2Returnează adevărat, dacăn1nu este egaln2.
Ca exemplu, să încercăm unul dintre operatorii de comparație. Observați că expresia este încadrată în paranteze pătrate.
#!/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 returna această comandă.

Compararea numerelor în scripturi
Valoarea variabilei val1mai mare decât 5, în consecință, se execută ramura atuncioperatorului de comparație și în consolă se afișează mesajul corespunzător.
Compararea stringurilor
În scripturi, putem compara și valori de tip string. Operatorii de comparație sunt destul de simpli, însă există anumite particularități ale operațiunilor de comparație a stringurilor, pe care le vom aborda mai jos. Iată lista operatorilor.
str1 = str2Verifică dacă stringurile sunt egale, returnează adevărat, dacă stringurile sunt identice.
str1 != str2Returnează adevărat, dacă stringurile nu sunt identice.
str1 < str2Returnează adevărat dacăstr1este mai mic decâtstr2.
str1 > str2Returnează adevărat dacăstr1mai mare decâtstr2.
-n str1Returnează adevărat, dacă lungimeastr1este mai mare de zero.
-z str1Returnează adevărat, dacă lungimeastr1este egală cu zero.
Iată un exemplu de comparare a stringurilor î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 vom obține următoarele.

Compararea stringurilor în scripturi
Iată o caracteristică a comparării șirurilor de caractere despre care merită menționat. Anume, operatorii „>” și „” ca o comandă de redirecționare a ieșirii.
Iată cum arată munca 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 obținute de script.

Compararea șirurilor, avertismentul generat
Rețineți că scriptul, deși rulează, generează un avertisment:
./myscript: line 5: [: too many arguments Pentru a scăpa de acest avertisment, vom încadra $val2 în 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ă corect.

Compararea stringurilor
O altă caracteristică a operatorilor „>” și „<” constă în modul în care aceștia funcționează cu litere mari și mici. Pentru a înțelege această caracteristică, vom pregăti un fișier text cu următorul conținut:
Likegeeks
likegeeks Îl vom salva cu numele myfile, după care vom rula în terminal comanda următoare:
sort myfileAceasta va sorta șirurile din fișier astfel:
likegeeks
Likegeeks Comanda sort, sortarea, implicit, se face în ordine crescătoare, adică litera mică în exemplul nostru este mai mică decât cea mare. Acum vom pregăti un script care va compara aceleași șiruri:
#!/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 rulăm, vom descoperi că totul este invers — litera mică este acum mai mare decât cea mare.

Comanda sortare și compararea șirurilor în fișierul scriptului
În comenzile de comparare, literele mari sunt mai mici decât cele mici. Compararea șirurilor se face prin compararea codurilor ASCII ale caracterelor, ordinea de sortare depinzând astfel de codurile caracterelor.
Comanda sort, la rândul său, utilizează ordinea de sortare definită în setările limbajului de sistem.
Verificarea fișierelor
Probabil că următoarele comenzi sunt cele mai frecvent utilizate în scripturile bash. Ele permit verificarea diferitelor condiții legate de fișiere. Iată lista acestor comenzi.
-d fileVerifică dacă fișierul există și dacă este un director.
-e fileVerifică dacă fișierul există.
-f fileVerifică dacă fișierul există și dacă este un fișier.
-r fileVerifică dacă fișierul există și dacă este accesibil pentru citire.
-s file PVerifică dacă fișierul există și dacă nu este gol.
-w fileVerifică dacă fișierul există și dacă este accesibil pentru scriere.
-x fileVerifică dacă fișierul există și dacă este executabil.
file1 -nt file2Verifică dacă este mai nou decâtfile1, decâtfile2.
file1 -ot file2Verifică dacă este mai vechi decâtfile1, decâtfile2.
-O fileVerifică dacă fișierul există și dacă proprietarul său este utilizatorul curent.
-G fileVerifică dacă fișierul există și dacă ID-ul său de grup corespunde ID-ului de grup al utilizatorului curent.
Aceste comenzi, precum și multe altele discutate astăzi, sunt ușor de memorat. Numele lor, fiind abrevieri de la diverse cuvinte, indică clar verificările pe care le efectuează.
Să încercăm una dintre comenzi î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, va afișa conținutul său.

Afișare conținut director
Considerăm că, cu celelalte comenzi, veți putea experimenta singuri; toate se aplică după același principiu.
Concluzii
Astăzi am vorbit despre cum să începi scrierea de scripturi bash și am discutat câteva lucruri de bază. De fapt, subiectul programării bash este imens. Acest articol este o traducere a primei părți dintr-o serie mare de 11 materiale. Dacă doriți continuarea chiar acum — iată lista originalelor acestor materiale. Pentru comoditate, acesta include și cel pe care tocmai l-ați citit.
- — aici se discută despre cum să începi crearea de scripturi bash, se examinează utilizarea variabilelor, se descriu structuri condiționale, calcule, comparații între numere, șiruri, obținerea informațiilor despre fișiere.
- — aici se descoperă particularitățile lucrului cu buclele for și while.
- — acest material este dedicat parametrilor din linia de comandă și opțiunilor care pot fi transmise scripturilor, lucrului cu datele introduse de utilizator și care pot fi citite din fișiere.
- — aici se discută despre descriptori de fișiere și lucrul cu aceștia, despre fluxuri de intrare, ieșire, erori, despre redirecționarea ieșirii.
- — acest material este dedicat semnalelor Linux, gestionării acestora în scripturi, și lansării scenariilor la program.
- — aici puteți învăța despre crearea și utilizarea funcțiilor în scripturi, despre dezvoltarea bibliotecilor.
- — acest articol este dedicat lucrului cu editorul de text în flux sed.
- — acest material este dedicat programării în limbajul de procesare a datelor awk.
- — aici poți citi despre utilizarea expresiilor regulate în scripturile bash.
- — aici sunt prezentate tehnici de lucru cu mesajele pe care le poți trimite utilizatorilor, precum și metoda de monitorizare a discului.
- — acest material este dedicat instrumentului Expect, care permite automatizarea interacțiunii cu utilitare interactive. În special, aici se discută despre scripturile expect și interacțiunea lor cu scripturile bash și alte programe.
Considerăm că una dintre valorile acestei serii de articole este că, începând cu cele mai simple subiecte, potrivite pentru utilizatori de orice nivel, ajunge treptat la teme destul de avansate, oferind șansa tuturor doritorilor de a progresa în crearea scripturilor pentru linia de comandă Linux.
Stimați cititori! Vă rugăm pe guru-i programării bash să ne povestească despre cum au ajuns la vârfurile măiestriei, să împărtășească secretele lor, iar de la cei care tocmai au scris primul lor script, așteptăm impresii.
Numai utilizatorii înregistrați pot participa la sondaj. , vă rugăm.
Să traducem celelalte părți ale ciclului de articole?
Da!
Nu, nu este necesar
Au votat 1030 de utilizatori. S-au abținut 106 utilizatori.
Sursa: habr.com
