Bash
- Bourne-Again SHell, široce používaný příkazový interpret (shell) na Unix systémech, implicitní shell v Linuxu
- zdola kompatibilní s Bournovým shellem, vyhovuje IEEE POSIX, užitečné vlastnosti z C shellu a Korn shellu
- rozhraní mezi uživatelem a systémem – čte příkazy z klávesnice, interpretuje je a provádí
- interaktivní (stdin/stdout napojen na terminál) x neinteraktivní (příkazy čteny ze souboru)
- posloupnost příkazů čtená ze souboru je program – skript; => bash jako interpret příkazového jazyka.
- editace příkazového řádku, historie příkazů, řízení běhu úloh
- prostředí (environment) – oblast paměti programu(Linux:32kB) pro pole řetězců tvaru jméno=hodnota
- Chování upravitelné pomocí startovacích souborů a proměnných prostředí:
- Přihlašovací shell:
/etc/profile
,~/.bash_profile
,~/.bash_login
, a~/.profile
- Interaktivní shell:
~/.bashrc
- Přihlašovací shell:
- na příkazové řádce používáme: přiřazení proměnných prostředí, řídící příkazy, interní příkazy, externí příkazy
Klávesové zkratky
editovatEditování řádky
editovatPro editování řádky používá Bash knihovnu GNU Readline a její klávesové zkratky.
Klávesové zkratky
editovatNásledující seznam klávesových zkratek funguje pouze při použití implicitního mapování kláves (Emacs). Alternativní Vi-mapování lze zavést příkazem set -o vi
.
- Tab ↹ : Automatické doplnění od pozice kurzoru (našeptávač).
- Ctrl + a : Přesun kurzoru na začátek řádku (stejně jako Home).
- Ctrl + e : Přesun kurzoru na konec řádku (stejně jako End).
- Ctrl + p : Napíše předchozí příkaz (stejně jako Up).
- Ctrl + n : Napíše následující příkaz (stejně jako Down).
- Ctrl + r : Napíše dříve použitý příkaz obsahující zadaný výraz. Opakované stisknutí vyhledá další příkaz obsahující požadovaný výraz.
- Ctrl + s : Napíše nejnovější příkaz odpovídající předchozímu vyhledávání (vyvarujte se použití v terminálu, jelikož tato zkratka také spouští jehe XOFF). Pokud změníte nastavení XOFF, použijte Ctrl + q pro návrat.
- Ctrl + o : Vykoná nalezený příkaz.
- Ctrl + l : Vymaže obsah obrazovky (stejně jako příkaz
clear
). - Ctrl + u : Vymaže obsah řádku před kurzorem a zkopíruje jej do schránky.
- Ctrl + k : Vymaže obsah řádku za kurzorem a zkopíruje jej do schránky.
- Ctrl + w : Vymaže slovo před kurzorem a zkopíruje jej do schránky.
- Ctrl + y : Vloží obsah schránky na pozici kurzoru.
- Ctrl + d : Odešle příznak EOF (End Of File), který (pokud není tato funkce vypnuta v nastavení) zavře právě aktivní shell (stejně jako příkaz
exit
). (Pouze pokud je na řádku s kurzorem nějaký text.) - Ctrl + c : Odešle signál SIGINT právě probíhající úloze, který způsobí její přerušení a zavření.
- Ctrl + z : Odešle signál SIGTSTP právě probíhající úloze, který úlohu pozastaví. Pro pokračování úlohy zadejte příkaz
fg ['jméno nebo id procesu']
. - Ctrl + × Ctrl + × : Přemístí kurzor na jeho předchozí pozici. Lze tak efektivně přeskakovat mezi dvěma kusy kódu.
- Ctrl + × Ctrl + e : Zapne editaci zvoleného řádku pomocí editoru definovaného v $EDITOR nebo v editoru vi, pokud není nastaven.
- Alt + f : Posune kurzor o jedno slovo dopředu.
- Alt + b : Posune kurzor o jedno slovo dozadu.
- Alt + Del : Vymaže slovo před kurzorem.
- Alt + d : Vymaže slovo za kurzorem.
- Alt + u : Přepíše velkými písmeny všechny znaky od pozice kurzoru do konce slova.
- Alt + l : Přepíše malými písmeny všechny znaky od pozice kurzoru do konce slova.
- Alt + c : Přepíše znak pod kurzorem velkým písmenem a posune ho na konec daného slova.
- Alt + a : Zruší poslední editaci řádku.
Základní pojmy
editovat- blank
- mezera nebo tabelátor
- bílé místo
- posloupnost mezer a/nebo tabelátorů
- slovo
- posloupnost znaků považovaná shellem jako jednotka. Také známé jako známka (znamení, pešek, token)
- jméno
- slovo skládající se pouze z alfanumerických znaků a podtržítek, začínající písmenem nebo podtržítkem. Také nazývané jako identifikátor
- metaznak
- znak oddělující slova - jeden z následujících:
| & ; ( ) < > mezera tabelátor
- řídící operátor
- slovo, které má určitou řídící funkci - je to jedno z následujících:
|| & && ; ;; ( ) | <newline>
- vyhrazená (rezervovaná) slova
- slova která mají v shellu zvláštní význam. Následující slova jsou rozeznávána jako rezervovaná (když nejsou v uvozovkách) a jsou první slovo jednoduchého příkazu (viz syntaxe shellu níže) nebo třetí slovo příkazu case nebo if :
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
Syntaxe shellu
editovatProměnné (variables) a jejich expanze
editovatDeklarace proměnné - se provádí automaticky při prvním přiřazení hodnoty proměnné:
Příklad :
jmeno=hodnota
Pozn.: Bývá zvykem psát proměnné velkými písmeny. Na velikosti písmen, na rozdíl od jiných programovacích jazyků, záleží! Pokud má proměnná obsahovat speciální znaky, pak musí být buď hodnota proměnné uzávorkována, nebo musí být význam speciálních znaků neutralizován pomocí tzv. "escape sekvence" tj. musí být před něj vložen znak \
Pole
editovatBash pracuje pouze s jednorozměrnými poli, vícerozměrná pole však lze simulovat vložením proměnné do položky pole, je však přitom třeba brát v úvahu vliv expanze proměnných a speciálních znaků, mezer a tabulátorů
Jednotlivé položky lze do pole přiřazovat buď přímo podle tzv. "indexu" nebo najednou pomocí kulaté závorky
Příklad :
$ pole[1]="první položka"
$ pole[2]="druhá položka"
$ pole[3]="třetí položka"
$ pole=('první položka' 'druhá položka' 'třetí položka')
$ echo ${pole} # vypíše pouze první (nultou) položku pole
$ echo ${pole[*]} # vypíše všechny položky pole
první položka druhá položka třetí položka
$ pole=( "čtvrtá položka" '$jmeno' "$jmeno" ) # přenastaví pole na nové hodnoty
$ echo ${pole[*]}
čtvrtá položka $jmeno hodnota # třetí položky je proměnná, viz následující odstavec
Pole lze vytvořit také z obsahu proměnné. Oddělovačem jednotlivých položek jsou všechny "bílé znaky" (mezery, konce řádků, tabulátory). Pokud se má jako oddělovač použít jiná hodnota, je nutné předefinovat hodnotu proměnné IFS
$ obsah="první druhá třetí"
$ pole=($obsah)
Příklad (dvojrozměrné pole):
#!/bin/bash
A=("abcd" "dcba")
Z=("zxyw" "wxyu" "tuxz")
ARR=(A Z)
for ROW in ${ARR[*]}
do
echo "processing row: $ROW"
TEMP="\${$ROW[*]}"
ROW=`eval echo $TEMP`
for ELEMENT in $ROW
do
echo " processing element: $ELEMENT"
done
done
Uvozovky
editovat'
– jednoduché uvozovky (apostrofy)- Je-li řetězec při přiřazování do proměnné uzavřen do jednoduchých uvozovek, jsou speciální znaky interpretovány jako normální text, tzn. proměnné (řetězce začínající znakem $) nejsou expandovány (tj. nahrazovány svým obsahem).
"
– dvojité uvozovky- Podobně jako u jednoduchých uvozovek je většina speciálních znaků interpretována jako normální text, s výjimkou znaků $ (dolar), ` (obrácený apostrof) a částečně \ (obrácené lomítko). Tzn. např. řetězce začínající znakem $ jsou nahrazovány svým obsahem a prováděny jsou též operace jako
${promenna##*predpona}
apod. (viz část Expanze proměnných).
Příklad:
$ jmeno=obsah proměnné # Do proměnné jmeno se přiřadí pouze řetězec obsah
bash: proměnné: command not found
$ jmeno="obsah proměnné" # Do proměnné se přiřadí vše co je mezi uvozovkami
$ echo zobrazí se následující text $jmeno # Proměnná $jmeno je expandována
zobrazí se následující text obsah proměnné
$ echo "zobrazí se následující text $jmeno" # Proměnná $jmeno je expandována
zobrazí se následující text obsah proměnné
$ echo 'zobrazí se následující text $jmeno' # $jmeno není interpretováno jako proměnná
zobrazí se následující text $jmeno
Závorky
editovat()
- kulaté závorky
Obsah v kulatých závorkách je expandován jako jednotlivé položky pole
Pokud však je před první kulatou závorkou uveden znak "$" nejde o přiřazení jednotlivých položek pole, ale je spuštěn podproces shell-u (podobně jako když je výraz uzavřen mezi apostrofy (znak `)
Příklad :
$ pole=(echo "obsah proměnné") # Před závorkou chybí "$" - jde o přiřazení položek do pole
$ echo $pole # příkaz vrátí první položku pole
echo
$ echo ${jmeno[@]} # příkaz vrátí vypsané všechny položky pole
echo obsah proměnné
$ echo ${pole[0]} # příkaz vrátí první položku pole
echo
$ echo ${pole[1]} # příkaz druhou položku pole
obsah
$ echo ${pole[2]} # příkaz vrátí třetí položku pole
proměnné
$ pole=$(echo "obsah proměnné") # Před závorkou je znak "$" tudíž jde o podproces
$ echo $pole # příkaz vrátí první položku pole
obsah proměnné
$ echo ${pole[@]} # příkaz vrátí všechny položky pole
obsah proměnné
$ echo ${pole[1]} # pole není polem, ale proměnnou
$ pole=`echo "obsah proměnné"` # Použijeme-li apostrofů,
obsah proměnné
$ echo ${pole[1]} # ..je výsledek stejný
(())
- zdvojené kulaté závorky
Se používají při výpočetních operacích, jako náhrada příkazu let
Příklad :
$ let a=a+5 # Proměnná a neexistuje, proto jí je přiřazena hodnota 5
$ echo $a
5
$ let a=a+5 # ..teď už existuje tak k její původní hodnotě přičteme 5
$ echo $a
10
$ a=$((a+5)) # ..a dalších 5, tentokrát už bez příkazu let
$ echo $a
15
Stejný efekt jako zdvojené závorky má i hranatá závorka
{}
- složené závorky
Používají se pro vymezení bloku kódu u funkcí, při práci s poli a u substitucí.
Chybí-li před levou složenou závorkou znak "$" pak se snaží shell interpretovat tento blok kódu jako funkci
Příklady substituce :
$ echo ${parameter}
- Výpis obsahu proměnné "parametr" je-li prázdná nebo neexistuje, vrátí prázdnou hodnotu
$ echo ${parameter-default}
- Výpis obsahu proměnné "parametr", je-li prázdná, nebo neexistuje použije se jako návratová hodnota "default"
$ echo ${parameter=default}
- Výpis obsahu proměnné "parametr", je-li prázdná, tak se jí přiřadí hodnota default; neexistuje-li, tak se vytvoří
$ echo ${parameter+předchozí_hodnota}
- Existuje-li proměnná "parametr" tak se použije jako návratová hodnota "default"
${parametr?chybova_hlaska}
${parametr:?chybova_hlaska}
- Není-li proměnná "parametr" nastavena, pak vypíše bash název této nenastavené proměnné + příslušnou chybovou hlášku. Dvojtečka před otazníkem způsobí že se tato hláška vypíše i v případě že je proměnná nastavena, ale nemá žádný obsah
${promenna^^}
- Vypíše obsah proměnné velkými písmeny (písmena s diakritikou ovšem ponechá malá!).
${promenna#vzorek}
- Odpovída-li vzorek začátku proměnné "promenna" bude o něj oříznuta. Vzorkem může být regulární výraz, znak nebo řetězec znaků.
${promenna##*vzorek}
- Ořízne obsah proměnné "promenna" od začátku řetězce až za poslední výskyt vzorku
${promenna%vzorek}
- Odpovídá-li vzorek konci proměnné bude o něj oříznuta
${promenna%%vzorek*}
- Ořízne obsah proměnné "promenna" od konce řetězce až před poslední výskyt vzorku
${#promenna}
${#pole}
${#pole[*]}
${#pole[@]}
- Vrátí počet znaků proměnné. V případě, že jako název proměnné uvedeme pole, vrátí počet znaků prvního pole. Uvedeme-li místo indexového čísla pole znak zavináč, nebo hvězdičku, pak se nám vrátí počet položek pole
${promenna:pozice}
- Vrátí řetězec znaků který zbývá od udané pozice do jejího konce
${promenna:pozice:delka}
- Vrátí řetězec znaků zadané délky od udané pozice
${promenna/vzorek/nahrada}
- Nahradí první výskyt v proměnné odpovídající vzorku řetězcem nahrada
${promenna//vzorek/nahrada}
- Nahradí všechny výskyty v proměnné odpovídající vzorku řetězcem nahrada
${promenna/#vzorek/nahrada}
- Nahradí začátek proměnné odpovídající vzorku řetězcem nahrada
${promenna/%vzorek/nahrada}
- Nahradí konec proměnné odpovídající vzorku řetězcem nahrada
${!promenna}
- Konstrukce
${!promenna}
se využívá místo staršího řešeníeval var1=\$$var2
pro nepřímé přiřazení obsahu proměnné. Viz příklad:
a=pismeno
pismeno=z
echo "a = $a" # Přímé přiřazení.
# Na řádku je vypsán obsah proměnné a
echo "a = ${!a}" # Nepřímé přiřazení.
# Na řádku je vypsán obsah proměnné pismeno
echo
${!varprefix*}
${!varprefix@}
- Začíná-li řetězcem "varprefix" název některé proměnné pak se vrátí celý její název. V opačném případě se nevrátí nic. Odpovídá-li výsledku více proměnných, pak se vrátí všechny. (Znaky @ a * mají v tomto případě shodný výsledek)
Příklady práce s polem:
$ poleZ=( jedna dvě tři čtyři pět šest švestek )
$ echo ${poleZ[@]:0}
jedna dvě tři čtyři pět šest švestek
$ echo ${poleZ[@]:1}
dvě tři čtyři pět šest švestek
$ echo ${poleZ[@]:1:2}
dvě tři
$ echo ${poleZ[@]#t*i}
jedna dvě čtyři pět šest švestek
$ echo ${poleZ[@]##š*t}
jedna dvě tři čtyři pět ek
$ echo ${poleZ[@]%t*i}
jedna dvě č pět šest švestek
$ echo ${poleZ[@]%%t*i}
jedna dvě č pět šest švestek
$ echo ${poleZ[@]%%č*i}
jedna dvě tři pět šest švestek
[]
- hranaté závorky
Jsou synonymem příkazu test, pokud je však před nimi znak $ mají stejný význam jako zdvojené kulaté závorky, tj. obsah je zpracováván jako aritmetický výraz.
Příklad :
$let a=a+5 # Proměnná a neexistuje, proto jí je přiřazena hodnota 5
$ echo $a
5
$ let a=a+5 # ..teď už existuje tak k její původní hodnotě přičteme 5
$ echo $a
10
$ a=$[a+5] # ..a dalších 5, tentokrát už bez příkazu let
$ echo $a
15
[[]]
- zdvojené hranaté závorky
Mohou být použity v podstatě jako jednoduché lomené závorky
Pozn.: Tzv. "lomené závorky" bash nepoužívá, tyto znaky mají jiný speciální význam, viz níže
Další znaky
editovat_
- podtržítko ("underscore")
Podtržítko je ve spojitosti se znakem $ z hlediska bashe záludný znak. Narazit na to můžete při výpisů řetězců
Příklad :
$ ls neexistujici_soubor.txt
ls: nelze přistoupit k neexistujici_soubor.txt: Adresář nebo soubor neexistuje
$ echo "$_"
neexistujici_soubor.txt
$ ls prvni_neexistujici_soubor.txt druhy_neexistujici_soubor.txt
ls: nelze přistoupit k prvni_neexistujici_soubor.txt: Adresář nebo soubor neexistuje
ls: nelze přistoupit k druhy_neexistujici_soubor.txt: Adresář nebo soubor neexistuje
$ echo "$_"
druhy_neexistujici_soubor.txt
Z ukázkového příkladu je zřejmé, že kombinace $_ vrací poslední argument, který předcházel vypsání řetězce. Aby k této (v některých případech nežádoucí) substituci nedocházelo, je nutné znak _ (podtržítko) v řetězci "escapovat" zpětným lomítkem
=
- rovnítko
#
- křížek ("hash")
Jak můžete vidět v předchozím příkladu, text kterému předchází znak # bash při interpretaci skriptu ignoruje
Neplatí to však, v následujících případech:
- je-li znak # uzavřen v uvozovkách
- je-li znak # "escapován" (tj. předchází-li mu speciální znak \)
- je-li znak # součástí substituce (nahrazování řetězců) proměnné
- je-li znak # uveden před proměnnou, vrací počet znaků v proměnné
- je-li znak # uveden za proměnnou, ořezává počátek proměnné o řetězec který jej následuje
- je-li znak # součástí aritmetické úlohy
Příklad :
$ echo 'Tady začíná # komentář'
Tady začíná # komentář
$ echo "Tady začíná # komentář"
Tady začíná # komentář
$ echo Tady začíná # komentář
Tady začíná
$ echo Tady začíná \# komentář
Tady začíná # komentář
$ echo $jmeno
obsah proměnné
$ echo ${jmeno}
obsah proměnné
$ echo ${#jmeno}
14
$ echo ${jmeno#o} # Při substituci řetězců křížek ořezává od počátku
bsah proměnné
$ echo $(( 2#101010 )) #
42
%
- procenta (tzv. "modulo")
Operátor při výpočetních operacích. Substituce proměnných - ořezávají vzorek na konci řetězce
Příklad :
$ echo ${jmeno%né} # Při substituci řetězců procenta ořezávají od konce
obsah proměn
*
- hvězdička
Při výpočetních operacích operátor pro násobení
Při substitucích proměnných v regulárních výrazech, zastupuje libovolný počet výskytů
.
- tečka
Při substitucích proměnných v regulárních výrazech, zastupuje libovolný jeden znak
?
- otazník
Při výpočetních operacích se používá jako tzv. "trinární operátor" pro vyjádření podmínky
Při substituci proměnných se používá znak ? pro vyjádření vztahu: Nemá-li proměnná žádný obsah pak vyhoď hlášku
$ echo ${jmeno?tohle je chybová hláška} # Proměnná jmeno má stále obsah
obsah proměnné
$ jmeno= # Proměnná jmeno je vyprázdněna...
$ echo ${jmeno?tohle je chybová hláška} # ...ale stále existuje...
$ echo ${jmeno:?tohle je chybová hláška} # ...ovšem prázdná.
bash: jmeno: tohle je chybová hláška
$ unset jmeno # Proměnná jmeno je zrušena
$ echo ${jmeno?tohle je chybová hláška} # Proměnná neexistuje, proto je vypsána chybová hláška
bash: jmeno: tohle je chybová hláška
Pozn.: Je-li před otazníkem uvedena dvojtečka, je považováno za chybu i to že je proměnná prázdná
:
- dvojtečka
Je synonymem pro podmínky a vrací hodnotu TRUE
@
- zavináč ("at")
$
- dolar ("string")
Substituce proměnných
editovat\
- zpětné lomítko ("backslash")
|
- svislítko
`
- apostrof
;
- středník
<
- menší než..
>
- větší než..
+
- plus
Pole (array)
editovatBash podporuje pouze jednorozměrná pole
Deklarace pole - se provádí podobně jako přiřazení proměnné:
$ jmeno[$index]=hodnota
Použití pole - ${jmeno[$index]}
$ jmeno[1]=hodnota $ jmeno[99]=pokus $ jmeno[45]=13 $ echo ${jmeno[*]} hodnota 13 pokus $ echo ${jmeno[45]} 13 $ echo ${jmeno[@]} hodnota 13 pokus
Pozor: rozdíl mezi echo "$CISLO" a echo '$CISLO':
$ echo "$CISLO" 12 $ echo '$CISLO' $CISLO
Expanze proměnných
editovatExpanzí proměnné rozumíme její vyhodnocení, resp. vrácení její hodnoty ve výraze. Nejjednodušším případem je zapsání $PROMENNA, což způsobí, že ve výsledném výrazu se použije její hodnota. Shell umožňuje další různé volby a možnosti pro expanzi (vyčíslování) proměnných.
$proměnná, ${proměnná}
– nejjednodušší tvar
${proměnná:-slovo}
– pokud je proměnná dosud nedefinovaná, nebo prázdná, použije se expandované slovo
${proměnná:=slovo}
– pokud je proměnná dosud nedefinovaná, nebo prázdná, přiřadí se a použije se expandované slovo
${#proměnná}
– vrátí délku řetězce uloženého v proměnné
${proměnná%slovo}
– odstraní se z řetězcové proměnné nejkratší přípona
- Příklad
${POM%čoko*}
pokud měla proměnná obsah:'Nejčokoládovější čokoláda je čoko'
, potom po provedení příkazu bude proměnná POM obsahovat:'Nejčokoládovější čokoláda je '
${proměnná%%slovo}
– odstraní se z řetězcové proměnné nejdelší vyhovující přípona
- Příklad
${POM%%čoko*}
pokud měla proměnná obsah:'Nejčokoládovější čokoláda je čoko'
, potom po provedení příkazu bude proměnná POM obsahovat:'Nej'
${proměnná#slovo}
– odstraní se z řetězcové proměnné nejkratší předpona
- Příklad
${POM#*čoko}
pokud měla proměnná obsah:'Nejčokoládovější čokoláda je čoko'
, potom po provedení příkazu bude proměnná POM obsahovat:'ládovější čokoláda je čoko'
${proměnná##slovo}
– odstraní se z řetězcové proměnné nejdelší vyhovující předpona
- Příklad
${POM##*čoko}
pokud měla proměnná obsah:'Nejčokoládovější čokoláda je čoko'
, potom po provedení příkazu bude proměnná POM obsahovat:''
Speciální znaky (masky)
editovatUrčitě, i z řady jiných systémů, víte, že *
nahrazuje libovolný počet různých znaků, shell nabízí ještě další, které můžete v CGI programování hojně použít:
*
- je speciální znak, který vyhovuje libovolnému počtu znaků
?
- vyhovuje jednomu libovolnému znaku
[abdhrjk]
- vyhovuje jednomu znaku, takovému, který leží v této množině
[a-zA-Z]
- vyhovuje jednomu znaku za základní abecedy
[!0-9]
- vyhovuje jakémukoliv nečíselnému znaku, znak !
obrácí v []
význam
Jednoduché příkazy
editovatje posloupnost volitelného přiřazení hodnot proměnným následovaná slovy vzájemně oddělenými bílým místem a přesměrováními, a ukončená řídícím operátorem. První slovo specifikuje prováděný příkaz, a je posláno jako argument nula. Zbývající slova jsou poslána jako argumenty vyvolávanému příkazu. Návratová hodnota jednoduchého příkazu je jeho exit status, nebo 128+n jestliže příkaz je ukončen signálem n.
Roury (pípy, pipelines), také zřetězení
editovatroura (pipeline) je posloupnost jednoho nebo více příkazů oddělených znakem | (svislá čára). Tvar pro rouru je:
[time [-p]] [ ! ] příkaz [ | příkaz2 ... ]
standardní výstup (stdin) příkazu příkaz
je připojen přes rouru na standardní vstup příkazu příkaz2
. Toto spojení je provedeno před jakýmikoliv přesměrováním specifikovaným příkazem (viz přesměrování níže).
Jestliže rouře předchází rezervované slovo !
, stav ukončení (exit status) této roury je "logické NOT stavu ukončení" (exit status) posledního příkazu. Jinak je exit status roury stav ukončení (exit status) posledního příkazu. Shell čeká na ukončení všech příkazů v rouře před návratem hodnoty.
Jestliže rouře předchází rezervované slovo time, po jejím skončení je vypsán celkový čas, čas systému a uživatelský čas spotřebovaný při jejím provádění. Každý příkaz roury je prováděn jako samostatný proces.
Seznamy
editovatseznam je posloupnost jednoho nebo více zřetězení (pipelines) oddělených jedním z operátorů ;, &, &&, nebo ||, a volitelně ukončen jedním z metaznaků ;, &, nebo <newline>. Z těchto operátorů mají && a || stejnou prioritu, pak následují ; a &, které mají též stejnou prioritu. Namísto středníku se v seznamu může vyskytnout jedn nebo více znaků nová řádka. Pokud je příkaz ukončen řídícím operátorem &, shell provádí příkaz na pozadí v subshellu. shell nečeká na ukončení příkazu, a návratový stav je 0. Příkazy oddělené ; jsou prováděny sekvenčně; shell čeká na ukončení každého příkazu. Návratový stav je stav ukončení (exit status) posledního prováděného příkazu.
Řídící operátory && a || označují AND seznamy resp. OR seznamy. AND seznam má tvar command1 && command2
command2 je prováděn právě tehdy, pokud command1 vrací stav ukončení (exit status) nula (=úspěšné ukončení).
OR seznam má tvar command1 || command2
command2 je prováděn právě tehdy, když command1 vrací nenulový exit status. Návratový stav AND i OR seznamu je stav ukončení (exit status) posledního příkazu v seznamu prováděného.
Složené příkazy
editovatSložený příkaz je jeden z následujících:
(seznam)
- seznam je prováděn v subshellu. přiřazení proměnných a vestavěné příkazy které ovlivňují prostředí shellu environment nezůstávají v účinnost po ukončení příkazu. Návratový stav je stav ukončení (exit status) seznamu iseznam.
{ seznam; }
- seznam je jednoduše prováděn v běžném prostředí shellu. seznam musí být ukončen novou řádkou nebo středníkem. Tato konstrukce je známá jako skupinový příkaz. Návratový stav je stav ukončení (exit status) seznamu seznam. Pozn.: Na rozdíl od metaznaků ( a ), jsou znaky { a } rezervovaná slova a musí se vyskytovat jen tam, kde jsou rezervovaná slova rozeznávána. Protože nezpůsobují rozdělení slov, musí být odděleny od seznam bílou mezerou (posl. mezer a/n tabelátorů).
((expression))
- výraz expression je vyčíslen podle pravidel popsaných v man stránkách bash pod sekcí “ARITHMETIC EVALUATION”. jestliže hodnota výrazu je nenulová, návratový stav je 0; jinak návratový stav je 1. Tento zápis je přesně rovnocenný s let "expression".
[[ expression ]]
- vrací stav z 0 nebo 1 v závislosti na vyčíslení podmíněného výrazu expression. Výrazy jsou složené z elementů popsaných v man stránkách bash pod sekcí “CONDITIONAL EXPRESSIONS”.
for name [ in word ] ; do list ; done
- seznam slov následující in je expandován, generujíc seznam položek. Proměnná name je postupně nastavena na každý element tohoto seznamu, a je prováděn seznam příkazů list. Jestliže je vynecháno in word, příkaz for provádí seznam list jednou pro každý nastavený poziční parametr (viz parametry níže). Návratový stav je stav ukončení (exit status) posledního provedeného příkazu. Jestliže rozvoj položek následující in vyústí v prázdný seznam, nejsou provedeny žádné příkazy a návratový stav je 0.
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
- Nejprve je vyčíslen aritmetický výraz expr1 dle popsaných v sekci “ARITHMETIC EVALUATION. Pak je opakovaně vyčíslován aritmetický výraz expr2 dokud se nerovná nule. Pokaždé když je expr2 vyčíslen na nenulovou hodnotu je proveden seznam list a je vyčíslen aritmetický výraz expr3. Vynechání libovolného výrazu je stejné jako by byl roven 1. Návratová hodnota je exit status posledního provedeného příkazu v list, nebo nepravda jestliže libovolný z výrazů je nesprávný.
select name [ in word ] ; do list ; done
- Seznam slov následujících in je expandován, generujíc seznam položek. Množina rozvinutých slov je vypsána na stderr, každé předcházené číslem. Jestliže in word je vynecháno, jsou vypsány poziční parametry. Pak je zobrazen PS3 prompt načtena řádka ze stdin. Jestliže řádka je číslo odpovídající jednomu ze zobrazených slov, pak hodnota name je nastavena na toto slovo. Jestliže je řádka prázdná, slova a prompt jsou zobrazeny znovu. Pokud je načten EOF, příkaz se ukončí. Kterákoliv jiná přečtená hodnota způsobí že name je nastaveny na prázdnou hodnotu. Načtená řádka je uchována v proměnné REPLY. Seznam list je prováděn po každé volbě dokud není proveden příkaz break. Stav ukončení select je stav ukončení posledního příkazu prováděného v seznamu list, nebo nula pokud nebyly provedeny žádné příkazy.
case word in [ [(] pattern [ | pattern ]
- case příkaz nejprve expanduje word, pak zkouší postupně zda se shoduje s každým vzorkem pattern, s užitím stejných pravidel pro shodu jako pro rozvoj cesty. Když je nalezena shoda, je proveden odpovídající seznam list. Po první shodě nejsou zkoušeny žádné následující. Stav ukončení je nula pokud žádný vzorek nesouhlasil. Jinak je to stav ukončení posledního příkazu prováděného v seznamu list.
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
- Je proveden if seznam list. Pokud jeho stav ukončení (exit status) je nula, then list je proveden. Jinak je postupně proveden každý elif list, a pokud jeho stav ukončení je nula, je proveden odpovídající then list a příkaz skončí. Jinak je proveden else list, pokud je přítomný. Stav ukončení je stav ukončení posledního provedeného příkazu nebo nula, pokud žádná testovaná podmínka nebyla “true”.
while list; do list; done
- stejný jako..
until list; do list; done
- while příkaz opakovaně provádí do list tak dlouho dokud poslední příkaz v seznamu list vrací stav ukončení nula. until příkaz je identický k while, pouze test je negován; do list je prováděn tak dlouho dokud poslední příkaz v seznamu list vrací nenulový exit status. Stav ukončení while a until příkazů je stav ukončení posledního provedeného do list příkazu, nebo nula pokud nebyl proveden žádný.
[ function ] name () { list; }
- Definuje funkci pojmenovanou name. Tělo funkce je seznam list příkazů mezi “{“ a “}”. Tento seznam je prováděn kdykoliv je specifikováno slovo name jako jméno jednoduchého příkazu. Stav ukončení funkce je stav ukončení posledního příkazu prováděného v těle funkce.
Podmínky a testy
editovatPoznámky
editovatv neinteraktivním shellu slovo začínající znakem # (hash, zahrádka) způsobí že toto slovo a všechny zbývající znaky na řádce jsou ignorovány. Interaktivní shell bez zapnuté volby interactive_comments nepovoluje komentáře. Volba interactive_comments je v interaktivním shellu zapnuta implicitně.
Další literatura
editovat- Skriptování v Bournově shellu – protože je Bash s Bournovým shellem kompatibilní, skripty napsané pro Bournův shell fungují i v Bashi