2. diel - Skriptovanie v Bashi - premenné
V predchádzajúcej lekcii sme si vysvetlili rozdiel medzi kompilovaným a skriptovacím jazykom. Naučili sme si, na čo môžeme využiť Bash a napísali si prvý skript.
V tomto tutoriále skriptovania v Bashi si vysvetlíme, čo je to premenná, ako s ňou pracovať, a na čo ju pri skriptovaní budeme potrebovať.
Čo je to premenná
Premenná je miesto v pamäti, ktorému priradíme nejakú hodnotu. Na rozdiel od matematiky, kde premenná je časť rovnice alebo vzorca, v programovaní môžeme jednu premennú, resp. hodnotu v nej uchovávanú, použiť na niekoľkých miestach programu alebo aj v niekoľkých programoch.
A to je presne ten dôvod, prečo chceme v programovaní používať premenné. Ľudia sú od prírody leniví a hľadajú cesty, ako si uľahčiť, urýchliť a zefektívniť prácu. Nemusíme hovoriť počítaču, čo má urobiť zakaždým, keď to potrebujeme. Môžeme túto informáciu uchovať napr. v premennej a celý proces si následne zautomatizovať.
Priblížime si to na príklade. Máme program, ktorý po spustení vypíše uvítaciu vetu s menom prihláseného užívateľa:
Vítej uživateli ITnetwork!
Jednou z variant riešení je toto meno napísať ručne pre každého
užívateľa zvlášť. Je to prakticky nemožná úloha, pretože by sme museli
pre každého používateľa napísať vlastný program. Výrazne
použiteľnejším variantom je vytvoriť miesto v pamäti
(premennú) pomenovanú napr. UŽIVATEL
, ktoré budeme
priraďovať ako hodnotu meno práve
prihláseného užívateľa:
UŽIVATEL=ITnetwork #k této proměnné se přiřadí jméno právě přihlášeného uživatele
Namiesto mena užívateľa potom napíšeme do vety názov premennej. V tej chvíli je nám jedno, kto práve spustil program, pretože sa vždy použije to správne meno.
Hodnota premennej UŽIVATEL
sa v pamäti udrží len
pokiaľ program beží. Toto je veľmi dôležité. Ak by premenné
zostávali uchované v pamäti počítača aj po ukončení programu, za
chvíľku by sme mali pamäť plnú a počítač by prestal fungovať.
Systémové premenné
V Linuxe sa budeme často stretávať s tzv. systémovými premennými. Sú
to premenné pracujúce na úrovni operačného systému. Často slúži na jeho
správnu funkčnosť. Najprv si vypíšeme do terminálu všetky naše
systémové premenné príkazom printenv
:
itnetwort@itnetwork:~$ printenv SHELL=/bin/bash HOME=/home/itnetwork LANG=en_US.UTF-8 USER=itnetwork PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games …
Každý riadok začína názvom premennej, nasleduje =
ako znak
priradenia a hodnota, ktorá je premennej priradená. Napr. premennej
USER
je priradená hodnota názvu nášho užívateľského účtu,
v tomto prípade itnetwork
. Skúsime si túto hodnotu rovno
vypísať do konzoly. Pred názov napíšeme znak dolára $
. Tým
povieme shellu, že máme na mysli premenou:
itnetwort@itnetwork:~$ echo “Vítej uživateli $USER!” Vítej uživateli itnetwork!
Rovnako tak môžeme použiť premennú aj v skripte:
itnetwort@itnetwork:~$ touch pozdrav.sh itnetwort@itnetwork:~$ echo “echo Vítej uživateli $USER!” >> pozdrav.sh itnetwort@itnetwork:~$ bash script.sh Vítej uživateli itnetwork!
V príklade sme nenapísali príkaz do skriptu cez textový editor, ale
pomocou echo
. Príkazom echo
s presmerovaním výstupu
pomocou >>
, vložíme nový riadok na koniec skriptu. Je to
ďalšia možnosť, ako si môžeme zefektívniť prácu, prípadne ako
zapisovať skriptom do iného súboru.
Nesmieme ale zameniť >>
iba za jeden
>
, ktorý by obsah celého nášho skriptu prepísal.
Export
Môže sa stať, že jednu hodnotu potrebujeme použiť vo viacerých
skriptoch. V každom skripte by sme si mohli vytvoriť premennú s touto
hodnotou, ale to nie je efektívne. Ak by sme potom potrebovali túto hodnotu
nahradiť inú, museli by sme ju prepísať v každom skripte zvlášť.
Namiesto toho si vytvoríme novú systémovú premennú. K nej potom budú
môcť pristupovať všetky programy. Slúži na to príkaz
export
:
itnetwort@itnetwork:~$ export CINNOST=”Učím se skriptovat v Bashi.”
Po vypísaní premenného prostredia príkazom printenv
uvidíme
v zozname nami novo vytvorenú premennú. Môžeme si ju skúsiť vypísať do
terminálu:
itnetwort@itnetwork:~$ echo $CINNOST Učím se skriptovat v Bashi.
Vytvorenie premennej by rovnako tak fungovalo aj bez použitia
export
. Avšak bolo by platné iba pre aktuálne prihláseného
užívateľa. Ak by sme sa prihlásili ako root
, premenná by už
nefungovala. Novo vytvorená systémová premenná platí iba pre aktuálny
shell a vypnutím systému zanikne.
Zmena systémovej premennej
Príkazom export môžeme tiež prepísať hodnotu systémovej premennej.
Povedzme, že by sme potrebovali spúšťať náš skript v domovskom adresári
z rôznych miest nášho systému. Pokiaľ nechceme zakaždým písať celú
cestu ku skriptu, potrebujeme zapísať novú cestu do systémovej premennej
PATH
. Do tejto premennej sa zapisujú cesty a Linux sa sem pozerá
vždy, keď zadáme príkaz do terminálu. V prípade, že tento program na
jednej z ciest nájde, spustí ho. V opačnom prípade vráti chybu
command not found
.
Vytvoríme si nový skript s pozdravom v dokumentoch nášho domovského adresára a pridáme mu práva na spustenie. Môžeme spojiť príkazy v jeden pomocou tzv pipe (pajpy):
itnetwort@itnetwork:~$ touch $HOME/Dokumenty/pozdrav.sh | echo "echo Vítej uživateli $USER!" >> $HOME/Documenty/pozdrav.sh | chmod u+x $HOME/Documenty/pozdrav.sh
Keď sa teraz presunieme do základnej štruktúry príkazom
cd /
a skúsime spustiť náš script zadaním jeho názvu, shell
nám vráti chybu, že príkaz nepozná. Musíme teda pridať cestu do premennej
PATH
:
itnetwort@itnetwork:~$ export PATH=$PATH:/home/itnetwork/Dokumenty
Príkazom export
sme vytvorili novú premennú s už
existujúcim názvom PATH
. Tým sme prepísali tú pôvodnú. Ako
novú hodnotu sme zvolili pôvodnú hodnotu a navyše k nej pridali ďalšiu
cestu. Každá cesta v PATH
je oddelená dvojbodkou:
itnetwort@itnetwork:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/itnetwork/Dokumenty
Teraz môžeme spúšťať skript jednoduchým zadaním jeho názvu z akéhokoľvek miesta systému. Ako sme si už povedali, premenná zostáva v pamäti iba do doby, kým program skončí. V tomto prípade do vypnutia systému.
Skript môže spúšťať iba užívateľ, ktorý má na to oprávnenie. V našom prípade iba vlastník.
Premenné v skripte
Teraz si ukážeme, ako pracovať s premennou priamo v skripte. Funguje to
prakticky rovnako ako pri systémovej premennej, len nie je potrebný príkaz
export
. Použiť ju však môžeme iba vo vnútri skriptu:
#!/bin/bash JMENO=ITnetwork echo “Hodnota proměnné JMENO je $JMENO.”
Veľké písmená v názvoch premenných nie sú povinné. Rovnako tak budú fungovať aj malé písmená. Avšak z hľadiska lepšej čitateľnosti kódu je dobré túto konvenciu zachovať. Pozor, Bash je tzv. case sensitive. To znamená, že zápisy názvov premenných JMENO a Meno sú rôzne:
#!/bin/bash JMENO=ITnetwork Jmeno=Linux echo “Hodnota proměnné JMENO je $JMENO.” echo “Hodnota proměnné Jmeno je $Jmeno.”
Hodnotu, ktorú premenné priradíme môžeme ďalej v kóde prepisovať:
#!/bin/bash JMENO=ITnetwork echo “Hodnota proměnné JMENO je $JMENO.” JMENO=David echo “Hodnota proměnné JMENO je $JMENO.”
Po spustení skriptu získame tento výstup:
itnetwort@itnetwork:~$ bash script.sh
Hodnota proměnné JMENO je ITnetwork.
Hodnota proměnné JMENO je David.
Ako hodnotu môžeme priradiť aj inú premennú:
#!/bin/bash JMENO1 = ITnetwork JMENO2 = $JMENO1 echo "Hodnota proměnné JMENO2 je $JMENO2." >>>>> itnetwort@itnetwork:~$ bash script.sh Hodnota proměnné JMENO2 je ITnetwork.
Zakázané názvy premenných
Ako už vieme, názov premennej môže obsahovať veľké aj malé písmená. Pre lepšiu čitateľnosť je lepšie voliť veľké písmená. Názov môže obsahovať aj čísla:
Jmeno1=ITnetwork #Toto je zcela legitimní způsob zápisu.
Problém nastáva vo chvíli, keď premenná začína číslicou, po ktorej
nasledujú písmená. Takýto názov Bash neuzná. Ďalej nie sú povolené
špeciálne znaky. Jediný povolený znak je _
:
1UZIVATEL=ITnetwork #neplatný název proměnné JMENO-UZIVATELE=ITnetvork #neplatný název proměnné JMENO_UZIVATELE=ITnetwork #platný název proměnné
Teraz teda ovládame základnú prácu s premennými. V ďalších lekciách tieto znalosti často využijeme.
V budúcej lekcii si ukážeme, ako si vyžiadať vstup od užívateľa a ako tento vstup použiť ďalej v skripte. Tiež sa naučíme základné matematické operácie v Bashi.