Bash

Z Wikiknih
Skočit na navigaci Skočit na vyhledávání
  • 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
  • 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


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[editovat]

Proměnné (variables) a jejich expanze[editovat]

Deklarace 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[editovat]

Bash 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)[editovat]

Bash 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[editovat]

Expanzí 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)[editovat]

Urč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[editovat]

je 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í[editovat]

roura (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[editovat]

seznam 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[editovat]

Slož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[editovat]

Poznámky[editovat]

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