Unixový shell se dá použít nejen pro interaktivní práci, ale i jako programovací jazyk. Jednotlivé příkazy můžeme zapsat do souboru a tento soubor nechat interpretovat příkazovým interpretem. Tento soubor je potom označován jako skript nebo shellový skript.
Hlavička¶
Aby bylo možné skript jednoduše spouštět je nutné opatřit ho hlavičkou: První
řádek začíná dvojicí znaků #! a pokračuje cestou k příkazovému interpretu:
1 | |
Tento mechanizmus je zcela obecný a uplatní se stejně i pro skripty v jiný jazycích. Například pro programovací jazyk Python by hlavička mohla vypadat takto:
1 | |
Aby se skript choval jako každý jiný program je jeho správná hlavička podmínkou
nutnou nikoli postačující. Skript musí být spustitelný (chmod a+x ~/bin/mujSkript.sh)
a musí být umístěn tak, aby ho příkazový interpret našel. Pokud je vše toto
splněno může ho uživatel spouštět, jako by to byla běžná součást sytému.
1 | |
Příkaz . (tečka)¶
Ano . je opravdu příkaz. Výše popsaný způsob spouštění má za následek, že námi
vytvořený skript je spuštěn v podřízeném shell-u. To mimo jiné znamená, že
změny provedené v proměnných prostředí nebudou po dokončení skriptu viditelné.
Použijeme-li příkaz:
1 | |
…bude shell postupně číst soubor a jednotlivé příkazy vykonávat v aktuálním
shellu. Výsledek bude stejný jako kdyby uživatel zadával příkazy rovnou
v interaktivním prostředí.
Poznámky¶
Poznámky se zapisují za znak #. Vše od znaku # do konce řádku je
interpretem ignorováno.
Přebírání parametrů (argumentů)¶
Skriptům lze stejně jako programům předávat parametry. Ty jsou uvnitř skriptu dostupné po mocí speciálních proměnných.
| Proměnná | Význam |
|---|---|
$0 |
jméno skriptu |
$1 |
první parametr |
$2 |
druhý parametr |
$n |
n-tý parametr, n nabývá hodnoty 1 až 9 |
${n} |
libovolný n-tý parametr |
$# |
číslo posledního parametru |
$* |
seznam všech parametrů — stejné jako "$1 $2 $3 ..." |
$@ |
seznam všech parametrů — stejné jako "$1" "$2" "$3" ... |
Příkaz shift N vymaže prvních N parametrů a posune
význam proměnných $n a ${n}
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 | |
Návratová hodnota¶
Jak bylo uvedeno každý program, který ukončí svou činnost korektně
vrací jako svou návratovou hodnotu 0. Pokud se v průběhu programu
objeví chyba, dává o tom program vědět svou nenulovou návratovou hodnotou.
Okamžité ukončení skriptu s konkrétní návratovou hodnotou vyvolá příkaz
exit N.
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Funkce¶
Shell umožňuje vytvářet funkce. Funkce se chová stejně jako samostatný skript, včetně předávání parametrů a návratové hodnoty.
Ukončení funkce s konkrétní návratové hodnotou je zajištěna příkazem
return N.
Sada proměnných pro předávání parametrů funguje stejně jako u skriptu.
Syntaxe funkce v shellu:
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 | |
Podmínky cykly¶
Užití podmínek a cyklů není vázáno jen na skripty. Stejně tak je možné je použít v interaktivní práci.
V následujících ukázkách jsem zvolil způsob zápisu, který mi připadá přehledný,
ale platí, že středník ; může být zaměněn za konec řádku a naopak.
if — podmíněné vykonání¶
Syntaxe obecně vypadá takto:
1 2 3 4 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
VYRAZ:
- VYRAZ je příkaz nebo posloupnost příkazů oddělených pomocí metaznaku
||(logický součet — nebo) nebo metaznaku&&(logický součin — and). - O pravdivosti nebo nepravdivosti výrazu rozhoduje jeho návratová hodnota.
- VYRAZ je možné negovat pomocí znaku
!na jeho začátku.
Jako VYRAZ se velice často používá program test respektive jeho
synonymum [. Podmínka potom vypadá jako by byla zapsána do hranatých
závorek, ale ve skutečnost je volán program test.
Program test:
- porovnává řetězce
- porovnává celá čísla
- testuje typy souborů a jejich stáří
Více se dočtete v manuálové stránce programu test.
1 2 3 4 5 6 7 8 9 10 | |
case — shoda se vzorem¶
Vícenásobné větvení pomocí vzorů ukážeme na příkladu:
1 2 3 4 5 6 7 8 9 10 11 | |
- Větev ukončují dva středníky.
- Znak
|slouží jako oddělovač vzorů ve významu nebo. - Pro vzory platí stejná pravidla jako pro expanzi jmen souborů.
for — pro každou položku seznamu¶
Syntaxe cyklu for vypadá takto:
1 2 3 4 5 | |
Nejprve se expanduje SEZNAM. PROMENNA nabývá při každé iteraci postupně jedné z hodnot SEZNAMu.
1 2 3 | |
Jako seznam může ale být uvedeno neúplné jméno souboru
1 2 3 4 | |
… nebo program, který seznam vrátí.
1 2 3 | |
while, until — opakování na základě podmínky¶
Syntaxe cyklu while a until vypadá naprosto stejně. Jediný rozdíl je v
podmínce. Iterace cyklu while se vykoná pokud podmínka platí. Iterace cyklu
until se vykoná pokud podmínka neplatí.
K okamžitému ukončení těla cyklu slouží příkaz break k přeskočení zbytku těla
cyklu příkaz continue.
1 2 3 4 5 | |
VYRAZ má stejný význam jako u podmínky if.
1 2 3 4 | |
Standardní vstup s těla skriptu¶
Častokrát požadujeme, aby program spuštěný z těla skriptu byl “nakrmen”
vstupními daty. Pro přesměrování standardního vstupu ze souboru sice
slouží metaznak < ale vytváření samostatného souboru pro vstupní data není
vždy efektivní. Proto použijeme metaznak <<.
1 2 3 4 5 6 | |
- OMEZOVAC je libovolná posloupnost znaků.
- Ukončovací OMEZOVAC musí být uveden nasamostatném řádku.
- Ve vstupních datech je možné zapsat i proměnné.
- pokud je “OMEZOVAC” v uvozovkách dereference proměnných se neprovádí.
1 2 3 4 | |