Tento kurz popisuje, jak můžete snadno psát vlastní skripty Bash v Linuxu.
Jako správce systému pravděpodobně provádíte opakující se úlohy, které by mohly být automatizovány.
Naštěstí pro vás existuje programovací jazyk, který lze v Linuxu použít k psaní skriptů : programovací jazyk Bash.
Pomocí jazyka Bash můžete plánovat zálohování celého systému zadáním libovolného počtu příkazů ve skriptech Bash.
Můžete mít také vlastní skripty, které vytvářejí a odstraňují uživatele a odstraňují s nimi spojené soubory.
Pomocí jazyka Bash můžete také nechat spouštět skripty a vypisovat užitečné metriky výkonu do souboru nebo databáze.
Bash je velmi výkonný programovací jazyk pro správce systému.
V dnešním kurzu se naučíme všechny základy, které je třeba znát o jazyku Bash : jak vytvářet a spouštět skripty, jak efektivně používat proměnné a vestavěné prvky shellu.
Obsah
- Co se dozvíte
- Začínáme s nástrojem Bash
- Historie nástroje Bash
- Programovací jazyk Bash
- Vytváření a spouštění skriptů Bash
- Zadání shellu pomocí shebang
- Spustit skripty Bash
- Zadáním interpretu shellu
- Zadání cesty ke skriptu
- Přidání skriptu do PATH
- Vestavěné prvky shellu vysvětleny
- Používání proměnných Bash
- Vykonávání příkazů uvnitř skriptů
- Pochopení stavů ukončení
- Manipulace s podmínkami v bashi
- Praktický případ : kontrola, zda je uživatel root
- Závěr
Co se dozvíte
Pokud si tento tutoriál přečtete až do konce, dozvíte se o následujících pojmech týkajících se Bash
- Jak vytvářet a spouštět skripty Bash pomocí příkazového řádku;
- Co je to shebang a jak jej Linux používá pro skriptování;
- Co jsou vestavěné programy shellu a jak se liší od běžných systémových programů;
- Jak používat proměnné Bash a co jsou to speciální proměnné;
- Jak používat nahrazování příkazů Bash;
- Jak používat jednoduché příkazy IF v systému Bash;
Jak vidíte, jedná se o poměrně dlouhý program, takže bez dalších řečí začneme tím, jak můžete vytvářet a spouštět skripty Bash.
Začínáme s nástrojem Bash
Před vydáváním jakýchkoli příkazů si řekněme pár slov o společné historii nástrojů Bash a Shell.
Historie nástroje Bash
První verzi shellu Bash vydal v roce 1989 Brian Fox a jedná se o open-source implementaci unixového shellu.
V té době, kdy začaly vznikat unixové systémy, používaly tyto systémy standardní unixové shelly s názvem Bourne shells.
V počátcích Unixu nebyly systémy vyvinuté společnostmi jako MIT nebo Bell Labs svobodné a nebyly open-source.
I když byla k těmto nástrojům poskytována dokumentace, stalo se prioritou iniciativy GNU (vedené Richardem Stallmanem) mít vlastní verzi unixového shellu.
Šest let po oznámení projektu GNU vznikl shell Bash (Bourne-Again Shell), který má ještě více funkcí než původní shell Bourne.
Programovací jazyk Bash
Při práci se systémem podobným Unixu, jako je Linux, má Bash obvykle dva významy :
- Bash je interpret příkazového řádku nebo jinými slovy unixový shell. To znamená, že kdykoli otevřete terminál, budete mít před sebou unixový shell, kterým je většinou shell Bash.
Při zadávání příkazů přímo v terminálu jsou příkazy interpretovány shellem, provedeny pomocí systémových volání a koncovému uživateli jsou vráceny návratové hodnoty.
Pokud si nejste jisti aktuálním interpretem, který používáte, proměnná prostředí SHELL ukazuje, který shell právě používáte.
$ printenv SHELL
Jak vidíte, v tomto případě správně používáme k práci interpret příkazů Bash.
Je důležité si uvědomit, že i když se termíny jako „skriptování v prostředí Bash“ a „skriptování v prostředí Shell“ používají zaměnitelně, nemusí ve skutečnosti popisovat totéž v závislosti na vaší distribuci.
Některé novější distribuce (například Debian 10) mají symbolické odkazy z původního Bourneova shellu (pojmenovaného sh) na vlastní implementaci shellu (v tomto případě Dash nebo Debian Almquist shell)
- Bash také popisuje jazyk příkazového řádku a označuje se také jako jazyk Bash. Bash vystavuje sadu operátorů a operandů, které lze použít za účelem získání některých základních funkcí, jako je piping nebo provádění více příkazů najednou.
Při provádění některých základních pipingů jste zvyklí pracovat se symbolem „|“. Tento symbol je součástí jazyka příkazového řádku Bash.
Stejná logika platí i pro symbol „&&“, který provede druhý příkaz tehdy a pouze tehdy, pokud první příkaz uspěl.
$ command1 && command2
Vytváření a spouštění skriptů Bash
Teď, když už máte nějaké základní informace o shellu Bash a jazyku příkazového řádku Bash, začneme vytvářením a spouštěním jednoduchých skriptů Bash.
Chcete-li vytvořit svůj první skript Bash, jednoduše vytvořte soubor s názvem „script.sh“.
Jak jste si již pravděpodobně všimli, stále používáme příponu „sh“ odkazující na původní shell Bourne (označovaný také jako sh).
$ touch script.sh
Nyní vytvoření souboru končícího příponou „sh“ nestačí k tomu, aby byl váš skript považován za shellový skript.
O tom, že váš soubor ještě není považován za shellový skript, se skutečně můžete přesvědčit spuštěním příkazu file.
$ file script.sh
Jak vidíte, váš soubor je zde popsán pouze jako prostý prázdný soubor.
Aby byl váš soubor popsán jako soubor shellového skriptu, musíte na začátku souboru zadat řádek shebang.
Zadání shellu pomocí shebang
Pokud používáte Linux již delší dobu, je velmi pravděpodobné, že jste se s řádkem shebang na začátku souboru již setkali.
Shebang, zkratka pro „Hash + „Bang“, je jednořádkový řádek nastavený na začátek skriptů shellu za účelem určení, který shell má být použit pro interpretaci tohoto skriptu.
#!/bin/<shell>
V našem případě chceme pracovat se skripty Bash. Jinými slovy, chceme, aby naše skripty interpretoval interpret Bash.
Pro určení cesty k interpretu můžete použít příkaz „which“.
$ which bash/bin/bash
Teď, když znáte cestu k interpretu, upravte soubor se skriptem a přidejte řádek shebang na začátek souboru.
#!/bin/bash
Teď, když jste přidali tento řádek na začátek svého souboru, spusťte znovu příkaz „file“, abyste viděli rozdíl.
Jak vidíte, výstup je trochu jiný : tentokrát je váš skript viděn jako „Bourne-Again shell skript“ a hlavně jako spustitelný soubor.
Co by se tedy stalo, kdybyste na začátku skriptu neuvedli řádek shebang.
Pokud neuvedete řádek shebang, skript se spustí pomocí aktuálního shellu použitého pro spuštění příkazu execute.
Teď, když víte, jak vytvářet skripty Bash, se podíváme, jak je můžete spouštět.
Spustit skripty Bash
Pro spuštění skriptů Bash v systému Linux máte v zásadě dvě možnosti :
- Zadáním interpretu shellu, který chcete použít, a souboru skriptu;
- Pomocí cesty k souboru skriptu
Zadáním interpretu shellu
První způsob je celkem jednoduchý.
Pro spuštění skriptu bash sami určíte interpret, který chcete použít.
$ bash <script>$ /bin/bash <script>
Podle příkladu, který jsme použili dříve, bychom získali následující výstup.
Jak vidíte, tato metoda ani nevyžaduje oprávnění ke spuštění souboru, stačí mít možnost použít spustitelný soubor bash.
Jak vidíte, i když jsem přihlášen jako jiný uživatel, bez práv execute, jsem schopen tento skript spustit.
To je důležitá poznámka, protože možná budete chtít ukládat své soubory skriptů do chráněných adresářů (ke kterým máte přístup pouze vy), abyste zabránili ostatním uživatelům ve spuštění vašich souborů.
Zadání cesty ke skriptu
Druhým způsobem spouštění skriptů bash je zadání cesty k souboru.
Pro použití této metody musí mít soubor práva ke spuštění.
Nejprve použijte příkaz „chmod“, abyste nastavili práva ke spuštění pro aktuálního uživatele.
$ chmod u+x <script>
Jak vidíte, barva souboru je zcela jiná : váš aktuální terminál zvýrazňuje spustitelné soubory pomocí specifických barev, v tomto případě zelenou barvou.
Když je váš skript spustitelný, můžete jej spustit zadáním relativní nebo absolutní cesty ke skriptu.
Při použití souboru s názvem „script.sh“ umístěného v mém aktuálním pracovním adresáři lze skript spustit spuštěním
$ ./script.sh
Jestliže se nacházíte v jiném adresáři, budete muset zadat absolutní cestu k souboru skriptu.
$ /home/user/script.sh
Jak jste si již asi uvědomili, tento způsob není příliš pohodlný, pokud musíte pokaždé zadávat cestu ke skriptu.
Naštěstí pro vás existuje způsob, jak skript spustit prostým zadáním názvu souboru do příkazového řádku.
Přidání skriptu do PATH
Přípona „.sh“ není nutná, aby byl skript považován za soubor skriptu.
Pro zjednodušení přejmenujeme stávající „skript.sh“ na „script“.
Pro přejmenování souborů v systému Linux stačí použít příkaz „mv“ a zadat zdrojový a cílový cíl.
$ mv script.sh script
A co kdybyste chtěli svůj skript spustit zadáním příkazu „script“?
Chcete-li to udělat, musíte přidat cestu ke svému skriptu do proměnné prostředí PATH.
Chcete-li vypsat aktuální hodnotu proměnné prostředí PATH, použijte příkaz „printenv“ s argumentem „PATH“.
$ printenv PATH
Chcete-li aktualizovat proměnnou PATH ve svém aktuálním pracovním prostředí, upravte proměnnou prostředí PATH pomocí následující syntaxe:
$ export PATH="<path_to_script>:$PATH"
Příkaz „script“, který jste právě definovali, bude nyní přímo dostupný bez zadávání cest : můžete jej spouštět jako jakékoli jiné příkazy.
Poznámka : pokud chcete, aby vaše změny byly trvalé, postupujte podle těchto kroků, abyste správně aktualizovali proměnnou PATH.
Vestavěné prvky shellu vysvětleny
Před deklarováním jakýchkoli proměnných ve vašem shellovém skriptu je důležité, abyste znali vestavěné prvky shellu.
Při práci se shellem Bash většinu času spouštíte „programy“.
Příkladem programů jsou „ls“, „fdisk“ nebo „mkdir“. Nápovědu k těmto příkazům najdete pomocí příkazu „man“, což je zkratka pro „manual“.
Zkoušeli jste si však někdy přečíst dokumentaci k příkazu „source“?
Dokumentaci byste si pomocí příkazu „man“ nepřečetli, protože příkaz source je vestavěná funkce shellu.
Chcete-li si přečíst dokumentaci k vestavěným funkcím shellu, musíte použít příkaz „help“.
$ help <command>
Seznam vestavěných příkazů shellu je poměrně rozsáhlý, ale zde je obrázek všech vestavěných příkazů bashe, které můžete najít v systémech Ubuntu.
Používání proměnných Bash
Teď, když víte o vestavěných modulech Bash, je čas začít psát vlastní skripty Bash.
Připomínáme, že příkazy zadané v terminálu lze ve skriptu Bash použít úplně stejně.
Pokud například chcete skript, který jednoduše provede příkaz „ls -l“, jednoduše upravte svůj skript, přidejte řádek shebang a příkaz.
#!/bin/bash# This simple script executes the ls commandls -l
A co kdybyste chtěli mít proměnné Bash?
Proměnné Bash jsou jednoduché programové proměnné, které mohou uchovávat širokou škálu různých vstupů.
Chcete-li deklarovat proměnnou Bash, jednoduše zadejte název proměnné a její hodnotu oddělenou znaménkem rovnosti.
VAR=value
Abyste mohli obsah proměnné Bash použít ve svém skriptu, použijte „$“ a připojte název proměnné.
echo $VAR
I když můžete použít tuto syntaxi, abyste měli hodnotu proměnné, můžete také použít zápis „v závorkách“.
echo ${VAR}
Pomocí této syntaxe lze proměnné kombinovat.
Máte-li například dvě proměnné Bash pojmenované VAR1 a VAR2, můžete je obě nechat vypsat pomocí následující syntaxe
echo "${VAR1}${VAR2}"
Chcete-li provádět příkazy uvnitř skriptů Bash, musíte použít nahrazování příkazů.
Zastoupení příkazu je technika používaná v shellech Bash za účelem uložení výsledku příkazu do proměnné.
Chcete-li v shellu Bash nahradit příkaz, použijte znak dolaru a příkaz uzavřete do závorek.
VAR=$(command)
Chcete-li například získat výsledek v podobě počtu souborů v aktuálním adresáři, napíšete
#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"
Jak vidíte, substituce příkazů je docela užitečná, protože ji lze použít k dynamickému provádění příkazů v shellovém skriptu a vrácení hodnoty zpět uživateli.
Když už mluvíme o vracení výsledků koncovému uživateli, jak řešíte skripty, které nejsou správně ukončeny?
Co když se příkaz uvnitř skriptu neprovedl správně?“
Pochopení stavů ukončení
Při provádění skriptu, i když nevracíte žádnou hodnotu, skript vždy vrací to, čemu říkáme „stav ukončení“.
Stav ukončení ve skriptech Bash udává, zda bylo provedení skriptu úspěšné, nebo ne.
Pokud je stavový kód nula, bylo provedení vašeho skriptu úspěšné. Pokud se však hodnota liší od nuly (například jedna, dvě nebo více), znamená to, že provedení skriptu nebylo úspěšné.
Pro demonstraci výstupního stavu spusťte libovolný platný příkaz v prostředí bash.
echo "This is a simple working command"
Nyní pomocí tohoto příkazu zkontrolujte stav ukončení posledního spuštěného příkazu.
echo ${?}
Jak vidíte, výstupem tohoto příkazu je „0“ neboli stav ukončení posledního příkazu, který jsem provedl.
Tuto syntaxi („${?}“) lze použít ve skriptech, abyste se ujistili, že příkazy byly provedeny správně.
Stav ukončení lze použít ve skriptech, aby byl skript ukončen s určitým stavovým kódem.
Pokud například chcete skript ukončit s chybou, můžete ve skriptu použít následující příkaz.
exit 1
Podobně můžete použít výstupní kód „nula“, abyste určili, že skript byl úspěšně proveden.
exit 0
Pro ověření, zda byl stavový kód správný, budete potřebovat základní podmíněné příkazy, jako je například příkaz IF.
Manipulace s podmínkami v bashi
Při spouštění skriptů v bashi někdy nejde jen o to, abyste měli několik příkazů vedle sebe : chcete mít podmíněné akce.
V některých případech se může hodit podmínka, která kontroluje, zda je aktuální uživatel uživatelem root (nebo jen určitý uživatel v systému).
Jedním z jednoduchých způsobů, jak mít v Bashi podmínky, je použití příkazu if.
„If“ je vestavěný příkaz shellu, v důsledku toho je návod k němu dostupný prostřednictvím příkazu „help“
$ help if
Nápověda popisuje syntaxi příkazu if pomocí středníků, ale my budeme používat tuto syntaxi (která je ekvivalentní)
if ]then <commands>else <command>fi
Praktický případ : kontrola, zda je uživatel root
Abychom si ukázali, k čemu lze použít příkaz if, napíšeme jednoduchý skript, který bude kontrolovat, zda je uživatel root, či nikoliv.
Připomínáme, že uživatel root má v každém unixovém systému vždy nastaveno UID na nulu.
Znalí této informace zkontrolujeme, zda je UID nastaveno na nulu, pokud tomu tak je, provedeme zbytek skriptu, v opačném případě skript ukončíme.
Jak bylo vysvětleno v jiných tutoriálech (o správě uživatelů), aktuální ID uživatele můžeme zjistit pomocí příkazu „id“.
$ id -u1000
Tento příkaz použijeme k tomu, abychom zjistili, zda je uživatel provádějící skript root, nebo ne.
Vytvořte nový skript a přidejte do něj řádek shebang.
#!/bin/bash
Přímo pod něj přidejte příkaz „id“ a výsledek uložte do proměnné s názvem „USERID“ pomocí nahrazení příkazu.
USERID=$(id -u)
Teď, když „USERID“ obsahuje aktuální ID uživatele, použijte příkaz IF, abyste zkontrolovali, zda je ID uživatele nulové nebo ne.
Jestliže tomu tak je, vypište jednoduchou informační zprávu, pokud ne, ukončete skript se stavem ukončení 1.
if ]then echo "This is root"else exit 1fi
Pokud nyní skript spustíte jako aktuální uživatel, skript se jednoduše ukončí se stavem ukončení jedna.
Nyní zkuste skript spustit jako uživatel root (příkazem sudo)
Jak vidíte, vaše informační zpráva byla zobrazena a skript skončil s chybovým kódem nula.
Závěr
V tomto kurzu jste se dozvěděli o programovacím jazyce Bash a o tom, jak jej lze použít pro vytváření skriptů Bash v systému.
Dozvěděli jste se také o stavech ukončení a podmíněných příkazech, které jsou klíčové pro to, abyste mohli mít ve svých skriptech nastavenou vlastní logiku.
Teď, když máte více znalostí o jazyku Bash, měli byste začít psát vlastní skripty pro své potřeby : můžete začít například tutoriálem na vytváření archivních záložních souborů.
Pokud vás zajímá správa systému Linux, máme na webu kompletní sekci věnovanou této problematice, tak se na ni určitě podívejte!