Bash skripty: úvod

Bash skripty: úvod
Bash skripty, časť 2: cykly
Bash skripty, časť 3: parametre a kľúče príkazového riadku
Bash skripty, časť 4: vstup a výstup
Bash skripty, časť 5: signály, pozadové úlohy, správa skriptov
Bash skripty, časť 6: funkcie a vývoj knižníc
Bash skripty, časť 7: sed a spracovanie textov
Bash skripty, časť 8: jazyk spracovania dát awk
Bash skripty, časť 9: regulárne výrazy
Bash skripty, časť 10: praktické príklady
Bash skripty, časť 11: expect a automatizácia interaktívnych nástrojov

Dnes sa budeme rozprávať o bash skriptoch. Toto je skriptovanie príkazového riadku, napísané pre shell bash. Existujú aj iné shelly, napríklad — zsh, tcsh, ksh, ale sústredíme sa na bash. Tento materiál je určený pre všetkých, ktorí sa o to zaujímajú, jedinou podmienkou je zručnosť v príkazovom riadku Linux.

Bash skripty: úvod

Príkazové skripty sú súborom tých istých príkazov, ktoré je možné zadať z klávesnice, zhromaždené do súborov a zjednotené pod spoločným cieľom. Výsledky činnosti príkazov môžu mať samostatnú hodnotu alebo slúžiť ako vstupné údaje pre ďalšie príkazy. Skripty sú mocným spôsobom automatizácie často vykonávaných úkonov.

Bash skripty: úvod

Takže, ak hovoríme o príkazovom riadku, umožňuje vykonať niekoľko príkazov naraz, zadávajúc ich cez bodkočiarku:

pwd ; whoami

V skutočnosti, ak ste to vyskúšali vo svojom termináli, váš prvý bash skript, ktorý zahŕňa dva príkazy, je už napísaný. Funguje to takto. Najprv príkaz pwd vypíše na obrazovku informácie o aktuálnom pracovnom adresári, potom príkaz whoamizobrazuje údaje o používateľovi, pod ktorým ste sa prihlásili do systému.

Použitím tohto prístupu môžete kombinovať koľko len chcete príkazov v jednom riadku, obmedzenie je len v maximálnom počte argumentov, ktoré je možné odovzdať programu. Toto obmedzenie môžete určiť pomocou takéhoto príkazu:

getconf ARG_MAX

Príkazový riadok je skvelý nástroj, ale príkazy doň je potrebné zadávať zakaždým, keď ich potrebujete. Čo keby sme zapísali súbor príkazov do súboru a jednoducho tento súbor volali na ich vykonanie? Vlastne, ten súbor, o ktorom hovoríme, sa nazýva príkazový skript.

Ako fungujú bash skripty

Vytvorte prázdny súbor pomocou príkazu touch. V prvej línii je potrebné uviesť, ktorú konkrétnu plochu chceme použiť. Zaujíma nás bash, preto bude prvá línia súboru vyzerať takto:

#!/bin/bash

V ostatných riadkoch tohto súboru sa znak mriežky používa na označenie komentárov, ktoré plocha nezpracováva. Avšak prvá línia je osobitný prípad, tu sa mriežka, za ktorou nasleduje výkričník (túto sekvenciu nazývame shebang) a cesta k bash, dávajú systému signál, že skript bol vytvorený práve pre bash.

Príkazy príkazového riadku sú oddelené znakom nového riadku, komentáre sú zvýraznené znakom mriežky. Takto to vyzerá:

#!/bin/bash
# This is a comment
pwd
whoami

Tu, rovnako ako v príkazovom riadku, možno zapisovať príkazy na jeden riadok, rozdelené bodkočiarkou. Avšak, ak budete písať príkazy na rôznych riadkoch, súbor sa lepšie číta. V každom prípade ich plocha spracuje.

Nastavenie povolení pre súbor skriptu

Uložte súbor s názvom myscript, a práca na vytvorení bash skriptu je takmer dokončená. Teraz zostáva už len spraviť tento súbor spustiteľným, inak, ak sa pokúsite ho spustiť, narazíte na chybu Permission denied.

Bash skripty: úvod
Pok attempt spustiť súbor skriptu s nesprávne nastavenými povoleniami

Spravíme súbor spustiteľným:

chmod +x .\/myscript

Teraz sa pokúsime ho vykonať:

.\/myscript

Po nastavení povolení to funguje tak, ako má.

Bash skripty: úvod
Úspešné spustenie bash skriptu

Výstup správ

Na výstup textu do konzoly Linux sa používa príkaz echo. Využijeme túto vedomosť a upravíme náš skript, pridáme vysvetlenia k údajom, ktoré už v ňom existujú:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

Tu je to, čo sa stane po spustení aktualizovaného skriptu.

Bash skripty: úvod
Výstup správ zo skriptu

Teraz môžeme uvádzať vysvetľujúce nápisy pomocou príkazu echo. Ak neviete, ako upraviť súbor pomocou Linuxu, alebo ste sa predtým nestretli s príkazom echo, pozrite sa na web materiál.

Používanie premenných

Premenné umožňujú ukladať do súboru skriptu informácie, napríklad – výsledky vykonávania príkazov na použitie inými príkazmi.

Nie je nič zlé na vykonávaní jednotlivých príkazov bez ukladania výsledkov ich vykonávania, ale možnosti takéhoto prístupu sú veľmi obmedzené.

Existujú dva typy premenných, ktoré možno použiť v bash skriptoch:

  • Premenné prostredia
  • Používateľské premenné

Premenné prostredia

Niekedy je potrebné v shellových skriptoch pracovať s určitými systémovými dátami. Napríklad, ako získať domovský adresár aktuálneho používateľa:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Všimnite si, že môžeme použiť systémovú premennú $HOME v dvojitých úvodzovkách, čo systému nebráni ju rozpoznať. Takto to bude vyzerať, ak spustíme vyššie uvedený skript.

Bash skripty: úvod
Použitie premennej prostredia v skripte

A čo ak potrebujeme na obrazovke zobraziť znak dolára? Skúsime to takto:

echo "I have $1 in my pocket"

Systém nájde znak dolára v reťazci uzavretom v úvodzovkách a rozhodne, že sme sa odvolali na premennú. Skript sa pokúsi zobraziť hodnotu neurčenej premennej $1. To nie je to, čo potrebujeme. Čo robiť?

V takej situácii pomôže použitie riadiaceho znaku, spätnej lomky, pred znakom dolára:

echo "I have $1 in my pocket"

Teraz skript zobrazí presne to, čo očakávame.

Bash skripty: úvod
Použitie riadiacej sekvencie na zobrazenie znaku dolára

Používateľské premenné

Okrem systémových premenných umožňujú bash skripty definovať a používať vo svojich skriptoch aj vlastné premenné. Tieto premenné uchovávajú hodnotu, kým sa skript nevykoná do konca.

Rovnako ako v prípade systémových premenných, k používateľským premenným môžeme pristupovať pomocou znaku dolára:
TNW-CUS-FMP - promo kód na 10% zľavu na naše služby, dostupný na aktiváciu počas 7 dní

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

Takto to bude vyzerať po spustení takého skriptu.

Bash skripty: úvod
Používateľské premenné v skripte

Substitúcia príkazov

Jednou z najužitočnejších funkcií bash skriptov je možnosť extrahovať informácie z výstupu príkazov a priradiť ich premenným, čo umožňuje používať tieto informácie kdekoľvek v súbore skriptu.

Môžeme to urobiť dvoma spôsobmi.

  • Pomocou znaku spätného apostrofu „`“
  • Pomocou konštrukcie $()

Pri použití prvej metódy dbajte na to, aby ste namiesto spätného apostrofu nezadali jednoduchú úvodzovku. Príkaz musí byť uzavretý v dvoch takýchto znakoch:

mydir=`pwd`

Pri druhej metóde sa to zapisuje takto:

mydir=$(pwd)

A skript môže nakoniec vyzerať takto:

#!/bin/bash
mydir=$(pwd)
echo $mydir

Počas jeho vykonávania bude výstup príkazu pwduložený v premennej mydir, ktorého obsah, pomocou príkazu echo, sa dostane do konzoly.

Bash skripty: úvod
Skript, ktorý ukladá výsledky príkazu do premennej

Matematické operácie

Na vykonávanie matematických operácií v skripte môžete použiť konštrukciu vo forme $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Bash skripty: úvod
Matematické operácie v skripte

Riadiaca konštrukcia if-then

V niektorých skriptoch je potrebné riadiť tok vykonávania príkazov. Napríklad, ak je nejaká hodnota väčšia ako päť, treba vykonať jednu akciu, inak inú. Takáto logika sa uplatňuje v mnohých situáciách a tu nám pomôže riadiaca konštrukcia if-then. V najjednoduchšej forme vyzerá takto:

if príkaz
then
príkazy
fi

A tu je konkrétny príklad:

#!/bin/bash
if pwd
then
echo "It works"
fi

V tomto prípade, ak vykonanie príkazu pwdúspešne skončí, do konzoly sa vypíše text „it works“.

Využijeme naše súčasné znalosti a napíšeme zloženější skript. Povedzme, že musíme nájsť určitého používateľa v /etc/passwd, a ak sa ho podarí nájsť, oznámiť, že existuje.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

Toto je výsledok po spustení tohto skriptu.

Bash skripty: úvod
Hľadanie používateľa

Tu sme použili príkaz grepna hľadanie používateľa v súbore /etc/passwd. Ak vám príkaz grepnie je známy, jeho popis nájdete tu.

V tomto príklade, ak je používateľ nájdený, skript vypíše príslušnú správu. A čo ak sa používateľa nepodarilo nájsť? V takom prípade skript jednoducho skončí, nič nám neoznámi. Chceli by sme, aby o tom tiež informoval, a preto vylepšíme kód.

Riadiaca konštrukcia if-then-else

Aby program mohol oznámiť výsledky úspešného hľadania aj neúspechu, využijeme konštrukciu if-then-else. Tu je, ako to funguje:

if príkaz
then
príkazy
else
príkazy
fi

Ak prvý príkaz vráti nulové hodnoty, čo znamená jeho úspešné vykonanie, podmienka bude pravdivá a vykonanie sa nebude riadiť vetvou else. Naopak, ak bude vrátené niečo, čo sa líši od nuly, čo bude znamenať neúspech alebo falošný výsledok, vykonajú sa príkazy umiestnené za else.

Napíšeme takýto skript:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Jeho vykonanie prešlo vetvou else.

Bash skripty: úvod
Spustenie skriptu s konštrukciou if-then-else

Pokračujeme s ďalšími otázkami ohľadom zložitých podmienok. Čo ak potrebujeme skontrolovať nie jednu, ale niekoľko podmienok? Napríklad, ak sa nájde požadovaný používateľ, mali by sme zobraziť jednu správu, ak sa splní ďalšia podmienka — ďalšiu správu, a tak ďalej. V takejto situácii nám pomôžu vnorené podmienky. Vyzerá to takto:

if príkaz1
then
príkazy
elif príkaz2
then
príkazy
fi

Ak prvý príkaz vráti nulu, čo naznačuje úspešné vykonanie, vykonajú sa príkazy v prvom bloku. then, inak, ak sa prvá podmienka ukáže ako nepravdivá a ak druhý príkaz vráti nulu, vykoná sa druhý blok kódu.

#!/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

V podobnom skripte môžeme napríklad vytvoriť nového používateľa pomocou príkazu useradd, ak hľadanie nenájde výsledky, alebo urobiť niečo iné užitočné.

Porovnávanie čísel

V skriptoch môžeme porovnávať číselné hodnoty. Nižšie je uvedený zoznam príslušných príkazov.

n1 -eq n2Vracia pravdivú hodnotu, ak n1 size / bs n2.
n1 -ge n2 Vracia pravdivú hodnotu, ak n1je väčšie alebo rovné n2.
n1 -gt n2Vracia pravdivú hodnotu, ak n1 viac n2.
n1 -le n2Vracia pravdivú hodnotu, ak n1je menšie alebo rovné n2.
n1 -lt n2Vracia pravdivú hodnotu, ak n1 je menšie ako n2.
n1 -ne n2Vracia pravdivú hodnotu, ak n1nie je rovné n2.

Ako príklad vyskúšame jeden z porovnávacích operatorov. Všimnite si, že výraz je uzavretý v hranatých zátvorkách.

#!/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

Toto je, čo táto príkaz vypíše.

Bash skripty: úvod
Porovnávanie čísel v skriptoch

Hodnota premennej val1je väčšie ako 5, nakoniec sa vykoná vetva thenporovnávacieho operatora a do konzoly sa vypíše príslušná správa.

Porovnávanie reťazcov

V scenároch môžeme porovnávať aj reťazcové hodnoty. Operatori porovnávania vyzerajú pomerne jednoducho, avšak pri operáciách porovnávania reťazcov existujú určité špecifiká, ktorým sa budeme venovať neskôr. Tu je zoznam operatorov.

str1 = str2 Kontroluje, či sú reťazce rovné, vracia pravdu, ak sú reťazce identické.
str1 != str2Vracia pravdu, ak reťazce nie sú identické.
str1 < str2Vracia pravdu, ak str1je menší ako str2.
str1 > str2 Vracia pravdu, ak str1je väčší ako str2.
-n str1 Vracia pravdu, ak dĺžka str1je väčšia ako nula.
-z str1Vracia pravdu, ak dĺžka str1je rovná nule.

Toto je príklad porovnávania reťazcov v scenári:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

Po vykonaní skriptu získame nasledujúce.

Bash skripty: úvod
Porovnávanie reťazcov v skriptoch

Existuje jedna vlastnosť porovnávania reťazcov, na ktorú sa oplatí upozorniť. A síce, operátory „>“ a „“ ako príkaz na presmerovanie výstupu.

Takto vyzerá práca s týmito operátormi v kóde:

#!/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

Toto sú výsledky vykonania skriptu.

Bash skripty: úvod
Porovnanie reťazcov, výstup varovania

Všimnite si, že skript, hoci sa vykonáva, generuje varovanie:

./myscript: riadok 5: [: príliš veľa argumentov

Aby sme sa zbavili tohto varovania, zabalíme $val2 do úvodzoviek:

#!/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

Teraz všetko funguje, ako má.

Bash skripty: úvod
Porovnávanie reťazcov

Ďalšia vlastnosť operátorov „>“ a „<“ spočíva v tom, ako pracujú so znakmi vo veľkých a malých písmenách. Aby sme túto vlastnosť pochopili, pripravíme textový súbor s takýmto obsahom:

Likegeeks
likegeeks

Uložíme ho pod názvom myfile, po čom vykonáme v termináli takýto príkaz:

sort myfile

Tento príkaz zotriedi riadky zo súboru nasledovne:

likegeeks
Likegeeks

Tím sort, predvolene zoradí riadky vzostupne, to znamená, že malé písmeno v našom príklade je menšie ako veľké. Teraz pripravíme skript, ktorý bude porovnávať tie isté reťazce:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Ak ho spustíme, zistí sa, že je to naopak — malé písmeno je teraz väčšie ako veľké.

Bash skripty: úvod
Príkaz sort a porovnanie reťazcov v skripte

V príkazoch porovnania sú veľké písmená menšie ako malé. Porovnanie reťazcov sa vykonáva porovnaním ASCII kódov znakov, poradie triedenia závisí teda od kódov znakov.

Tím sort, čím sa použije poradie triedenia určené v nastaveniach systémového jazyka.

Kontroly súborov

Možno, že nasledujúce príkazy sa používajú v bash skriptoch najčastejšie. Umožňujú kontrolovať rôzne podmienky týkajúce sa súborov. Tu je zoznam týchto príkazov.

-d fileKontroluje, či súbor existuje a či je adresárom.
-e fileKontroluje, či súbor existuje.
-f file Kontroluje, či súbor existuje a či je súborom.
-r fileKontroluje, či súbor existuje a či je prístupný na čítanie.
-s fileKontroluje, či súbor existuje a či nie je prázdny.
-w fileKontroluje, či súbor existuje a či je prístupný na zápis.
-x fileKontroluje, či súbor existuje a či je spustiteľný.
file1 -nt file2 Kontroluje, či je novší ako file1, než file2.
file1 -ot file2Kontroluje, či je starší ako file1, než file2.
-O file Kontroluje, či súbor existuje a je vlastníctvom aktuálneho používateľa.
-G fileKontroluje, či súbor existuje a jeho skupinový identifikátor zodpovedá skupinovému identifikátoru aktuálneho používateľa.

Tieto príkazy, rovnako ako mnohé ďalšie prebrané dnes, sa ľahko zapamätajú. Ich názvy, ako skratky z rôznych slov, priamo naznačujú vykonávané kontroly.

Vyskúšajme jeden z príkazov v praxi:

#!/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

Tento skript, pre existujúci adresár, vypíše jeho obsah.

Bash skripty: úvod
Výstup obsahu adresára

Predpokladáme, že s ostatnými príkazmi budete môcť experimentovať sami, všetky sa používajú rovnakým spôsobom.

Zhrnutie

Dnes sme sa venovali tomu, ako začať s písaním bash skriptov a preskúmali sme niektoré základné veci. Téma bash programovania je naozaj rozsiahla. Tento článok je prekladom prvej časti veľkej série z 11 materiálov. Ak chcete pokračovanie hneď teraz — tu je zoznam originálov týchto materiálov. Pre pohodlie je sem zahrnutý aj ten, ktorý ste práve prečítali.

  1. Bash Script Krok za Krokom — tu sa hovorí o tom, ako začať s vytváraním bash skriptov, preberá sa používanie premenných, opisujú sa podmienkové konštrukcie, výpočty, porovnávanie čísel, reťazcov, zistenie informácií o súboroch.
  2. Bash Scripting Časť 2, Bash the awesome — tu sú uvedené osobitosti práce s cyklami for a while.
  3. Bash Scripting Časť 3, Parametre & možnosti — tento materiál sa venuje parametrom príkazového riadku a kľúčom, ktoré je možné predávať skriptom, práci s údajmi, ktoré zadáva používateľ a ktoré je možné čítať zo súborov.
  4. Bash Scripting Časť 4, Vstup & výstup — tu sa hovorí o deskriptoroch súborov a o práci s nimi, o prúdoch vstupu, výstupu, chýb, o presmerovaní výstupu.
  5. Bash Scripting Časť 5, Signály & úlohy — tento materiál sa venuje signálom Linuxu, ich spracovaniu v skriptoch, spúšťaniu scénarov podľa harmonogramu.
  6. Bash Scripting Časť 6, Funkcie — tu sa môžete dozvedieť o vytváraní a používaní funkcií v skriptoch, o vývoji knižníc.
  7. Bash Scripting Časť 7, Používanie sed — tento článok je venovaný práci s textovým prúdom editorom sed.
  8. Bash Scripting Časť 8, Používanie awk — tento materiál je venovaný programovaniu v jazyku na spracovanie údajov awk.
  9. Bash Scripting Časť 9, Regulárne výrazy — tu si môžete prečítať o používaní regulárnych výrazov v bash skriptoch.
  10. Bash Scripting Časť 10, Praktické Príklady — tu sú uvedené techniky práce s správami, ktoré je možné posielať používateľom, ako aj metodika monitorovania disku.
  11. Bash Scripting Časť 11, Expect Príkaz — tento materiál je venovaný nástroju Expect, ktorý umožňuje automatizovať interakciu s interaktívnymi utilitami. Konkrétne sa tu hovorí o expect skriptoch a ich interakcii s bash skriptmi a ďalšími programami.

Domnievame sa, že jednou z cenných vlastností tejto série článkov je, že začínajúc od najjednoduchších tém, vhodných pre používateľov všetkých úrovní, postupne vedie k pomerne vážnym témam, čím dáva šancu všetkým, ktorí chcú pokročiť v tvorbe skriptov príkazového riadku Linux.

Vážení čitatelia! Prosíme guruov bash programovania, aby sa podelili o to, ako dosiahli vrcholy majstrovstva, a od tých, ktorí práve napísali svoj prvý skript, očakávame dojmy.

Bash skripty: úvod

Len registrovaní používatelia sa môžu zúčastniť prieskumu. Prihláste sa, prosím.

Prekladať ostatné časti cyklu článkov?

  • Áno!

  • Nie, netreba

Hlasovalo 1030 používateľov. Zdržalo sa 106 používateľov.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster