Cum se lucrează cu variabile în Bash

Variabilele sunt vitale dacă doriți să scrieți scripturi și să înțelegeți ce va face acel cod pe care urmează să îl tăiați și să lipiți de pe web pe computerul dvs. Linux. Vă vom pune să începeți!

Variabile 101

Variabilele sunt simboluri numite care reprezintă fie un șir, fie o valoare numerică. Când le utilizați în comenzi și expresii, sunt tratate ca și cum ați fi tastat valoarea pe care o dețin în loc de numele variabilei.

Pentru a crea o variabilă, trebuie doar să furnizați un nume și o valoare pentru aceasta. Numele variabilelor dvs. ar trebui să fie descriptive și să vă reamintească de valoarea pe care o dețin. Un nume de variabilă nu poate începe cu un număr și nici nu poate conține spații. Totuși, poate începe cu un subliniu. În afară de aceasta, puteți utiliza orice combinație de caractere alfanumerice mari și mici.

Exemple

Aici, vom crea cinci variabile. Formatul este să tastați numele, semnul egal = și valoarea. Rețineți că nu există spațiu înainte sau după semnul egal. Acordarea unei variabile a unei valori este adesea denumită atribuirea unei valori variabilei.

Vom crea patru variabile șir și o variabilă numerică, acest_an:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

La vezi valoarea păstrat într-o variabilă, utilizați comanda echo. Trebuie să precedați numele variabilei cu semnul dolar $ ori de câte ori faceți referire la valoarea pe care o conține, după cum se arată mai jos:

echo $my_name
echo $my_boost
echo $this_year

The

Să folosim toate variabilele noastre simultan:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

The

Valorile variabilelor le înlocuiesc denumirile. De asemenea, puteți modifica valorile variabilelor. Pentru a atribui o nouă valoare variabilei, my_boost, trebuie doar să repetați ceea ce ați făcut când i-ați atribuit prima valoare, astfel:

my_boost=Tequila

The

Dacă executați din nou comanda anterioară, acum obțineți un rezultat diferit:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Ecoul

Deci, puteți utiliza aceeași comandă care face referire la aceleași variabile și puteți obține rezultate diferite dacă modificați valorile păstrate în variabile.

Despre cotarea variabilelor vom vorbi mai târziu. Deocamdată, iată câteva lucruri de reținut:

O variabilă între ghilimele simple ‘ este tratată ca un șir literal și nu ca o variabilă.
Variabilele între ghilimele ” sunt tratate ca variabile.
Pentru a obține valoarea deținută într-o variabilă, trebuie să furnizați semnul dolar $.
O variabilă fără semnul dolar $ oferă doar numele variabilei.

De asemenea, puteți crea o variabilă care își ia valoarea dintr-o variabilă existentă sau dintr-un număr de variabile. Următoarea comandă definește o nouă variabilă numită drink_of_the_Year și îi atribuie valorile combinate ale variabilelor my_boost și this_year:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Băutura_a_anului=

Cum să utilizați variabilele în scripturi

Scripturile ar fi complet blocate fără variabile. Variabilele oferă flexibilitatea care face dintr-un script o soluție generală, mai degrabă decât o soluție specifică. Pentru a ilustra diferența, iată un script care numără fișierele din directorul /dev.

  Ce înseamnă SOS pe un iPhone?

Tastați acest lucru într-un fișier text și apoi salvați-l ca fcnt.sh (pentru „număr de fișiere”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Înainte de a putea rula scriptul, trebuie să îl faceți executabil, așa cum se arată mai jos:

chmod +x fcnt.sh

Tastați următoarele pentru a rula scriptul:

./fcnt.sh

Acest lucru tipărește numărul de fișiere din directorul /dev. Iată cum funcționează:

Este definită o variabilă numită folder_to_count și este setată să dețină șirul „/dev”.
O altă variabilă, numită file_count, este definită. Această variabilă își ia valoarea dintr-o înlocuire de comandă. Aceasta este expresia de comandă între paranteze $( ). Rețineți că există un semn dolar $ înainte de prima paranteză. Acest construct $( ) evaluează comenzile din paranteze și apoi returnează valoarea lor finală. În acest exemplu, acea valoare este atribuită variabilei file_count. În ceea ce privește variabila file_count, i se transmite o valoare de păstrat; nu este preocupat de modul în care a fost obținută valoarea.
Comanda evaluată în înlocuirea comenzii realizează o listă de fișiere ls în directorul din variabila folder_to_count, care a fost setată la „/dev”. Deci, scriptul execută comanda „ls /dev”.
Ieșirea de la această comandă este transmisă în comanda wc. Opțiunea -l (număr de linii) determină wc să numărați numărul de linii în ieșirea din comanda 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 file_count.
Linia finală folosește ecou pentru a scoate rezultatul.

Dar acest lucru funcționează numai pentru directorul „/dev”. Cum putem face ca scriptul să funcționeze cu orice director? Este nevoie doar de o mică schimbare.

Cum să utilizați parametrii liniei de comandă în scripturi

Multe comenzi, cum ar fi ls și wc, preiau parametrii liniei de comandă. Acestea oferă informații comenzii, astfel încât să știe ce doriți să facă. Dacă doriți ca ls să lucreze la directorul dvs. de acasă și de asemenea, pentru a afișa fișierele ascunse, puteți utiliza următoarea comandă, unde tilde ~ și opțiunea -a (toate) sunt parametrii de linie de comandă:

ls ~ -a

Scripturile noastre pot accepta parametrii de linie de comandă. Sunt referiți ca $1 pentru primul parametru, $2 ca al doilea și așa mai departe, până la $9 pentru al nouălea parametru. (De fapt, există și un $0, dar acesta este rezervat pentru a păstra întotdeauna scriptul.)

Puteți face referire la parametrii liniei de comandă într-un script, așa cum ați face variabilele obișnuite. Să modificăm scriptul, așa cum se arată mai jos, și să-l salvăm cu noul nume fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

De data aceasta, variabilei folder_to_count i se atribuie valoarea primului parametru de linie de comandă, $1.

Restul scenariului funcționează exact ca înainte. Mai degrabă decât o soluție specifică, scriptul dvs. este acum unul general. Îl puteți folosi în orice director, deoarece nu este codificat pentru a funcționa numai cu „/dev”.

  Fila Silențioasă întârzie încărcarea paginii în Firefox până când treceți la filă

Iată cum faci scriptul executabil:

chmod +x fcnt2.sh

Acum, încercați cu câteva directoare. Puteți face „/dev” mai întâi pentru a vă asigura că obțineți același rezultat ca înainte. Introduceți următoarele:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Obțineți același rezultat (207 fișiere) ca înainte pentru directorul „/dev”. Acest lucru este încurajator și obțineți rezultate specifice directorului pentru fiecare dintre ceilalți parametri ai liniei de comandă.

Pentru a scurta scriptul, puteți renunța cu totul la variabila folder_to_count și faceți referire doar la $1, după cum urmează:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Lucrul cu variabile speciale

Am menționat $0, care este întotdeauna setat la numele de fișier al scriptului. Acest lucru vă permite să utilizați scriptul pentru a face lucruri precum tipărirea corectă a numelui, chiar dacă este redenumit. Acest lucru este util în situațiile de logare, în care doriți să aflați numele procesului care a adăugat o intrare.

Următoarele sunt celelalte variabile speciale prestabilite:

$#: Câți parametri de linie de comandă au fost trecuți scriptului.
[email protected]: Toți parametrii liniei de comandă au fost transmise scriptului.
$?: starea de ieșire a ultimului proces care a fost rulat.
$$: ID-ul procesului (PID) al scriptului curent.
$USER: Numele de utilizator al utilizatorului care execută scriptul.
$HOSTNAME: numele de gazdă al computerului care rulează scriptul.
$SECONDS: Numărul de secunde pentru care a rulat scriptul.
$RANDOM: Returnează un număr aleatoriu.
$LINENO: Returnează numărul de linie curent al scriptului.

Vrei să le vezi pe toate într-un singur scenariu, nu-i așa? Puteți! Salvați următoarele ca fișier text numit special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: [email protected]"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Tastați următoarele pentru a-l face executabil:

chmod +x special.sh

Acum, îl puteți rula cu o grămadă de parametri diferiți ai liniei de comandă, așa cum se arată mai jos.

variabile de mediu

Bash folosește variabile de mediu pentru a defini și înregistra proprietățile mediului pe care îl creează atunci când se lansează. Aceste informații pe care Bash le poate accesa cu ușurință, cum ar fi numele dvs. de utilizator, localitatea, numărul de comenzi pe care le poate deține fișierul istoric, editorul dvs. implicit și multe altele.

Pentru a vedea variabilele de mediu active din sesiunea Bash, utilizați această comandă:

env | less

The

Dacă parcurgeți lista, s-ar putea să găsiți unele care ar fi utile pentru a le face referire în scripturile dvs.

Cum se exportă variabile

Când rulează un script, acesta se află în propriul proces, iar variabilele pe care le utilizează nu pot fi văzute în afara procesului respectiv. Dacă doriți să partajați o variabilă cu un alt script pe care îl lansează scriptul dvs., trebuie să exportați acea variabilă. Vă vom arăta cum să faceți asta cu două scripturi.

  Top 11 portofele SHIBA INU pentru a vă stoca monedele cu încredere

Mai întâi, salvați următoarele cu numele de fișier script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Aceasta creează două variabile, first_var și second_var, și atribuie unele valori. Acestea le imprimă în fereastra terminalului, exportă variabilele și apelează script_two.sh. Când script_two.sh se termină, iar fluxul de proces revine la acest script, imprimă din nou variabilele în fereastra terminalului. Apoi, puteți vedea dacă s-au schimbat.

Al doilea script pe care îl vom folosi este script_two.sh. Acesta este scriptul pe care script_one.shcalls. Introduceți următoarele:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Acest al doilea script tipărește valorile celor două variabile, le atribuie noi valori și apoi le imprimă din nou.

Pentru a rula aceste scripturi, trebuie să tastați următoarele pentru a le face executabile:

chmod +x script_one.sh
chmod +x script_two.sh

Și acum, tastați următoarele pentru a lansa script_one.sh:

./script_one.sh

Iată ce ne spune rezultatul:

script_one.sh tipărește valorile variabilelor, care sunt alpha și bravo.
script_two.sh tipărește valorile variabilelor (alpha și bravo) așa cum le-a primit.
script_two.sh le schimbă în charlie și delta.
script_one.sh tipărește valorile variabilelor, care sunt încă alpha și bravo.

Ce se întâmplă în al doilea scenariu, rămâne în al doilea scenariu. Este ca și cum copii ale variabilelor sunt trimise la al doilea script, dar sunt eliminate când acel script se iese. Variabilele originale din primul script nu sunt modificate de nimic din ceea ce se întâmplă cu copiile lor din al doilea.

Cum să cotați variabile

S-ar putea să fi observat că atunci când scripturile fac referire la variabile, acestea sunt între ghilimele „. Acest lucru permite ca variabilele să fie referite corect, astfel încât valorile lor sunt utilizate atunci când linia este executată în script.

Dacă valoarea pe care o alocați unei variabile include spații, acestea trebuie să fie între ghilimele atunci când le atribuiți variabilei. Acest lucru se datorează faptului că, în mod implicit, Bash folosește un spațiu ca delimitator.

Iată un exemplu:

site_name=How-To Geek

Bash vede spațiul dinaintea „Geek” ca un indiciu că începe o nouă comandă. Raportează că nu există o astfel de comandă și abandonează linia. echo ne arată că variabila site_name nu conține nimic, nici măcar textul „Cum se face”.

Încercați din nou cu ghilimele în jurul valorii, după cum se arată mai jos:

site_name="How-To Geek"

site_name=

De data aceasta, este recunoscut ca o singură valoare și atribuit corect variabilei site_name.

echo este prietenul tău

Poate dura ceva timp pentru a vă obișnui să înlocuiți comanda, să cotați variabilele și să vă amintiți când să includeți semnul dolarului.

Înainte de a apăsa Enter și de a executa o linie de comenzi Bash, încercați cu ecou în fața ei. În acest fel, vă puteți asigura că ceea ce se va întâmpla este ceea ce doriți. De asemenea, puteți detecta orice greșeli pe care le-ați fi făcut în sintaxă.