BASH: Skriptování: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
m (Zápis skriptu: formát)
(Proměnné: maximální číslo v shellu)
 
(Není zobrazeno 26 mezilehlých verzí od stejného uživatele.)
Řádka 1: Řádka 1:
Shellové skripty jsou zápisem příkazů, které bychom jinak zadávali postupně na příkazovém řádku.  
+
'''Shellové skripty''' jsou zápisem příkazů do souboru, které bychom jinak zadávali postupně na příkazovém řádku.<ref>http://cs.wikipedia.org/wiki/Unixov%C3%BD_shell – unixový shell</ref> Skript lze snadno spustit a vykonávat jím opakovanou činnost. Typicky se shellové skripty používají na unixových platformách,<ref>http://cs.wikipedia.org/wiki/UN*X – unixové systémy, resp. platformy</ref> ale používají se též na Microsoft Windows.<ref>http://www.cygwin.com – unixové prostředí pro Microsoft Windows</ref><ref>http://cs.wikipedia.org/wiki/Windows_PowerShell – Windows PowerShell</ref>
  
 
== Zápis skriptu ==
 
== Zápis skriptu ==
 +
Pro zápis skriptu se používají různé editory pro holý text (tzv. ''plaintext''),<ref>http://cs.wikipedia.org/wiki/%C4%8Cist%C3%BD_text – holý text (čistý text)</ref> které do souboru ukládají pouze písmena bez formátovacích značek (na rozdíl třeba od HTML nebo souborů s příponou .DOC pro Word). V grafickém prostředí lze použít nějaký jednoduchý editor, například <code>gedit</code> nebo <code>gvim</code>. V textovém prostředí pak běžné editory, jako jsou například <code>mcedit</code>, <code>nano</code>, <code>vim</code> a další.
  
Aby byl skript přímo spustitelný, musí být jméno interpretu uvedeno na prvním řádku skriptu (hned na začátku souboru). V našem případě bude na prvním řádku uvedeno:
+
Aby byl skript přímo spustitelný, musí být jméno interpretu uvedeno na prvním řádku skriptu (hned na začátku souboru). V našem případě bude na prvním řádku volán jako interpret shell BASH, takže na něm bude uvedeno:
  
#!/bin/bash
+
<source lang=bash>
 +
#!/bin/bash
 +
</source>
  
Dále musí mít skript nastaven příznak spuštění (eXecutable). Na příponě souboru nezáleží, ale obvykle se uvádí .sh (příponu je možné i vynechat). Pokud chceme skript spouštět pouhým zadáním jeho jména, je potřeba ho umístit do adresáře uvedeného v proměnné PATH. Takovým adresářem je obvykle automaticky adresář ''bin'' v domácím adresáři přihlášeného uživatele. Je-li umístěn skript jinde, musíme k němu uvést cestu. To platí i když je skript v aktuálním adresáři (tj. v adresáři, ve kterém právě stojíte), protože shell z bezpečnostních důvodů aktuální adresář neprohledává. Komentáře se ve skriptech označují křížkem neboli znakem hash ("#"). Je-li komentář započat na začátku řádku, ignoruje shell celý řádek. Jinak ignoruje pouze text umístěný za značkou komentáře.
+
Dále musí mít skript nastaven příznak spuštění (eXecutable). Na příponě souboru nezáleží, ale obvykle se uvádí <code>.sh</code> (příponu je možné i vynechat). Pokud chceme skript spouštět pouhým zadáním jeho jména, je potřeba ho umístit do adresáře uvedeného v proměnné PATH. Takovým adresářem je obvykle automaticky adresář ''bin'' v domácím adresáři přihlášeného uživatele. Je-li umístěn skript jinde, musíme k němu uvést cestu. To platí i když je skript v aktuálním adresáři (tj. v adresáři, ve kterém právě stojíte), protože shell z bezpečnostních důvodů aktuální adresář neprohledává.
  
mcedit priklad.sh      # použijeme oblíbený editor
+
Komentáře se ve skriptech označují křížkem neboli znakem hash ("<code>#</code>"). Je-li komentář započat na začátku řádku, ignoruje shell celý řádek. Jinak ignoruje pouze text umístěný za značkou komentáře.
chmod +x priklad.sh    # nastavíme právo spuštění
+
 
./priklad.sh          # spustíme skript z aktuálního adresáře
+
<source lang=bash>
 +
mcedit priklad.sh      # použijeme oblíbený editor (místo mcedit můžete zkusit editor nano)
 +
chmod +x priklad.sh    # nastavíme právo spuštění
 +
./priklad.sh          # spustíme skript z aktuálního adresáře
 +
</source>
  
 
== Ladění skriptu ==
 
== Ladění skriptu ==
 +
Chceme-li vidět, jak se skript interpretuje, uvedeme na příslušném místě skriptu příkaz <CODE>set&nbsp;-x</CODE> a následně pak ladící výstup vypneme pomocí <CODE>set&nbsp;+x</CODE>. Také můžeme celý skript spustit s parametrem <code>-x</code> takto:
  
Chceme-li vidět, jak se skript interpretuje, uvedeme na příslušném místě skriptu příkaz <CODE>set&nbsp;-x</CODE> a následně pak ladící výstup vypneme pomocí <CODE>set&nbsp;+x</CODE>. Také můžeme celý skript spustit s parametrem -x takto:
+
<source lang=bash>
 +
bash -x priklad.sh
 +
</source>
  
bash -x priklad.sh
+
== Návratový kód ==
 +
Každý příkaz v Unixu vrací návratový kód. V případě úspěchu (resp. ''pravdy'') vrací ukončený program (nebo skritpt) podle běžně respektované dohody nulu (0). Jsou-li při provádění příkazu zjištěny problémy, je návratový kód nenulový (nejčastěji 1, tj. ''nepravda''). Všimněte si, že je logický význam z praktického důvodu obrácen (nula je ''pravda''). Větší hodnoty návratového kódu mohou blíže specifikovat situaci, kvůli které je vrácena chyba. Proto je potřeba při testování návratového kódu nějakého příkazu testovat jeho nenulovost (tj. netestovat, jestli vrací 1, ale jestli vrací 0 nebo cokoliv jiného). Pro ukončení skriptu a předání návratového kódu slouží příkaz <code>exit</code>.
  
== Návratový kód ==
+
<source lang=bash>
 +
# návratový kód je 1 (tj. chyba, nepravda)
 +
exit 1
 +
</source>
  
Každý příkaz v Unixu vrací návratový kód. V případě úspěchu (resp. "pravdy") vrací ukončený program (nebo skritpt) podle dohody nulu (0). Jsou-li při provádění příkazu zjištěny problémy, je návratový kód nenulový (nejčastěji 1). Větší hodnoty mohou blíže specifikovat situaci, kvůli které je vrácena chyba. Tím pádem je potřeba ve skriptech při kontrole výstupního kódu příkazu testovat jeho nenulovost (tj. netestovat, jestli vrací 1, ale jestli vrací 0 nebo cokoliv jiného). Pro ukonční skriptu a předání návratového kódu slouží příkaz exit.
+
Návratový kód využívají i konstrukce podmínek a smyček, kdy se vyhodnocuje, je-li výraz pravdivý (tj. použitý příkaz vrací nulu) nebo nepravdivý (příkaz vrací číslo různé od nuly). V případě, že je použita ve výrazu kolona (pipe, trubka), vyhodnocuje se pouze návratový kód posledního příkazu v koloně. Návratový kód předchozího příkazu je v shellu ukládán do speciální proměnné <code>$?</code>. Pokud v shellu zadáte postupně následující dva příkazy, bude vypsána jednička (1), protože to je návratový kód příkazu <code>false</code>.
  
# návratový kód je 1 (tj. chyba, nepravda)
+
<source lang=bash>
exit 1
+
true
 +
echo $?
 +
</source>
  
Návratový kód využívají i kontrukce podmínek a smyček, kdy se vyhodnocuje, je-li výraz pravdivý (tj. použitý příkaz vrací nulu) nebo nepravdivý (vrací číslo různé od nuly). V případě, že je použita ve výrazu kolona (pipe, trubka), vyhodnocuje se pouze návratový kód posledního příkazu v koloně.
+
Pomocí příkazu <code>exit</code> lze ukončovat shellový skript s různými návratovými kódy. Návratové kódy je možné testovat v programu, ze kterého je skript volán (může to být jiný skript, ale i shell, jak je ukázáno v předchozím příkladu).
  
 
== Vložené příkazy ==
 
== Vložené příkazy ==
 +
Někdy je potřeba nejprve něco spočítat nebo zpracovat a teprve výsledek potřebujeme použít například jako parametr jiného příkazu. V tomto případě se používá buď zpětných apostrofů (na anglické klávesnici je zpětný apostrof vlevo vedle čísla 1 v horní řadě kláves) nebo nověji konstrukce <CODE>$(...)</CODE>, kde na místo tří teček dosadíme příkaz nebo kolonu příkazů. Novější způsob lze s výhodou používat při vnořeném vyhodnocování.
 +
 +
<source lang=bash>
 +
echo "Písmeno x má ve jméně právě přihlášený $(who | grep x)"
 +
</source>
 +
 +
Ve výše uvedeném příkladu je nejprve vyhodnocen příkaz v závorkách, jeho výstup je dosazen na jeho původní místo, a pak je teprve proveden příkaz <CODE>echo</CODE>.
  
Někdy je potřeba nejprve něco spočítat nebo zpracovat a teprve výsledek potřebujeme použít například jako parametr jiného příkazu. V tomto případě se používá buď zpětných apostrofů (na anglické klávesnici je zpětný apostrof vlevo vedle čísla 1 v horná řadě kláves) nebo nověji konstrukce $(...), kde na místo tří teček dosadíme příkaz nebo kolon příkazů. Výhodou tohoto způsobu je, že lze používat vnořené vyhodnocování.
+
Alternativou je využití příkazu '''xargs''', který svůj vstup mění na řadu parametrů:
  
echo Písmeno x má ve jméně právě přihlášený $(who | grep x)
+
<source lang=bash>
 +
grep -l rene@huzva.cz | xargs ls -l
 +
</source>
  
Ve výše uvedeném příkladu je nejprve vyhodnocen příkaz v závorkách, jeho výstup je dosazen na původní místo příkladu a pak je teprve proveden příkaz echo.
+
Ve výše uvedeném příkladu příkaz <code>grep</code> vypíše seznam souborů, které obsahují adresu ''rene@huzva.cz'' a předá je na vstup příkazu <code>xargs</code>. Vstupující data jsou příkazem <code>xargs</code> přetvořena na parametry příkazu <code>ls&nbsp;-l</code>. Ve výsledku budou vypsány podrobnosti o všech souborech, které obsahují zadaný řetězec. Výhodou této konstrukce je skutečnost, že obchází limit shellu v počtu parametrů na příkazovém řádku.
  
 
== Předávání parametrů ==
 
== Předávání parametrů ==
 
 
Stejně jako ostatní programy mohou shellové skripty přebírat parametry, které byly zadány při spuštění na příkazovém řádku, např:
 
Stejně jako ostatní programy mohou shellové skripty přebírat parametry, které byly zadány při spuštění na příkazovém řádku, např:
  
./mujskript.sh jedna 2
+
<source lang=bash>
 +
./mujskript.sh jedna 2
 +
</source>
  
Předané parametry jsou ve skriptu dostupné pomocí speciálních konstrukcí:
+
Předané parametry jsou ve skriptu dostupné pomocí speciálních proměnných:
  
 
  $# - počet předaných parametrů
 
  $# - počet předaných parametrů
  $* - všechny předané parametry
+
  $* - všechny předané parametry ($1 $2 atd.)
 
  $0 - jméno skriptu (jak byl volán - nultá část z příkazového řádku)
 
  $0 - jméno skriptu (jak byl volán - nultá část z příkazového řádku)
 
  $1 - první parametr zadaný za názvem programu
 
  $1 - první parametr zadaný za názvem programu
Řádka 51: Řádka 77:
  
 
=== Příkaz shift ===
 
=== Příkaz shift ===
 +
Příkaz shift způsobí posun všech zadaných parametrů o jednu pozici vlevo, tj. první parametr je zahozen a na jeho místo je posunut druhý parametr, na pozici druhého je posunut třetí atd.
 +
 +
<source lang=bash>
 +
echo Pocet zadanych parametru: $#
 +
echo Prvni parametr: $1
 +
shift
 +
echo dalsi parametry: $*
 +
</source>
  
Příkaz shift způsobí posun zadaných parametrů vlevo, tj. první parametr je zahozen a na jeho místo je posunut druhý parametr, na pozici druhého je posunut třetí atd.
+
== Proměnné ==
 +
Proměnné mohou být naplněny čísly i řetězci a shell je nerozlišuje. Některé proměnné mají speciální význam &ndash; např. proměnná <code>PS1</code>, která vytváří prompt (výzvu) shellu. Proměnná se definuje tak, že se do ní přiřadí hodnota. Všechny proměnné lze vypsat příkazem <CODE>set</CODE>. Proměnnou lze zrušit příkazem <CODE>unset</CODE>. Jména proměnných se obvykle píší velkými písmeny, aby se dobře odlišila od ostatních příkazů ve skriptu. Níže zapsaný skript přiřadí do proměnné CISLO nejprve trojku a pak je tato proměnná příkazem <CODE>echo</CODE> vypsána.
  
echo Pocet zadanych parametru: $#
+
<source lang=bash>
echo Prvni parametr: $1
+
CISLO=3
shift
+
echo $CISLO
echo dalsi parametry:
+
</source>
for i in $*; do
 
    echo $i
 
done
 
  
== Proměnné ==
+
=== Výpočet výrazu ===
 +
Další skript přiřadí do proměnné <CODE>CISLO</CODE> dvojku. Poté obsah této proměnné sečte s číslem 12 a výsledek uloží do stejné proměnné (obsah proměnné se tedy zvýší o 12). Nakonec je proměnná vypsána:
 +
 
 +
<source lang=bash>
 +
CISLO=2
 +
CISLO=$(($CISLO + 12))
 +
echo $CISLO
 +
</source>
 +
 
 +
Proměnné (a funkce) lze odstranit pomocí příkazu <code>unset</code>:
  
Proměnné mohou být naplněny čísly i řetězci a shell to nerozlišuje. Některé proměnné mají speciální význam &ndash; např. proměnná PS1, která vytváří prompt (výzvu) shellu. Proměnná se definuje tak, že se do ní přiřadí hodnota. Proměnnou lze zrušit příkazem unset a všechny definované proměnné vypíše příkaz set. Jména proměnných se obvykle píší velkými písmeny, aby se dobře odlišila od ostatních příkazů ve skriptu.
+
<source lang=bash>
 +
unset CISLO
 +
</source>
  
CISLO=3
+
=== Maximální hodnoty ===
echo $CISLO
+
Shell pracuje s čísly jako s řetězci. Maximální číslo je 9*10^18.<ref>[http://stackoverflow.com/questions/2965761/find-maximum-positive-integer-value-in-bourne-shell Maximum positive integer value in Bourne Shell] (stackoverflow.com)</ref>
CISLO=$(expr $CISLO + 12)
 
echo $CISLO
 
 
KOUPIT="rohlik maslo mleko"
 
for i in KOUPIT; do
 
    echo $i
 
done
 
  
 
=== Proměnné prostředí ===
 
=== Proměnné prostředí ===
 +
Speciální postavení mají tzv. proměnné prostředí. Normální proměnné jsou platné (a dostupné) pouze v shellu (resp. programu), který je nadefinoval. Proměnné prostředí jsou však děděny i do potomků procesu, který proměnnou nadefinoval. Dají se tak předávat mezi programy data, avšak jen jednosměrně (od rodiče k potomku). Proměnné prostředí se definují příkazem <CODE>export</CODE> (oba uvedené příklady exportu proměnné jsou rovnocenné):
  
Speciální postavení mají tzv. proměnné prostředí. Normální proměnné jsou platné (a dostupné) pouze v shellu (resp. programu), který je nadefinoval. Proměnné prostředí jsou však děděny i do potomků procesu, který proměnnou nadefinoval. Dají se tak předávat mezi programy data, avšak jen jednosměrně (od rodiče k potomku). Proměnné prostředí se definují příkazem export:
+
<source lang=bash>
 +
EDITOR=mcedit
 +
export EDITOR
 +
export VISUAL=mcedit
 +
echo "EDITOR: $EDITOR, VISUAL: $VISUAL"
 +
</source>
  
export VISUAL=mcedit
+
Nadefinujeme-li proměnnou VISUAL v příkazovém řádku, bude viditelná pro všechny potomky shellu, tj. pro všechny dále spuštěné programy. Příkaz <code>echo</code> na posledním řádku proměnnou vypisuje. Proměnná VISUAL (a EDITOR) je významná tím, že ji respektují různé programy, které používají externí editor (např. <code>crontab</code>, <code>mutt</code> a podobně). Pokud není definována, je vyvolán editor <code>vi</code> (což může být pro začátečníky frustrující). Nadefinujeme-li ji na hodnotu uvedenou výše, bude spuštěn program <CODE>mcedit</CODE> (součást programu Midnight Commander), který má (na rozdíl od <code>vi</code>) klasické ovládání, takže začátečník si s ním snadno poradí.
  
Nadefinujeme-li proměnnou VISUAL v příkazovém řádku, bude viditelná pro všechny potomky shellu, tj. pro všechny dále spuštěné programy. Proměnná VISUAL (a EDITOR) je významná tím, že ji respektují různé programy, které používají externí editor (např. crontab, mutt a podobně). Pokud není definována, je vyvolán editor ViM. Nadefinujeme-li ji na hodnotu uvedenou výše, bude spuštěn program mcedit (součást programu Midnight Commander), který má klasické ovládání, takže začátečník si s ním snadno poradí.
+
==== Jednorázové nastavení proměnné prostředí ====
 +
Proměnnou prostředí lze nastavit jednorázově, takže bude platná jen pro jeden spouštěný program:
 +
 
 +
<source lang=bash>
 +
EDITOR=mcedit crontab -e
 +
DISPLAY="mujpocitac:0.0" firefox
 +
</source>
 +
 
 +
Ve výše uvedeném příkladu je nejprve spuštěn program <code>crontab</code> (tedy editace uživatelské tabulky programu cron), ale zároveň je jednorázově nastavena proměnná prostředí EDITOR, takže program <code>crontab</code> místo implicitně nastaveného editoru <code>vi</code> spustí editor <code>mcedit</code> (podle nastavené proměnné). Obdobně je na druhém řádku spuštěn program Firefox, jehož okno bude místo na lokální displej směrováno na jiný počítač (díky nastavení proměnné prostředí DISPLAY). Použité uvozovky ohraničují definovaný obsah proměnné, nejsou však poté jejím obsahem.
  
 
== Řídící konstrukce ==
 
== Řídící konstrukce ==
Řádka 93: Řádka 143:
 
* jinak je provedena část ''příkazy2'' nebo ''příkazy4'' (pokud část elif nepoužijeme)
 
* jinak je provedena část ''příkazy2'' nebo ''příkazy4'' (pokud část elif nepoužijeme)
 
* návratový kód vrací poslední provedený proces nebo 0, pokud se ještě neprovedl žádný příkaz
 
* návratový kód vrací poslední provedený proces nebo 0, pokud se ještě neprovedl žádný příkaz
* pokud použijeme kolonu příkazů, bude použita návratová hodnota posledního příkazu v koloně  
+
* pokud použijeme kolonu příkazů, bude použita návratová hodnota posledního příkazu v koloně
 +
* nejrůznější testy je možné realizovat příkazem <code>test</code> (viz [[#Testovaní výrazu]] níže)
  
if grep -q huzva /etc/passwd; then
+
<source lang=bash>
    echo yes
+
if grep -q huzva /etc/passwd; then
else
+
  echo yes
    echo no
+
else
fi
+
  echo no
 +
fi
  
if [ -f /tmp/IAmHere ]; then
+
if [ -f /tmp/IAmHere ]; then
    echo jsem tu
+
  echo "jsem tu"
fi
+
fi
 +
</source>
  
 
=== Cyklus while ===
 
=== Cyklus while ===
Řádka 110: Řádka 163:
 
* úsek ''do příkazy;'' je prováděn tak dlouho, dokud je návratový kód ''výrazu'' nulový (pravda)
 
* úsek ''do příkazy;'' je prováděn tak dlouho, dokud je návratový kód ''výrazu'' nulový (pravda)
  
while who | grep huzva > /dev/null
+
Následující skript vypisuje nekonečnou řadu čísel, ukončení je pomocí CTRL+c
do
+
<source lang=bash>
    sleep 20s
+
CITAC=1
done
+
while true; do
echo "Už se odlásil"
+
  echo -n "$CITAC "
 +
  CITAC=$(($CITAC + 1))
 +
  sleep 0.2s
 +
done
 +
</source>
 +
 
 +
Následující skript čeká, až se zadaný uživatel přihlásí
 +
<source lang=bash>
 +
while who | grep -q huzva
 +
do
 +
  sleep 20s
 +
done
 +
echo "Už se odlásil"
 +
</source>
  
 
=== Cyklus until ===
 
=== Cyklus until ===
Řádka 121: Řádka 187:
 
* úsek ''do příkazy;'' je prováděn tak dlouho, dokud je návratový kód ''výrazu'' NEnulový (NEpravda)
 
* úsek ''do příkazy;'' je prováděn tak dlouho, dokud je návratový kód ''výrazu'' NEnulový (NEpravda)
  
until who | grep huzva > /dev/null; do sleep 20s; done
+
<source lang=bash>
echo "Už se přihlásil"
+
until who | grep huzva > /dev/null; do sleep 20s; done
 +
echo "Už se přihlásil"
 +
</source>
  
 
=== Smyčka for ===
 
=== Smyčka for ===
Řádka 131: Řádka 199:
 
* není-li ''in slovo;'' zadáno, potom se ''příkazy'' provede pro každý poziční parametr (viz výše)
 
* není-li ''in slovo;'' zadáno, potom se ''příkazy'' provede pro každý poziční parametr (viz výše)
  
for POLOZKA in a b c d
+
<source lang=bash>
do
+
for POLOZKA in a b c d
    echo $POLOZKA
+
do
done
+
    echo $POLOZKA
 +
done
 +
</source>
  
for JMENO in *; do echo $JMENO; done       # ekvivalent příkazu ls
+
Následující skript vypisuje obsah adresáře (využívá žolíkovou expanzi), funguje tedy jako příkaz <code>ls</code>
 +
<source lang=bash>
 +
for JMENO in *; do echo $JMENO; done
 +
</source>
 +
 
 +
Ve smyčce lze použít i proměnnou. Následující příklad postupně vypíše položky proměnné <code>KOUPIT</code> (položky jsou odděleny mezerami):
 +
 
 +
<source lang=bash>
 +
KOUPIT="rohlik maslo mleko"
 +
for i in KOUPIT; do
 +
  echo $i
 +
done
 +
</source>
  
 
=== Větvení case ===
 
=== Větvení case ===
Řádka 149: Řádka 231:
 
* po nalezení první shody se dále už nehledá
 
* po nalezení první shody se dále už nehledá
  
echo Zadej akci a soubor:
+
<source lang=bash>
read AKCE SOUBOR
+
echo Zadej akci a soubor:
case $AKCE in
+
read AKCE SOUBOR
    smaz|remove|delete) rm $SOUBOR;;
+
case $AKCE in
    vytvor|create)      touch $SOUBOR;
+
  smaz|remove|delete) rm $SOUBOR;;
                        chmod 777 $SOUBOR;;
+
  vytvor|create)      touch $SOUBOR;
esac
+
                      chmod 777 $SOUBOR;;
 +
esac
  
echo Zadej odpoved
+
echo Zadej odpoved
read VSTUP
+
read VSTUP
case $VSTUP in
+
case $VSTUP in
    [aAyY]*) echo ANO
+
  [aAyY]*) echo ANO
            ;;
+
            ;;
    n*|N*)  echo NE
+
  n*|N*)  echo NE
            ;;
+
            ;;
    *)      echo Nerozumim
+
  *)      echo Nerozumim
esac
+
esac
 +
</source>
  
 
=== Řízení cyklu break a continue ===
 
=== Řízení cyklu break a continue ===
 +
Cyklus lze předčasně ukončit nebo vynutit jeho okamžitý další průběh (od jeho začátku). Tyto operace narušují pravidla strukturovaného programování avšak obvykle se používají proto, že odstraňují nutnost vkládat do cyklu další podmínky. Jejich použití by proto mělo vést ke zpřehlednění a zjednodušení cyklu (a ne naopak). Příkazy nemají vliv na právě zpracovávanou podmínku, mají vztah pouze k nadřízené smyčce.
  
 
;break [n]:
 
;break [n]:
* ukončí n-tou úroveň cyklu for, while, until  
+
* ukončí n-tou úroveň cyklu for, while, until
 +
* bez parametru ukončí nejbližší cyklus
  
 
;continue [n]:
 
;continue [n]:
* zahájí další iteraci cyklu  
+
* zahájí další iteraci cyklu n-té úrovně
 +
* bez parametru zahájí další průběh nejbližšího cyklu
 +
 
 +
=== Přesměrování řídící konstrukce ===
 +
Na celou řídící konstrukci podmínky nebo cyklu lze aplikovat [[BASH: Přesměrování|přesměrování]], které je pak platné pro všechny příkazy uvnitř řídící konstrukce.
 +
 
 +
<source lang=bash>
 +
for i in /etc/*; do
 +
  [ -d "$i" ] && echo Adresář: $i
 +
done > seznam.txt
 +
</source>
 +
 
 +
Výše uvedený příklad zapíše seznam adresářů do souboru.
 +
 
 +
<source lang=bash>
 +
if wget -q http://www.nekde.cz/adr/file.zip; then
 +
  mv file.zip file-$(date +%d.%m.%Y-%X)
 +
fi > /dev/null 2>&1
 +
</source>
 +
 
 +
Výše uvedený příklad provede operaci a nezávisle na jejím výsledku zahodí všechna chybová hlášení do <code>/dev/null</code>.
  
 
== Příkazy true, false ==
 
== Příkazy true, false ==
Řádka 184: Řádka 290:
 
* návratový kód vždy 1  
 
* návratový kód vždy 1  
  
while true; do
+
Následující skript je ekvivalent příkazu <code>yes</code>:
    echo y
+
<source lang=bash>
done               # ekvivalent příkazu yes
+
while true; do
 +
    echo y
 +
done
 +
</source>
  
 
== Testování výrazu ==
 
== Testování výrazu ==
Řádka 195: Řádka 304:
 
* obě uvedené formy jsou ekvivalentní (tj. chovají se naprosto stejně), [ je linka na příkaz test
 
* obě uvedené formy jsou ekvivalentní (tj. chovají se naprosto stejně), [ je linka na příkaz test
 
* příkaz vyhodnotí ''výraz'' a nastaví návratový kód 0 (true) nebo 1 (false)
 
* příkaz vyhodnotí ''výraz'' a nastaví návratový kód 0 (true) nebo 1 (false)
* místo příkazu if lze s výhodou použít zkrácenou formu:
+
* v některých shellech (bash) jsou oba příkazy interní; pokud chcete volat externí program, musíte u něj uvést plnou cestu (např. <code>/usr/bin/test</code>)
;[ výraz ] && příkaz:
 
* příkaz je proveden, pokud výraz vrátí pravdu
 
;[ výraz ] || příkaz:
 
* příkaz je proveden, pokud výraz vrátí nepravdu
 
  
 
* Testování typu souboru
 
* Testování typu souboru
Řádka 212: Řádka 317:
 
** <TT>-t [fd]</TT> fd je otevřeno na terminál, vynecháme-li fd, potom se použije hodnota 1 (standardní výstup)  
 
** <TT>-t [fd]</TT> fd je otevřeno na terminál, vynecháme-li fd, potom se použije hodnota 1 (standardní výstup)  
  
if [ -f /etc/shadow ]; then
+
<source lang=bash>
    echo "V systému je nainstalováno shadow password"
+
if [ -f /etc/shadow ]; then
fi
+
  echo "V systému je nainstalováno shadow password"
 +
fi
 +
</source>
  
 
* Testování přístupových práv
 
* Testování přístupových práv
Řádka 237: Řádka 344:
 
** <TT>řetězec1 != řetězec2</TT> řetězce se neshodují  
 
** <TT>řetězec1 != řetězec2</TT> řetězce se neshodují  
  
[ -z $HOME ] && echo "Proměnná prostředí HOME neexistuje"
+
<source lang=bash>
 +
[ -z $HOME ] && echo "Proměnná prostředí HOME neexistuje"
 +
</source>
  
 
* Numerické testy
 
* Numerické testy
Řádka 249: Řádka 358:
 
** <TT>číslo1 -ge číslo2</TT> číslo1 je větší nebo rovno číslo2  
 
** <TT>číslo1 -ge číslo2</TT> číslo1 je větší nebo rovno číslo2  
  
i=1
+
<source lang=bash>
while [ $i -le 10 ]; do
+
i=1
    echo $i
+
while [ $i -le 10 ]; do
    i=`expr $i + 1`
+
    echo $i
done
+
    i=$(($i + 1))
 +
done
  
RETEZEC="abc"
+
RETEZEC="abc"
test -l $RETEZEC -gt 1 && echo "Řetězec je delší"
+
/usr/bin/test -l $RETEZEC -gt 1 && echo "Řetězec je delší"
 +
</source>
  
 
* Logické výrazy
 
* Logické výrazy
Řádka 265: Řádka 376:
 
** <TT>výraz1 -o výraz2</TT> výraz1 nebo výraz2 je pravdivý  
 
** <TT>výraz1 -o výraz2</TT> výraz1 nebo výraz2 je pravdivý  
  
[ ! -z $HOME ] && echo "Proměnná prostředí HOME existuje"
+
<source lang=bash>
 +
[ ! -z "$HOME" ] && echo "Proměnná prostředí HOME existuje"
 +
</source>
 +
 
 +
=== Zkrácená forma příkazu if ===
 +
Místo příkazu if lze s výhodou použít zkrácenou formu. V následujícím příkladu je příkaz proveden, pokud je předchozí výraz pravdivý:
 +
 
 +
<source lang=bash>
 +
[ výraz ] && příkaz
 +
</source>
 +
 
 +
Zde je příkaz je proveden, pokud výraz vrátí nepravdu:
 +
 
 +
<source lang=bash>
 +
[ výraz ] || příkaz
 +
</source>
  
 
== Funkce ==
 
== Funkce ==
  
 
;[function] název() { ... }:
 
;[function] název() { ... }:
* klíčové slovo ''function'' není nutné použít
+
* klíčové slovo <CODE>function</CODE> není nutné použít
 
* parametry se předávají stejně, jako celému skriptu
 
* parametry se předávají stejně, jako celému skriptu
 +
* funkce může vracet hodnotu pomocí příkazu <CODE>return</CODE>
 +
 +
<source lang=bash>
 +
# nadefinování funkce soucet()
 +
function soucet() {
 +
  echo -n "$1 + $2 = "
 +
  expr $1 + $2
 +
}
 +
# volání funkce soucet() se dvěma parametry
 +
soucet 7 12
 +
</source>
 +
 +
== Reference ==
 +
<references />
  
function soucet() {
+
[[Kategorie:Práce s Linuxem]]
  echo -n "$1 + $2 = "
 
  expr $1 + $2
 
}
 
soucet 7 12
 

Aktuální verze z 24. 4. 2015, 07:51

Shellové skripty jsou zápisem příkazů do souboru, které bychom jinak zadávali postupně na příkazovém řádku.[1] Skript lze snadno spustit a vykonávat jím opakovanou činnost. Typicky se shellové skripty používají na unixových platformách,[2] ale používají se též na Microsoft Windows.[3][4]

Zápis skriptu

Pro zápis skriptu se používají různé editory pro holý text (tzv. plaintext),[5] které do souboru ukládají pouze písmena bez formátovacích značek (na rozdíl třeba od HTML nebo souborů s příponou .DOC pro Word). V grafickém prostředí lze použít nějaký jednoduchý editor, například gedit nebo gvim. V textovém prostředí pak běžné editory, jako jsou například mcedit, nano, vim a další.

Aby byl skript přímo spustitelný, musí být jméno interpretu uvedeno na prvním řádku skriptu (hned na začátku souboru). V našem případě bude na prvním řádku volán jako interpret shell BASH, takže na něm bude uvedeno:

#!/bin/bash

Dále musí mít skript nastaven příznak spuštění (eXecutable). Na příponě souboru nezáleží, ale obvykle se uvádí .sh (příponu je možné i vynechat). Pokud chceme skript spouštět pouhým zadáním jeho jména, je potřeba ho umístit do adresáře uvedeného v proměnné PATH. Takovým adresářem je obvykle automaticky adresář bin v domácím adresáři přihlášeného uživatele. Je-li umístěn skript jinde, musíme k němu uvést cestu. To platí i když je skript v aktuálním adresáři (tj. v adresáři, ve kterém právě stojíte), protože shell z bezpečnostních důvodů aktuální adresář neprohledává.

Komentáře se ve skriptech označují křížkem neboli znakem hash ("#"). Je-li komentář započat na začátku řádku, ignoruje shell celý řádek. Jinak ignoruje pouze text umístěný za značkou komentáře.

mcedit priklad.sh      # použijeme oblíbený editor (místo mcedit můžete zkusit editor nano)
chmod +x priklad.sh    # nastavíme právo spuštění
./priklad.sh           # spustíme skript z aktuálního adresáře

Ladění skriptu

Chceme-li vidět, jak se skript interpretuje, uvedeme na příslušném místě skriptu příkaz set -x a následně pak ladící výstup vypneme pomocí set +x. Také můžeme celý skript spustit s parametrem -x takto:

bash -x priklad.sh

Návratový kód

Každý příkaz v Unixu vrací návratový kód. V případě úspěchu (resp. pravdy) vrací ukončený program (nebo skritpt) podle běžně respektované dohody nulu (0). Jsou-li při provádění příkazu zjištěny problémy, je návratový kód nenulový (nejčastěji 1, tj. nepravda). Všimněte si, že je logický význam z praktického důvodu obrácen (nula je pravda). Větší hodnoty návratového kódu mohou blíže specifikovat situaci, kvůli které je vrácena chyba. Proto je potřeba při testování návratového kódu nějakého příkazu testovat jeho nenulovost (tj. netestovat, jestli vrací 1, ale jestli vrací 0 nebo cokoliv jiného). Pro ukončení skriptu a předání návratového kódu slouží příkaz exit.

# návratový kód je 1 (tj. chyba, nepravda)
exit 1

Návratový kód využívají i konstrukce podmínek a smyček, kdy se vyhodnocuje, je-li výraz pravdivý (tj. použitý příkaz vrací nulu) nebo nepravdivý (příkaz vrací číslo různé od nuly). V případě, že je použita ve výrazu kolona (pipe, trubka), vyhodnocuje se pouze návratový kód posledního příkazu v koloně. Návratový kód předchozího příkazu je v shellu ukládán do speciální proměnné $?. Pokud v shellu zadáte postupně následující dva příkazy, bude vypsána jednička (1), protože to je návratový kód příkazu false.

true
echo $?

Pomocí příkazu exit lze ukončovat shellový skript s různými návratovými kódy. Návratové kódy je možné testovat v programu, ze kterého je skript volán (může to být jiný skript, ale i shell, jak je ukázáno v předchozím příkladu).

Vložené příkazy

Někdy je potřeba nejprve něco spočítat nebo zpracovat a teprve výsledek potřebujeme použít například jako parametr jiného příkazu. V tomto případě se používá buď zpětných apostrofů (na anglické klávesnici je zpětný apostrof vlevo vedle čísla 1 v horní řadě kláves) nebo nověji konstrukce $(...), kde na místo tří teček dosadíme příkaz nebo kolonu příkazů. Novější způsob lze s výhodou používat při vnořeném vyhodnocování.

echo "Písmeno x má ve jméně právě přihlášený $(who | grep x)"

Ve výše uvedeném příkladu je nejprve vyhodnocen příkaz v závorkách, jeho výstup je dosazen na jeho původní místo, a pak je teprve proveden příkaz echo.

Alternativou je využití příkazu xargs, který svůj vstup mění na řadu parametrů:

grep -l rene@huzva.cz | xargs ls -l

Ve výše uvedeném příkladu příkaz grep vypíše seznam souborů, které obsahují adresu rene@huzva.cz a předá je na vstup příkazu xargs. Vstupující data jsou příkazem xargs přetvořena na parametry příkazu ls -l. Ve výsledku budou vypsány podrobnosti o všech souborech, které obsahují zadaný řetězec. Výhodou této konstrukce je skutečnost, že obchází limit shellu v počtu parametrů na příkazovém řádku.

Předávání parametrů

Stejně jako ostatní programy mohou shellové skripty přebírat parametry, které byly zadány při spuštění na příkazovém řádku, např:

./mujskript.sh jedna 2

Předané parametry jsou ve skriptu dostupné pomocí speciálních proměnných:

$# - počet předaných parametrů
$* - všechny předané parametry ($1 $2 atd.)
$0 - jméno skriptu (jak byl volán - nultá část z příkazového řádku)
$1 - první parametr zadaný za názvem programu
$2 - druhý parametr atd.

Příkaz shift

Příkaz shift způsobí posun všech zadaných parametrů o jednu pozici vlevo, tj. první parametr je zahozen a na jeho místo je posunut druhý parametr, na pozici druhého je posunut třetí atd.

echo Pocet zadanych parametru: $#
echo Prvni parametr: $1
shift
echo dalsi parametry: $*

Proměnné

Proměnné mohou být naplněny čísly i řetězci a shell je nerozlišuje. Některé proměnné mají speciální význam – např. proměnná PS1, která vytváří prompt (výzvu) shellu. Proměnná se definuje tak, že se do ní přiřadí hodnota. Všechny proměnné lze vypsat příkazem set. Proměnnou lze zrušit příkazem unset. Jména proměnných se obvykle píší velkými písmeny, aby se dobře odlišila od ostatních příkazů ve skriptu. Níže zapsaný skript přiřadí do proměnné CISLO nejprve trojku a pak je tato proměnná příkazem echo vypsána.

CISLO=3
echo $CISLO

Výpočet výrazu

Další skript přiřadí do proměnné CISLO dvojku. Poté obsah této proměnné sečte s číslem 12 a výsledek uloží do stejné proměnné (obsah proměnné se tedy zvýší o 12). Nakonec je proměnná vypsána:

CISLO=2
CISLO=$(($CISLO + 12))
echo $CISLO

Proměnné (a funkce) lze odstranit pomocí příkazu unset:

unset CISLO

Maximální hodnoty

Shell pracuje s čísly jako s řetězci. Maximální číslo je 9*10^18.[6]

Proměnné prostředí

Speciální postavení mají tzv. proměnné prostředí. Normální proměnné jsou platné (a dostupné) pouze v shellu (resp. programu), který je nadefinoval. Proměnné prostředí jsou však děděny i do potomků procesu, který proměnnou nadefinoval. Dají se tak předávat mezi programy data, avšak jen jednosměrně (od rodiče k potomku). Proměnné prostředí se definují příkazem export (oba uvedené příklady exportu proměnné jsou rovnocenné):

EDITOR=mcedit
export EDITOR
export VISUAL=mcedit
echo "EDITOR: $EDITOR, VISUAL: $VISUAL"

Nadefinujeme-li proměnnou VISUAL v příkazovém řádku, bude viditelná pro všechny potomky shellu, tj. pro všechny dále spuštěné programy. Příkaz echo na posledním řádku proměnnou vypisuje. Proměnná VISUAL (a EDITOR) je významná tím, že ji respektují různé programy, které používají externí editor (např. crontab, mutt a podobně). Pokud není definována, je vyvolán editor vi (což může být pro začátečníky frustrující). Nadefinujeme-li ji na hodnotu uvedenou výše, bude spuštěn program mcedit (součást programu Midnight Commander), který má (na rozdíl od vi) klasické ovládání, takže začátečník si s ním snadno poradí.

Jednorázové nastavení proměnné prostředí

Proměnnou prostředí lze nastavit jednorázově, takže bude platná jen pro jeden spouštěný program:

EDITOR=mcedit crontab -e
DISPLAY="mujpocitac:0.0" firefox

Ve výše uvedeném příkladu je nejprve spuštěn program crontab (tedy editace uživatelské tabulky programu cron), ale zároveň je jednorázově nastavena proměnná prostředí EDITOR, takže program crontab místo implicitně nastaveného editoru vi spustí editor mcedit (podle nastavené proměnné). Obdobně je na druhém řádku spuštěn program Firefox, jehož okno bude místo na lokální displej směrováno na jiný počítač (díky nastavení proměnné prostředí DISPLAY). Použité uvozovky ohraničují definovaný obsah proměnné, nejsou však poté jejím obsahem.

Řídící konstrukce

Podmínka if

if výraz; then příkazy1; [ elif příkazy2; then příkazy3; ] ... [ else příkazy4; ] fi
  • pokud je návratový kód výrazu nulový (příkaz byl úspěšný, nenastala chyba), bude provedena část příkazy1
  • jinak je provedena část příkazy2 nebo příkazy4 (pokud část elif nepoužijeme)
  • návratový kód vrací poslední provedený proces nebo 0, pokud se ještě neprovedl žádný příkaz
  • pokud použijeme kolonu příkazů, bude použita návratová hodnota posledního příkazu v koloně
  • nejrůznější testy je možné realizovat příkazem test (viz #Testovaní výrazu níže)
if grep -q huzva /etc/passwd; then
   echo yes
else
   echo no
fi

if [ -f /tmp/IAmHere ]; then
   echo "jsem tu"
fi

Cyklus while

while výraz; do příkazy; done
  • úsek do příkazy; je prováděn tak dlouho, dokud je návratový kód výrazu nulový (pravda)

Následující skript vypisuje nekonečnou řadu čísel, ukončení je pomocí CTRL+c

CITAC=1
while true; do
  echo -n "$CITAC "
  CITAC=$(($CITAC + 1))
  sleep 0.2s
done

Následující skript čeká, až se zadaný uživatel přihlásí

while who | grep -q huzva
do
   sleep 20s
done
echo "Už se odlásil"

Cyklus until

until výraz; do příkazy; done
  • úsek do příkazy; je prováděn tak dlouho, dokud je návratový kód výrazu NEnulový (NEpravda)
until who | grep huzva > /dev/null; do sleep 20s; done
echo "Už se přihlásil"

Smyčka for

for jméno [ in slovo; ] do příkazy; done
  • příkaz expanduje slovo a postupně vytvářené položky přiřazuje proměnné jméno a provádí posloupnost příkazů příkazy
  • není-li in slovo; zadáno, potom se příkazy provede pro každý poziční parametr (viz výše)
for POLOZKA in a b c d
do
    echo $POLOZKA
done

Následující skript vypisuje obsah adresáře (využívá žolíkovou expanzi), funguje tedy jako příkaz ls

for JMENO in *; do echo $JMENO; done

Ve smyčce lze použít i proměnnou. Následující příklad postupně vypíše položky proměnné KOUPIT (položky jsou odděleny mezerami):

KOUPIT="rohlik maslo mleko"
for i in KOUPIT; do
   echo $i
done

Větvení case

case slovo in
vzorek [ | vzorek ... ]) příkazy;;
...
esac
  • příkaz expanduje slovo a hledá je mezi zadanými vzorky i s použitím žolíkových znaků (používají se také pro expanzi jmen souborů)
  • jakmile se shoduje, provede se úsek příkazy
  • po nalezení první shody se dále už nehledá
echo Zadej akci a soubor:
read AKCE SOUBOR
case $AKCE in
   smaz|remove|delete) rm $SOUBOR;;
   vytvor|create)      touch $SOUBOR;
                       chmod 777 $SOUBOR;;
esac

echo Zadej odpoved
read VSTUP
case $VSTUP in
   [aAyY]*) echo ANO
            ;;
   n*|N*)   echo NE
            ;;
   *)       echo Nerozumim
esac

Řízení cyklu break a continue

Cyklus lze předčasně ukončit nebo vynutit jeho okamžitý další průběh (od jeho začátku). Tyto operace narušují pravidla strukturovaného programování avšak obvykle se používají proto, že odstraňují nutnost vkládat do cyklu další podmínky. Jejich použití by proto mělo vést ke zpřehlednění a zjednodušení cyklu (a ne naopak). Příkazy nemají vliv na právě zpracovávanou podmínku, mají vztah pouze k nadřízené smyčce.

break [n]
  • ukončí n-tou úroveň cyklu for, while, until
  • bez parametru ukončí nejbližší cyklus
continue [n]
  • zahájí další iteraci cyklu n-té úrovně
  • bez parametru zahájí další průběh nejbližšího cyklu

Přesměrování řídící konstrukce

Na celou řídící konstrukci podmínky nebo cyklu lze aplikovat přesměrování, které je pak platné pro všechny příkazy uvnitř řídící konstrukce.

for i in /etc/*; do
  [ -d "$i" ] && echo Adresář: $i
done > seznam.txt

Výše uvedený příklad zapíše seznam adresářů do souboru.

if wget -q http://www.nekde.cz/adr/file.zip; then
  mv file.zip file-$(date +%d.%m.%Y-%X)
fi > /dev/null 2>&1

Výše uvedený příklad provede operaci a nezávisle na jejím výsledku zahodí všechna chybová hlášení do /dev/null.

Příkazy true, false

Příkaz true vrací pravdu (návratový kód nula) a příkaz false vrací nepravdu (nenulový návratový kód), což je možné použít v podmínkách a podobně.

true
  • návratový kód vždy 0
false
  • návratový kód vždy 1

Následující skript je ekvivalent příkazu yes:

while true; do
    echo y
done

Testování výrazu

test výraz
[ výraz ]
  • obě uvedené formy jsou ekvivalentní (tj. chovají se naprosto stejně), [ je linka na příkaz test
  • příkaz vyhodnotí výraz a nastaví návratový kód 0 (true) nebo 1 (false)
  • v některých shellech (bash) jsou oba příkazy interní; pokud chcete volat externí program, musíte u něj uvést plnou cestu (např. /usr/bin/test)
  • Testování typu souboru
    • -f soubor soubor existuje a je normálním souborem
    • -d soubor soubor existuje a je adresářem
    • -h soubor nebo -L soubor soubor existuje a je symbolickým odkazem
    • -b soubor soubor existuje a je blokovým speciálním souborem
    • -c soubor soubor existuje a je znakovým speciálním souborem
    • -e soubor soubor existuje (pouze vestavěný příkaz test)
    • -p soubor soubor existuje a je pojmenovanou rourou
    • -S soubor soubor existuje a je socket
    • -t [fd] fd je otevřeno na terminál, vynecháme-li fd, potom se použije hodnota 1 (standardní výstup)
if [ -f /etc/shadow ]; then
   echo "V systému je nainstalováno shadow password"
fi
  • Testování přístupových práv
    • -r soubor soubor existuje a lze jej číst
    • -w soubor soubor existuje a lze do něj zapisovat
    • -x soubor soubor existuje a je proveditelný
    • -u soubor soubor existuje a má nastaven SUID bit
    • -g soubor soubor existuje a má nastaven SGID bit
    • -k soubor soubor existuje a má nastaven sticky bit
  • Testování charakteristik souborů
    • -e soubor soubor existuje
    • -s soubor soubor existuje a má velikost větší než nula
    • soubor1 -nt soubor2 soubor1 je novější (podle času poslední modifikace obsahu) než soubor2
    • soubor1 -ot soubor2 soubor1 je starší (podle času poslední modifikace obsahu) než soubor2
    • soubor1 -ef soubor2 soubor1 a soubor2 jsou na stejném zařízení a mají stejné číslo i-uzlu (tzn. jde o dva tvrdé odkazy na tentýž soubor)
  • Testování řetězců
    • -z řetězec délka řetězce je nulová
    • -n řetězec nebo řetězec délka řetězce je nenulová
    • řetězec1 = řetězec2 řetězce jsou shodné
    • řetězec1 != řetězec2 řetězce se neshodují
[ -z $HOME ] && echo "Proměnná prostředí HOME neexistuje"
  • Numerické testy
    • na místě numerického argumentu se smí vyskytovat buď číslo (může být i záporné), nebo speciální výraz
    • -l řetězec výraz je nahrazen délkou řetězce
    • číslo1 -eq číslo2 číslo1 je rovno číslo2
    • číslo1 -ne číslo2 číslo1 se nerovná číslo2
    • číslo1 -lt číslo2 číslo1 je menší než číslo2
    • číslo1 -le číslo2 číslo1 je menší nebo rovno číslo2
    • číslo1 -gt číslo2 číslo1 je větší než číslo2
    • číslo1 -ge číslo2 číslo1 je větší nebo rovno číslo2
i=1
while [ $i -le 10 ]; do
    echo $i
    i=$(($i + 1))
done

RETEZEC="abc"
/usr/bin/test -l $RETEZEC -gt 1 && echo "Řetězec je delší"
  • Logické výrazy
    • priority lze upravovat závorkami ( )
    • Pozor: nezapomenout zrušit speciální význam závorky v shellu - např. pomocí zpětného lomítka \( \)
    • ! výraz výraz je nepravdivý
    • výraz1 -a výraz2 výraz1 a výraz2 jsou pravdivé
    • výraz1 -o výraz2 výraz1 nebo výraz2 je pravdivý
[ ! -z "$HOME" ] && echo "Proměnná prostředí HOME existuje"

Zkrácená forma příkazu if

Místo příkazu if lze s výhodou použít zkrácenou formu. V následujícím příkladu je příkaz proveden, pokud je předchozí výraz pravdivý:

[ výraz ] && příkaz

Zde je příkaz je proveden, pokud výraz vrátí nepravdu:

[ výraz ] || příkaz

Funkce

[function] název() { ... }
  • klíčové slovo function není nutné použít
  • parametry se předávají stejně, jako celému skriptu
  • funkce může vracet hodnotu pomocí příkazu return
# nadefinování funkce soucet()
function soucet() {
  echo -n "$1 + $2 = "
  expr $1 + $2
}
# volání funkce soucet() se dvěma parametry
soucet 7 12

Reference

  1. http://cs.wikipedia.org/wiki/Unixov%C3%BD_shell – unixový shell
  2. http://cs.wikipedia.org/wiki/UN*X – unixové systémy, resp. platformy
  3. http://www.cygwin.com – unixové prostředí pro Microsoft Windows
  4. http://cs.wikipedia.org/wiki/Windows_PowerShell – Windows PowerShell
  5. http://cs.wikipedia.org/wiki/%C4%8Cist%C3%BD_text – holý text (čistý text)
  6. Maximum positive integer value in Bourne Shell (stackoverflow.com)