Dnes sa budeme rozprávať o bash skriptoch. Toto je , 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 Linux.
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.
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_MAXPrí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 ) 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
whoamiTu, 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.

Pok attempt spustiť súbor skriptu s nesprávne nastavenými povoleniami
Spravíme súbor spustiteľným:
chmod +x .\/myscriptTeraz sa pokúsime ho vykonať:
.\/myscriptPo nastavení povolení to funguje tak, ako má.

Ú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:"
whoamiTu je to, čo sa stane po spustení aktualizovaného skriptu.

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 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.

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.

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.

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.

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 
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
fiA 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"
fiToto je výsledok po spustení tohto skriptu.

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 .
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.

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, akn1size / bsn2.
n1 -ge n2Vracia pravdivú hodnotu, akn1je väčšie alebo rovnén2.
n1 -gt n2Vracia pravdivú hodnotu, akn1viacn2.
n1 -le n2Vracia pravdivú hodnotu, akn1je menšie alebo rovnén2.
n1 -lt n2Vracia pravdivú hodnotu, ak n1 je menšie akon2.
n1 -ne n2Vracia pravdivú hodnotu, akn1nie 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"
fiToto je, čo táto príkaz vypíše.

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 = str2Kontroluje, či sú reťazce rovné, vracia pravdu, ak sú reťazce identické.
str1 != str2Vracia pravdu, ak reťazce nie sú identické.
str1 < str2Vracia pravdu, akstr1je menší akostr2.
str1 > str2Vracia pravdu, akstr1je väčší akostr2.
-n str1Vracia pravdu, ak dĺžkastr1je väčšia ako nula.
-z str1Vracia pravdu, ak dĺžkastr1je 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"
fiPo vykonaní skriptu získame nasledujúce.

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"
fiToto sú výsledky vykonania skriptu.

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"
fiTeraz všetko funguje, ako má.

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 myfileTento 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"
fiAk ho spustíme, zistí sa, že je to naopak — malé písmeno je teraz väčšie ako veľké.

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 fileKontroluje, č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 file2Kontroluje, či je novší akofile1, nežfile2.
file1 -ot file2Kontroluje, či je starší akofile1, nežfile2.
-O fileKontroluje, č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"
fiTento skript, pre existujúci adresár, vypíše jeho obsah.

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.
- — 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.
- — tu sú uvedené osobitosti práce s cyklami for a while.
- — 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.
- — 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.
- — tento materiál sa venuje signálom Linuxu, ich spracovaniu v skriptoch, spúšťaniu scénarov podľa harmonogramu.
- — tu sa môžete dozvedieť o vytváraní a používaní funkcií v skriptoch, o vývoji knižníc.
- — tento článok je venovaný práci s textovým prúdom editorom sed.
- — tento materiál je venovaný programovaniu v jazyku na spracovanie údajov awk.
- — tu si môžete prečítať o používaní regulárnych výrazov v bash skriptoch.
- — tu sú uvedené techniky práce s správami, ktoré je možné posielať používateľom, ako aj metodika monitorovania disku.
- — 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.
Len registrovaní používatelia sa môžu zúčastniť prieskumu. , 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
