Variabilele sunt elemente esențiale pentru a scrie scripturi eficiente și pentru a înțelege modul în care codul pe care îl utilizezi din diverse surse web va funcționa pe sistemul tău Linux. Acest ghid îți va oferi noțiunile de bază pentru a începe.
Introducere în Variabile
Variabilele sunt denumiri simbolice care reprezintă valori, fie că sunt șiruri de text, fie numere. Atunci când le folosești în cadrul comenzilor sau expresiilor, ele sunt interpretate ca și cum ai fi introdus direct valoarea pe care o stochează, nu doar numele variabilei.
Pentru a crea o variabilă, trebuie să îi atribui un nume și o valoare. Numele variabilelor ar trebui să fie cât mai descriptive, astfel încât să îți amintească de scopul lor. Un nume de variabilă nu poate începe cu un număr sau să conțină spații, dar poate începe cu un caracter subliniere. În rest, poți folosi orice combinație de litere și cifre.
Exemple Practice
În continuare, vom crea cinci variabile. Formatul este simplu: scrie numele, apoi semnul egal (=) și valoarea. Important este să nu existe spații înainte sau după semnul egal. Operația de a da o valoare unei variabile este numită atribuire.
Vom defini patru variabile de tip șir de text și o variabilă numerică, „anul_curent”:
nume_utilizator=Ion
sistem_operare=Linux
personaj=Mickey
aliment_preferat=Branza
anul_curent=2024
Pentru a vizualiza valoarea stocată într-o variabilă, folosim comanda „echo”. Trebuie să prefixezi numele variabilei cu semnul dolar ($) de fiecare dată când vrei să te referi la valoarea ei, conform exemplelor de mai jos:
echo $nume_utilizator
echo $sistem_operare
echo $anul_curent
Să folosim toate variabilele definite într-o singură comandă:
echo "$sistem_operare este pentru $nume_utilizator, la fel cum $aliment_preferat este pentru $personaj (c) $anul_curent"
Valorile variabilelor înlocuiesc numele lor. Poți schimba valorile variabilelor. Pentru a atribui o nouă valoare variabilei „sistem_operare”, urmezi aceeași procedură ca la definirea ei inițială:
sistem_operare=Windows
Dacă execuți din nou comanda care folosește variabilele, vei obține un rezultat diferit:
echo "$sistem_operare este pentru $nume_utilizator, la fel cum $aliment_preferat este pentru $personaj (c) $anul_curent"
Așadar, aceeași comandă, cu aceleași variabile, poate produce rezultate diferite dacă valorile stocate în variabile sunt modificate.
Vom discuta despre ghilimele mai târziu. Deocamdată, reține următoarele:
O variabilă inclusă între ghilimele simple (‘) este interpretată ca un text literal și nu ca o variabilă.
Variabilele incluse între ghilimele duble („) sunt tratate ca variabile.
Pentru a accesa valoarea unei variabile, trebuie să folosești semnul dolar ($).
O variabilă fără semnul dolar ($) afișează doar numele variabilei.
Poți crea o variabilă care preia valoarea dintr-o altă variabilă sau dintr-o combinație de variabile. Comanda de mai jos definește o nouă variabilă numită „combinatie” și îi atribuie valorile combinate ale variabilelor „sistem_operare” și „anul_curent”:
combinatie="$sistem_operare $anul_curent"
echo $combinatie
Utilizarea Variabilelor în Scripturi
Scripturile ar fi extrem de limitate fără variabile. Variabilele adaugă flexibilitatea necesară pentru ca un script să devină o soluție universală, nu doar una specifică. Pentru a înțelege diferența, iată un script care numără fișierele dintr-un director.
Scrie următoarele într-un fișier text și salvează-l cu numele „numar_fisiere.sh”:
#!/bin/bash director_de_numarat=/dev numar_fisiere=$(ls $director_de_numarat | wc -l) echo $numar_fisiere fisiere in $director_de_numarat
Înainte de a rula scriptul, trebuie să îl faci executabil, după cum urmează:
chmod +x numar_fisiere.sh
Pentru a executa scriptul, scrie următoarea comandă:
./numar_fisiere.sh
Scriptul afișează numărul de fișiere din directorul /dev. Iată cum funcționează:
O variabilă numită „director_de_numarat” este definită și setată să stocheze textul „/dev”.
O altă variabilă, „numar_fisiere”, este definită. Această variabilă preia valoarea dintr-o substituire de comandă. Aceasta este expresia dintre paranteze $( ). Reține că există un semn dolar ($) înaintea primei paranteze. Acest construct $( ) evaluează comenzile din interiorul parantezelor și returnează valoarea lor. În acest exemplu, această valoare este atribuită variabilei „numar_fisiere”. Variabila „numar_fisiere” primește o valoare, fără să fie interesată de modul în care a fost obținută această valoare.
Comanda evaluată în substituirea de comandă realizează o listare de fișiere cu comanda „ls” în directorul specificat de variabila „director_de_numarat”, care a fost setată la „/dev”. Așadar, scriptul execută comanda „ls /dev”.
Rezultatul comenzii „ls” este trimis comenzii „wc”. Opțiunea „-l” (număr de linii) instruiește comanda „wc” să numere liniile din rezultatul comenzii „ls”. Deoarece fiecare fișier este listat pe o linie separată, acesta este numărul de fișiere și subdirectoare din directorul „/dev”. Această valoare este atribuită variabilei „numar_fisiere”.
Ultima linie folosește comanda „echo” pentru a afișa rezultatul.
Dar acest script funcționează doar pentru directorul „/dev”. Cum facem ca scriptul să funcționeze pentru orice director? Este nevoie de o modificare minoră.
Parametrii Liniei de Comandă în Scripturi
Multe comenzi, cum ar fi „ls” și „wc”, acceptă parametri de linie de comandă. Aceștia oferă informații comenzii, astfel încât să știe ce dorești să facă. Dacă vrei ca „ls” să afișeze fișierele din directorul tău home și să includă și fișierele ascunse, poți folosi următoarea comandă, unde tilda „~” și opțiunea „-a” (toate) sunt parametrii liniei de comandă:
ls ~ -a
Scripturile noastre pot accepta parametri de linie de comandă. Aceștia sunt referiți ca „$1” pentru primul parametru, „$2” pentru al doilea și așa mai departe, până la „$9” pentru al nouălea parametru. (Există și „$0”, dar acesta este rezervat pentru a stoca numele scriptului.)
Te poți referi la parametrii liniei de comandă dintr-un script în același mod în care te referi la variabilele obișnuite. Să modificăm scriptul de mai sus, după cum urmează, și să-l salvăm cu numele „numar_fisiere2.sh”:
#!/bin/bash director_de_numarat=$1 numar_fisiere=$(ls $director_de_numarat | wc -l) echo $numar_fisiere fisiere in $director_de_numarat
De data aceasta, variabilei „director_de_numarat” îi este atribuită valoarea primului parametru din linia de comandă, „$1”.
Restul scriptului funcționează exact ca înainte. În loc de o soluție specifică, scriptul tău este acum unul general. Îl poți folosi pentru orice director, deoarece nu este blocat să funcționeze doar cu „/dev”.
Iată cum faci scriptul executabil:
chmod +x numar_fisiere2.sh
Acum, testează-l cu diferite directoare. Poți începe cu „/dev” pentru a te asigura că obții același rezultat ca înainte. Scrie următoarele comenzi:
./numar_fisiere2.sh /dev
./numar_fisiere2.sh /etc
./numar_fisiere2.sh /bin
Obții același rezultat (207 fișiere) pentru directorul „/dev”. Acesta este un rezultat bun și obții rezultate specifice fiecărui director introdus ca parametru.
Pentru a scurta scriptul, poți elimina complet variabila „director_de_numarat” și te poți referi direct la „$1”, după cum urmează:
#!/bin/bash numar_fisiere=$(ls $1 | wc -l) echo $numar_fisiere fisiere in $1
Variabile Speciale
Am menționat „$0”, care este întotdeauna setat la numele fișierului scriptului. Acest lucru îți permite să folosești scriptul pentru a afișa corect numele, chiar dacă este redenumit. Acest lucru este util în scopuri de logare, când dorești să știi numele procesului care a adăugat o intrare.
Următoarele sunt alte variabile speciale predefinite:
„$#”: Câți parametri de linie de comandă au fost transmiși scriptului.
„[email protected]”: Toți parametrii liniei de comandă transmiși scriptului.
„$?”: Codul de ieșire al ultimului proces care a fost rulat.
„$$”: ID-ul procesului (PID) al scriptului curent.
„$USER”: Numele utilizatorului care execută scriptul.
„$HOSTNAME”: Numele de gazdă al calculatorului care rulează scriptul.
„$SECONDS”: Numărul de secunde de când scriptul rulează.
„$RANDOM”: Returnează un număr aleatoriu.
„$LINENO”: Returnează numărul liniei curente a scriptului.
Dorești să le vezi pe toate într-un singur script, nu-i așa? Se poate! Salvează următoarele într-un fișier text numit „special.sh”:
#!/bin/bash echo "Au fost $# parametri de linie de comandă" echo "Ei sunt: [email protected]" echo "Parametrul 1 este: $1" echo "Scriptul se numește: $0" # O comandă oarecare, pentru a putea raporta codul de ieșire pwd echo "pwd a returnat $?" echo "Acest script are ID-ul procesului $$" echo "Scriptul a fost pornit de $USER" echo "Rulează pe $HOSTNAME" sleep 3 echo "Rulează de $SECONDS secunde" echo "Număr aleatoriu: $RANDOM" echo "Aceasta este linia numărul $LINENO din script"
Scrie următoarea comandă pentru a-l face executabil:
chmod +x special.sh
Acum, îl poți rula cu diverși parametri de linie de comandă, așa cum se arată mai jos.
Variabile de Mediu
Bash folosește variabile de mediu pentru a defini și a stoca proprietățile mediului în care este lansat. Acestea includ informații precum numele tău de utilizator, setările regionale, numărul de comenzi stocate în fișierul istoric, editorul implicit și multe altele.
Pentru a vedea variabilele de mediu active în sesiunea ta Bash, folosește această comandă:
env | less
Dacă analizezi lista, s-ar putea să găsești unele variabile utile pentru scripturile tale.
Exportarea Variabilelor
Când un script rulează, acesta o face într-un proces separat, iar variabilele pe care le folosește nu sunt vizibile în afara acelui proces. Dacă vrei să distribui o variabilă unui alt script lansat de scriptul tău, trebuie să exporți variabila respectivă. Vom demonstra cum se face acest lucru cu două scripturi.
Mai întâi, salvează următoarele cu numele „script_unu.sh”:
#!/bin/bash prima_var=alpha a_doua_var=bravo # Verifică valorile echo "$0: prima_var=$prima_var, a_doua_var=$a_doua_var" export prima_var export a_doua_var ./script_doi.sh # Verifică din nou valorile echo "$0: prima_var=$prima_var, a_doua_var=$a_doua_var"
Acest script creează două variabile, „prima_var” și „a_doua_var”, și le atribuie valori. Apoi, afișează valorile în fereastra terminalului, exportă variabilele și apelează scriptul „script_doi.sh”. Când „script_doi.sh” se termină și fluxul procesului revine la acest script, afișează din nou valorile variabilelor în fereastra terminalului. Apoi, poți vedea dacă s-au modificat.
Al doilea script, pe care îl vom folosi, se numește „script_doi.sh”. Acesta este scriptul apelat de „script_unu.sh”. Scrie următoarele:
#!/bin/bash # Verifică valorile echo "$0: prima_var=$prima_var, a_doua_var=$a_doua_var" # Setează valori noi prima_var=charlie a_doua_var=delta # Verifică din nou valorile echo "$0: prima_var=$prima_var, a_doua_var=$a_doua_var"
Acest al doilea script afișează valorile celor două variabile, le atribuie valori noi și apoi le afișează din nou.
Pentru a rula aceste scripturi, trebuie să le faci executabile folosind următoarele comenzi:
chmod +x script_unu.sh chmod +x script_doi.sh
Acum, scrie următoarea comandă pentru a lansa „script_unu.sh”:
./script_unu.sh
Iată ce ne spune rezultatul:
„script_unu.sh” afișează valorile variabilelor, care sunt „alpha” și „bravo”.
„script_doi.sh” afișează valorile variabilelor („alpha” și „bravo”) așa cum le-a primit.
„script_doi.sh” le modifică în „charlie” și „delta”.
„script_unu.sh” afișează valorile variabilelor, care sunt tot „alpha” și „bravo”.
Modificările făcute în al doilea script rămân în al doilea script. Este ca și cum copiile variabilelor ar fi trimise celui de-al doilea script, dar sunt distruse când scriptul se termină. Variabilele originale din primul script nu sunt afectate de modificările făcute de copii în al doilea script.
Ghilimele și Variabile
Poate ai observat că atunci când scripturile se referă la variabile, acestea sunt între ghilimele duble („). Acest lucru permite ca variabilele să fie interpretate corect, valorile lor fiind folosite la executarea liniei în script.
Dacă valoarea pe care o atribui unei variabile include spații, valoarea trebuie inclusă între ghilimele atunci când o atribui variabilei. Acest lucru se datorează faptului că, implicit, Bash folosește spațiul ca delimitator.
Iată un exemplu:
nume_site=Cum sa faci
Bash vede spațiul dinaintea lui „faci” ca pe un indiciu că începe o nouă comandă. Raportează că nu există o astfel de comandă și abandonează linia. Comanda „echo” ne arată că variabila „nume_site” nu conține nimic, nici măcar textul „Cum sa”.
Încearcă din nou, incluzând valoarea între ghilimele, după cum urmează:
nume_site="Cum sa faci"
De data aceasta, este recunoscută ca o singură valoare și atribuită corect variabilei „nume_site”.
Comanda „echo” este Prietenul Tău
Poate dura ceva timp până te obișnuiești cu substituirea comenzilor, cu folosirea corectă a ghilimelelor și cu includerea semnului dolar ($) atunci când este necesar.
Înainte de a apăsa Enter și de a executa o linie de comenzi Bash, încearcă să scrii „echo” înaintea ei. Astfel, te poți asigura că rezultatul va fi cel dorit. De asemenea, poți depista eventualele erori de sintaxă pe care le-ai fi făcut.