V předchozích kapitolách jste se naučili ovládat příkazovou řádku, už víte, kde co najdete a které příkazy na co použít. Zjistili jste, že jde zpracovávat textové proudy a teď chybí jen trochu k napsání prvního skriptu. Napsání obslužného skriptu není něco, co by na vás čekalo každý den, čeká vás to v případě, že
máte nějakou pravidelně opakující se činnost s dostatečně složitými příkazy, že je jednodušší si ji zautomatizovat ve skriptu
řešíte problém, který je natolik složitý, že vede k cyklům, podmínkám, proměnným a jeho napsání na jeden řádek buď není možné nebo by znamenalo přílišnou mozkovou aktivitu
rádi píšete skripty
Nicméně, programovacích jazyků je velké množství a bash jakožto programovací jazyk je syntakticky tvrdý a výkonem také neoplývá. Proto jeho použití je doménou malých obslužných činností, kvůli kterým se vám nevyplatí volat python nebo jiný přívětivější jazyk.
Motivaci i varování máte za sebou a vzhůru na skriptování v bashi. Kolika jazyky skriptuješ, tolikrát jsi člověkem.
Co je skript
Skript je zcela běžný textový soubor, ve kterém na každém řádku je příkaz, který chcete, aby byl splněn.
Je-li skript napsaný v shellu, v jazyce bash nebo i jiném shellu, je běžnou praxí dát souboru příponu .sh. Není povinná, mnoho lidí ji nepoužívá, nicméně pomáhá to jednoduché orientaci při práci v souborovém systému.
Obvyklé je psát skripty v textovém editoru dle vlastního výběru a s výhodou využívat zvýraznění syntaxe.
Editor vim: pro zvýraznění syntaxe stačí uvnitř textového editoru zadat příkaz :syntax on. Nebo přidat do souboru ~/.vimrc řádek syntax on
Editor nano: Podobně jako pro vim existuje soubor ~/.nanorc, ideální je odkazovat se v něm na již existující soubory z /usr/share/nano/.
Hlavička
První řádek skriptu by měl být vyhrazen hlavičce:
#!/bin/bash
Hlavička, v angličtině shebang nebo sha-bang i hashbang, začíná znakem mřížka, vykřičník a pak je absolutní cesta k interpretu, v našem případě to bude /bin/bash. Ano, kdybyste psali skript v pythonu, bude tam /usr/share/python3. Hlavička není povinná, bude to fungovat i bez ní, ale kdybyste dali takový skript do rukou nepoučeného, pak necháváte na nepoučených rukou, jakému interpretu skript předají. A to nechcete.
Spuštění skriptu
Máte hotový soubor, ve kterém jsou příkazy, a rádi byste jej spustili.
Je možné spuštění pomocí bash jméno_skriptu, potřebujete k tomu jen práva ke čtení a skript je spuštěn. Nicméně, i kdyby v hlavičce stálo, že skript je v pythonu, vy jej zkusíte interpretovat bashem. Tato metoda spouštění tudíž není doporučovaná ani příliš obvyklá.
Druhý, častější způsob spouštění, je ten, že přidáte skriptu práva ke spouštění a spustíte jej buď ze spouštěcí cesty (viz. předchozí kapitola o Terminálu) nebo pomocí své cesty, obvykle
./skript.sh
Takto spuštěný spustitelný soubor si v hlavičce přečte, čím má být interpretován, pokud tuto informaci nenajde, pak se podívá do /etc/passwd a použije zde definovaný interpret pro daného uživatele. Pro vás na perunovi je to /bin/bash. Kromě práv ke spouštění je potřeba, aby soubor měl i práva ke čtení, jinak jej interpret nepřečte.
Komentář
S výjimkou prvního řádku, znak mřížky # značí komentář a vše, co za ní následuje, je interpretem ignorováno.
Je dobrým zvykem psát na druhý řádek skriptu komentář k tomu, co váš skript má dělat, v případě složitějších skriptů pak přidat pár řádků komentářů k parametrům a použití. Psaní dokumentace není ta nejzajímavější věc na světě, ale každý, kdo se kdy hrabal ve starých kódech, vám za to zulíbá ruce.
#!/bin/bash
# Pomocny skript pro luhovani zeleneho caje
echo "Zacni luhovat caj." #uvodni pozdrav
sleep 2m #pocka 2 minuty
echo -e "\aHotovo, vytahni listky." #upozorneni na konec luhovani. \a je pipnuti
Víceřádkový komentář je sice možný, ale není úplně jednoduchý a obvyklý, setrvejte raději u jednořádkových. Při pokročilém použití regulárních výrazů v oblíbeném textovém editoru vás to nezabije.
exit status
Jak skript skončí? Na konci skončí, až zinterpretuje všechny své příkazy, skončí. Pokud potřebujete konec uspíšit, použijete příkaz exit
#!/bin/bash
# Pomocny skript pro luhovani zeleneho caje
echo "Zacni luhovat caj." #uvodni pozdrav
sleep 2m #pocka 2 minuty
echo -e "\aHotovo, vytahni listky." #upozorneni na konec luhovani. \a je pipnuti
exit
Tady si pisu co chci, protoze to uz interpret nevidi.
Každý příkaz končí nějakou hodnotou, která indikuje, jestli skončil v pořádku nebo chybou. Tato hodnota se nazývá exit status a může nabývat celých čísel 0-255, kde nula je příznakem, že je vše v pořádku. Některé hodnoty jsou vyhrazeny konkrétním událostem
0 vše v pořádku, příkaz proběhl jak měl
1 chyba obecného rázu typu dělení nulou
2 chyba, chybné použití (většinou syntaxe) vestavěného příkazu bashe
126 chyba, příkaz je nalezen, ale není spustitelný
127 chyba, příkaz nenalezen
128+n chyba, příkazu byl zaslán signál 128+číslo signálu (tj. SIGKILL má číslo 9, 128+9=137 exit status)
130 chyba, skript byl pozastaven zkratkou ^C
Hodnotu exit status posledního spuštěného příkazu/skriptu zjistím pomocí
echo $?
Pokud chci hodnotu exit status nastavit pro můj skript, udělám to pomocí parametru příkazu exit
#!/bin/bash
# Pomocny skript pro luhovani zeleneho caje
echo "Zacni luhovat caj." #uvodni pozdrav
exit 64 #jeste to nemam dopsane