Како радити са променљивим у Басху

Promenljive su ključni element u kreiranju skripti i razumevanju kako kod koji preuzimate sa interneta funkcioniše na vašem Linux sistemu. U ovom članku ćemo vas upoznati sa osnovnim konceptima.

Šta su promenljive?

Promenljive su simboli koji imaju određeno ime i predstavljaju niz karaktera (string) ili numeričku vrednost. Kada se koriste u naredbama i izrazima, one se ponašaju kao da ste umesto naziva promenljive upisali vrednost koju ona sadrži.

Da biste kreirali promenljivu, potrebno je samo da definišete njeno ime i vrednost. Imena promenljivih trebaju biti opisna, tako da vas podsećaju na podatke koje čuvaju. Ime promenljive ne sme počinjati brojem ili sadržavati razmake, ali može početi donjom crtom. Takođe, možete koristiti bilo koju kombinaciju alfanumeričkih znakova (velikih i malih slova).

Primeri definisanja promenljivih

U nastavku ćemo kreirati pet različitih promenljivih. Format je sledeći: upišete ime, zatim znak jednakosti (=), a zatim vrednost. Važno je napomenuti da ne sme biti razmaka pre ili posle znaka jednakosti. Postupak dodeljivanja vrednosti promenljivoj se naziva dodeljivanje vrednosti.

Kreiraćemo četiri string promenljive i jednu numeričku:

ime=Petar
omiljeni_os=Linux
junak=Supermen
omiljena_hrana=Kriptonit
godina=2024

Da biste prikazali vrednost koja se nalazi u promenljivoj, koristite naredbu `echo`. Prilikom referenciranja vrednosti promenljive, njenom imenu morate prethoditi znakom dolara ($), kao što je prikazano ispod:

echo $ime
echo $omiljeni_os
echo $godina

Hajde da upotrebimo sve naše promenljive u jednom izrazu:

echo "$omiljeni_os je za $ime kao $omiljena_hrana za $junak (c) $godina"

Vrednosti promenljivih zamenjuju njihova imena. Takođe, možete promeniti vrednost promenljive. Da biste dodelili novu vrednost promenljivoj `omiljeni_os`, jednostavno ponovite postupak koji ste koristili pri prvom dodeljivanju vrednosti, na primer:

omiljeni_os=Votka

Ako sada ponovo pokrenete prethodnu naredbu, dobićete drugačiji rezultat:

echo "$omiljeni_os je za $ime kao $omiljena_hrana za $junak (c) $godina"

Dakle, možete koristiti istu naredbu koja se odnosi na iste promenljive, ali dobiti različite rezultate ako promenite vrednosti koje se nalaze u promenljivima.

Kasnije ćemo govoriti o navodnicima. Za sada zapamtite sledeće:

  • Promenljiva u jednostrukim navodnicima ‘ se tretira kao doslovni string, a ne kao promenljiva.
  • Promenljive u dvostrukim navodnicima “ se tretiraju kao promenljive.
  • Da biste dobili vrednost koja se čuva u promenljivoj, morate da navedete znak dolara $.
  • Promenljiva bez znaka dolara $ daje samo ime promenljive.

Takođe, možete kreirati promenljivu koja uzima svoju vrednost iz postojeće promenljive ili kombinacije promenljivih. Sledeća naredba definiše novu promenljivu pod nazivom `omiljeno_pice_godine` i dodeljuje joj kombinovane vrednosti promenljivih `omiljeni_os` i `godina`:

omiljeno_pice_godine="$omiljeni_os $godina"
echo $omiljeno_pice_godine

Upotreba promenljivih u skriptama

Skripte bi bile veoma ograničene bez promenljivih. Promenljive obezbeđuju fleksibilnost koja čini skriptu opštom, umesto da bude specijalizovano rešenje. Da bismo ilustrovali razliku, evo skripte koja broji datoteke u `/dev` direktorijumu:

Unesite sledeći kod u tekstualnu datoteku i sačuvajte je kao `broj_datoteka.sh` (za „broj datoteka“):

#!/bin/bash

direktorijum_za_brojanje=/dev

broj_datoteka=$(ls $direktorijum_za_brojanje | wc -l)

echo $broj_datoteka datoteka u $direktorijum_za_brojanje

Pre pokretanja skripte, morate je učiniti izvršnom, kao što je prikazano ispod:

chmod +x broj_datoteka.sh

Upišite sledeće da biste pokrenuli skriptu:

./broj_datoteka.sh

Ovo ispisuje broj datoteka u `/dev` direktorijumu. Evo kako to funkcioniše:

Definisana je promenljiva pod nazivom `direktorijum_za_brojanje` i postavljena je da sadrži string „/dev“.
Definisana je druga promenljiva, nazvana `broj_datoteka`. Ova promenljiva uzima svoju vrednost iz zamene naredbe. To je naredbeni izraz unutar zagrada $( ). Obratite pažnju na znak dolara $ ispred prve zagrade. Ova konstrukcija $( ) izvršava naredbe unutar zagrada, a zatim vraća njihovu konačnu vrednost. U ovom primeru, ta vrednost je dodeljena promenljivoj `broj_datoteka`. Što se tiče promenljive `broj_datoteka`, njoj je prosleđena vrednost koju treba da čuva; ona ne brine o tome kako je ta vrednost dobijena.
Komanda koja se izvršava u zameni naredbe izvodi `ls` listu datoteka u direktorijumu u promenljivoj `direktorijum_za_brojanje`, koja je postavljena na „/dev“. Dakle, skripta izvršava naredbu `ls /dev`.
Izlaz iz ove naredbe se prosleđuje naredbi `wc`. Opcija `-l` (broj linija) uzrokuje da `wc` broji redove u izlazu naredbe `ls`. Pošto je svaka datoteka navedena u posebnom redu, ovo je broj datoteka i poddirektorijuma u „/dev“ direktorijumu. Ova vrednost je dodeljena promenljivoj `broj_datoteka`.
Poslednja linija koristi `echo` za ispis rezultata.

Međutim, ovo radi samo za direktorijum `/dev`. Kako možemo napraviti da skripta radi sa bilo kojim direktorijumom? Potrebna je samo mala izmena.

Korišćenje parametara komandne linije u skriptama

Mnoge naredbe, kao što su `ls` i `wc`, prihvataju parametre komandne linije. Oni pružaju informacije naredbi, tako da ona zna šta želite da uradi. Ako želite da `ls` radi u vašem kućnom direktorijumu i da takođe prikaže skrivene datoteke, možete koristiti sledeću naredbu, gde su tilda `~` i `-a` (all) opcija parametri komandne linije:

ls ~ -a

Naše skripte takođe mogu prihvatiti parametre komandne linije. Oni se referenciraju kao `$1` za prvi parametar, `$2` za drugi, i tako dalje do `$9` za deveti parametar. (Zapravo postoji i `$0`, ali to je rezervisano i uvek sadrži ime skripte.)

Parametre komandne linije možete referencirati u skripti baš kao i obične promenljive. Hajde da modifikujemo našu skriptu, kao što je prikazano ispod, i sačuvamo je pod novim imenom `broj_datoteka2.sh`:

#!/bin/bash

direktorijum_za_brojanje=$1

broj_datoteka=$(ls $direktorijum_za_brojanje | wc -l)

echo $broj_datoteka datoteka u $direktorijum_za_brojanje

Ovog puta je promenljivoj `direktorijum_za_brojanje` dodeljena vrednost prvog parametra komandne linije, `$1`.

Ostatak skripte radi potpuno isto kao i ranije. Umesto specijalizovanog rešenja, vaša skripta je sada generalna. Možete je koristiti u bilo kom direktorijumu, jer više nije fiksirana na `/dev`.

Evo kako da učinite skriptu izvršnom:

chmod +x broj_datoteka2.sh

Sada isprobajte sa nekoliko direktorijuma. Prvo možete koristiti `/dev` da biste bili sigurni da dobijate isti rezultat kao i ranije. Ukucajte sledeće:

./broj_datoteka2.sh /dev
./broj_datoteka2.sh /etc
./broj_datoteka2.sh /bin

Dobijate isti rezultat (broj datoteka) kao ranije za direktorijum `/dev`. Ovo je ohrabrujuće, a dobijate i specifične rezultate za svaki od ostalih parametara komandne linije.

Da biste skratili skriptu, možete se potpuno osloboditi promenljive `direktorijum_za_brojanje` i samo referencirati `$1` u celini, na sledeći način:

#!/bin/bash

broj_datoteka=$(ls $1 | wc -l)

echo $broj_datoteka datoteka u $1

Rad sa specijalnim promenljivama

Spomenuli smo `$0`, koja je uvek postavljena na ime datoteke skripte. To vam omogućava da koristite skriptu za stvari kao što je pravilno ispisivanje njenog imena, čak i ako je preimenovana. Ovo je korisno u situacijama evidentiranja gde želite da znate ime procesa koji je dodao unos.

Sledeće su druge posebne unapred definisane promenljive:

  • `$#`: Broj parametara komandne linije koji su prosleđeni skripti.
  • `$@`: Svi parametri komandne linije prosleđeni skripti.
  • `$?:` Izlazni status poslednjeg pokrenutog procesa.
  • `$$`: ID procesa (PID) trenutne skripte.
  • `$USER`: Korisničko ime korisnika koji izvršava skriptu.
  • `$HOSTNAME`: Ime računara na kojem se skripta izvršava.
  • `$SECONDS`: Broj sekundi koliko skripta radi.
  • `$RANDOM`: Vraća nasumičan broj.
  • `$LINENO`: Vraća trenutni broj linije u skripti.

Želite da ih sve vidite u jednom scenariju, zar ne? Možete! Sačuvajte sledeći tekst u datoteku `specijalno.sh`:

#!/bin/bash

echo "Broj parametara komandne linije: $#"
echo "Parametri: $@"
echo "Prvi parametar je: $1"
echo "Skripta se zove: $0"
# bilo koji stari proces da bismo mogli izvestiti o izlaznom statusu
pwd
echo "pwd je vratila $?"
echo "ID procesa ove skripte je $$"
echo "Skriptu je pokrenuo korisnik $USER"
echo "Skripta se izvršava na računaru $HOSTNAME"
sleep 3
echo "Skripta se izvršava $SECONDS sekundi"
echo "Nasumičan broj: $RANDOM"
echo "Ovo je linija broj $LINENO skripte"

Unesite sledeće da biste je učinili izvršnom:

chmod +x specijalno.sh

Sada je možete pokrenuti sa mnogo različitih parametara komandne linije, kao što je prikazano ispod.

Promenljive okruženja

Bash koristi promenljive okruženja da definiše i zabeleži svojstva okruženja koje kreira prilikom pokretanja. Bash ima jednostavan pristup ovim informacijama, kao što su vaše korisničko ime, lokalizacija, broj komandi koje vaša datoteka istorije može da zadrži, vaš podrazumevani uređivač i još mnogo toga.

Da biste videli aktivne promenljive okruženja u vašoj Bash sesiji, koristite sledeću naredbu:

env | less

Ako skrolujete kroz listu, možda ćete pronaći neke na koje bi bilo korisno da se pozovete u svojim skriptama.

Kako izvesti promenljive

Kada se skripta pokrene, ona se nalazi u sopstvenom procesu, a promenljive koje koristi nisu vidljive izvan tog procesa. Ako želite da delite promenljivu sa drugom skriptom koju vaša skripta pokreće, morate izvesti tu promenljivu. Pokazaćemo vam kako da to uradite pomoću dve skripte.

Prvo sačuvajte sledeće u datoteku `skripta_jedan.sh`:

#!/bin/bash

prva_promenljiva=alfa
druga_promenljiva=bravo

# provera njihovih vrednosti
echo "$0: prva_promenljiva=$prva_promenljiva, druga_promenljiva=$druga_promenljiva"

export prva_promenljiva
export druga_promenljiva

./skripta_dva.sh

# ponovna provera njihovih vrednosti
echo "$0: prva_promenljiva=$prva_promenljiva, druga_promenljiva=$druga_promenljiva"

Ovo kreira dve promenljive, `prva_promenljiva` i `druga_promenljiva`, i dodeljuje im neke vrednosti. Ispisuje ih u terminal, izvozi promenljive, i poziva `skripta_dva.sh`. Kada se `skripta_dva.sh` završi i kontrola se vrati ovoj skripti, ona ponovo ispisuje promenljive u terminal. Na taj način možete videti da li su se promenile.

Druga skripta koju ćemo koristiti je `skripta_dva.sh`. To je skripta koju `skripta_jedan.sh` poziva. Ukucajte sledeće:

#!/bin/bash

# provera njihovih vrednosti
echo "$0: prva_promenljiva=$prva_promenljiva, druga_promenljiva=$druga_promenljiva"

# postavljanje novih vrednosti
prva_promenljiva=carlie
druga_promenljiva=delta

# ponovna provera njihovih vrednosti
echo "$0: prva_promenljiva=$prva_promenljiva, druga_promenljiva=$druga_promenljiva"

Ova druga skripta ispisuje vrednosti dve promenljive, dodeljuje im nove vrednosti, a zatim ih ponovo ispisuje.

Da biste pokrenuli ove skripte, morate ih učiniti izvršnim, na sledeći način:

chmod +x skripta_jedan.sh
chmod +x skripta_dva.sh

A sada unesite sledeće da biste pokrenuli `skripta_jedan.sh`:

./skripta_jedan.sh

Evo šta nam izlaz govori:

  • `skripta_jedan.sh` ispisuje vrednosti promenljivih, a to su alfa i bravo.
  • `skripta_dva.sh` ispisuje vrednosti promenljivih (alfa i bravo) onako kako ih je primila.
  • `skripta_dva.sh` ih menja u charlie i delta.
  • `skripta_jedan.sh` ispisuje vrednosti promenljivih, koje su i dalje alfa i bravo.

Ono što se dešava u drugoj skripti, ostaje u toj drugoj skripti. To je kao da se kopije promenljivih šalju drugoj skripti, ali se odbacuju kada ta skripta završi. Originalne promenljive u prvoj skripti se ne menjaju ničim što se dešava sa njihovim kopijama u drugoj skripti.

Navođenje promenljivih

Možda ste primetili da su promenljive, kada se na njih referenciraju skripte, okružene dvostrukim navodnicima „“. Ovo omogućava da se promenljive pravilno referenciraju, tako da se njihove vrednosti koriste kada se linija izvršava u skripti.

Ako vrednost koju dodeljujete promenljivoj uključuje razmake, ti razmaci moraju biti pod navodnicima kada ih dodeljujete promenljivoj. To je zato što Bash podrazumevano koristi razmak kao graničnik.

Evo primera:

ime_sajta=Kako da Geek

Bash razmak ispred „Geek“ vidi kao indikaciju da počinje nova naredba. On javlja da ne postoji takva naredba i napušta liniju. `echo` nam pokazuje da promenljiva `ime_sajta` ne sadrži ništa, čak ni tekst „Kako da“.

Pokušajte ponovo sa navodnicima oko vrednosti, kao što je prikazano ispod:

ime_sajta="Kako da Geek"

Ovog puta je vrednost prepoznata kao jedinstvena i ispravno je dodeljena promenljivoj `ime_sajta`.

`echo` je tvoj prijatelj

Možda će vam trebati neko vreme da se naviknete na zamenu naredbi, navođenje promenljivih i da zapamtite kada treba da uključite znak dolara.

Pre nego što pritisnete Enter i izvršite liniju Bash naredbi, pokušajte da dodate `echo` ispred nje. Na taj način možete biti sigurni da će se dogoditi ono što želite. Takođe možete otkriti sve greške koje ste možda napravili u sintaksi.