Scripturi Bash: început

Scripturi Bash: început
Scripturi Bash Partea 2: Bucle
Scripturi Bash, partea 3: opțiuni și comutatoare ale liniei de comandă
Scripturi Bash, partea 4: intrare și ieșire
Scripturi Bash, partea 5: semnale, sarcini de fundal, management de script
Scripturi Bash, Partea 6: Funcții și dezvoltare bibliotecă
Scripturi Bash, partea 7: sed și procesare de text
Scripturi Bash, Partea 8: Limbajul de procesare a datelor awk
Scripturi Bash Partea 9: Expresii regulate
Scripturi Bash Partea 10: Exemple practice
Scripturi Bash, partea 11: așteptarea și automatizarea utilităților interactive

Astăzi vom vorbi despre scripturile bash. Acest - scripturi de linie de comandă, 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 Linie de comanda Linux.

Scripturi Bash: început

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.

Scripturi Bash: început

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_MAX

Linia 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 shebang) ș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
whoami

Aici, 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.

Scripturi Bash: început
Încercarea de a rula un fișier script cu permisiuni configurate incorect

Să facem fișierul executabil:

chmod +x ./myscript

Acum să încercăm să-l executăm:

./myscript

După setarea permisiunilor, totul funcționează așa cum ar trebui.

Scripturi Bash: început
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:"
whoami

Iată ce se întâmplă după rularea scriptului actualizat.

Scripturi Bash: început
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 acest 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.

Scripturi Bash: început
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.

Scripturi Bash: început
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.

Scripturi Bash: început
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ă.

Scripturi Bash: început
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

Scripturi Bash: început
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"
fi

Acesta este ceea ce se întâmplă după rularea acestui script.

Scripturi Bash: început
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ă aici.

Î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.

Scripturi Bash: început
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ă n1 este n2.
n1 -ge n2 Returnează adevărat dacă n1mai mult sau egal n2.
n1 -gt n2Returnează adevărat dacă n1 mai mult decât n2.
n1 -le n2Returnează adevărat dacă n1mai putin sau egal n2.
n1 -lt n2Returnează adevărat dacă n1 este mai mic decât n2.
n1 -ne n2Returnează adevărat dacă n1nu egal n2.

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"
fi

Iată ce va scoate această comandă.

Scripturi Bash: început
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 = str2 Testează ș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ât str2.
str1 > str2 Returnează adevărat dacă str1mai mult decât str2.
-n str1 Returnează adevărat dacă lungime str1Peste zero.
-z str1Returnează adevărat dacă lungime str1este 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"
fi

Ca rezultat al execuției scriptului, obținem următoarele.

Scripturi Bash: început
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"
fi

Iată rezultatele scenariului.

Scripturi Bash: început
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"
fi

Acum totul funcționează așa cum ar trebui.

Scripturi Bash: început
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 myfile

Va 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"
fi

Dacă îl rulați, se dovedește că opusul este adevărat - litera mică este acum mai mare decât cea mare.

Scripturi Bash: început
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 file Verifică 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 file2 Verifică dacă este mai nou file1decât file2.
file1 -ot file2Verifică dacă mai vechi file1decât file2.
-O file Verifică 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"
fi

Acest script, pentru un director existent, își va afișa conținutul.

Scripturi Bash: început
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.

  1. Scriptul Bash pas cu pas - 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.
  2. Bash Scripting Part 2, Bash the awesome - aici sunt dezvăluite caracteristicile de lucru cu bucle for și while.
  3. Bash Scripting Partea 3, Parametri și opțiuni - 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.
  4. Bash Scripting Partea 4, Intrare și ieșire - aici vorbim despre descriptori de fișiere și lucrul cu aceștia, despre intrare, ieșire, erori, fluxuri de redirecționare a ieșirii.
  5. Bash Scripting Partea 5, Sighals & Jobs — acest material este dedicat semnalelor Linux, procesării lor în scripturi, lansării programate de script.
  6. Bash Scripting Partea 6, Funcții - aici puteți afla despre crearea și utilizarea funcțiilor în scripturi, despre dezvoltarea bibliotecilor.
  7. Bash Scripting Partea 7, Folosind sed — acest articol este despre lucrul cu editorul de text sed stream.
  8. Bash Scripting Partea 8, Folosind awk — acest material este dedicat programării în limbajul de procesare a datelor awk.
  9. Bash Scripting Partea 9, Expresii regulate - aici puteți citi despre utilizarea expresiilor regulate în scripturile bash.
  10. Bash Scripting Partea 10, Exemple practice - aici sunt metode de lucru cu mesaje care pot fi trimise utilizatorilor, precum și o metodă de monitorizare a discului.
  11. Bash Scripting Part 11, Expect Command - 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.

Scripturi Bash: început

Numai utilizatorii înregistrați pot participa la sondaj. Loghează-te, 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

Adauga un comentariu