Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
bash_pokračování [2012/10/19 14:20]
212.79.108.75 doplnění prvního řádku skriptu do code
bash_pokračování [2019/02/25 18:21] (aktuální)
Řádek 1: Řádek 1:
 +====== Bash pokračování ======
 +
 +Bash pokračování navazuje na [[Bash úvod]] a seznámí Vás s pokročilými technikami skriptovacího jazyka Bash. V této části se dozvíte jak používat proměnné a řídící struktury. Také budete schopni napsat své první jednoduché skripty.
 +
 +====== Diakritika ======
 +
 +{{.:​info.png}} U programování skriptů nepoužívejte diakritiku pro názvy proměnných či funkcí. Na výstupu čeština nevadí, ale u proměnných může způsobovat problémy.
 +
 +====== Způsob zápisu ======
 +Doporučuji používat následující způsob: \ 
 +  * na jednotlivý řádek souboru = jeden řádek kódu
 +  * nad každý řádek kódu = jeden řádek komentáře,​ v počátcích Vám to hodně pomůže
 +
 +{{.:​info.png}} Pokud chcete na jeden řádek napsat více příkazů, oddělte jej středníkem **;** !
 +
 +====== Sudo ======
 +Tento magický příkaz slouží k tomu, abyste se svým účtem mohli vykonávat úkony, které může pouze správce. Je to velká výhoda, protože kdyby tento příkaz neexistoval,​ mohli byste si nedopatřením smazat třeba celý systém.
 +
 +{{.:​info.png}} Pokud při vykonávání programů narazíte na **Access Denied** nebo **Přístup odepřen** jedná se o to, že vstupujete do oblasti, kde platí jenom **Sudo**.
 +
 +{{.:​info.png}} **Přístup odepřen** může také nastat, pokud máme např. instalujeme balík do systému a chceme jinším programem přistupovat do správy balíků. První proces si totiž zablokuje přístup pro svou činnost a dalšími programy se tam dostanete až po dokončení tohoto procesu.
 +
 +{{.:​warning.png}} U **Sudo** platí také následující věc: Pokud nevíte co děláte nebo si nejste jistí, raději se poraďtě někde na internetu než se do toho pustíte. **Radši třikrát měřit než jednou špatně řezat**. Největší zkázu tento příkaz provede u rekurzivního mazání **rm -fr /** ! Pokud na to narazíte na internetu, tak to berte pouze jako vtípek, protože tento příkaz Vám zformátuje celý disk !
 +
 +====== Komentáře ======
 +V Bashi se komentáře označují znakem mřížky **#**, všechno za tímto znakem je ignorováno a slouží to především k tomu, abyste ve velkém kusu kódu věděli co dělá která část.
 +
 +{{.:​info.png}} Doporučuji používat hodně komentářů,​ lépe se pak hledají chyby.
 +
 +====== Příprava skriptu ======
 +Nyní Vám poradím jak si začít psát vlastní skript.\ ​
 +  * Pokud máte otevřen terminál, vytvořte si nový soubor **touch skript.sh**. Tento soubor můžete také vytvořit přes **Geany -> Uložit jako**. Koncovka **.sh** značí že se jedná o skript, nezáleží na ní, ale jedná se nám o zpřehlednění skriptu od ostatních programů pomocí koncovky.
 +  * Nyní si spusťte libovolný editor pro úpravu textu. Doporučuji používat [[Geany]] nebo [[Vim]].
 +  * Jako první řádek každého bashové skriptu musí být následující řádek:
 +<​code>​
 +#!/bin/bash
 +</​code> ​ * To pak říká interpretu jazyka Bash to, že se jedná o skript.
 +  * Nyní soubor uložte, musíme mu nastavit příznak spustitelnosti,​ aby se dal spouštět.
 +  * To proveďte v konzoli přes příkaz:
 +<​code>​
 +chmod +x skript.sh
 +</​code> ​ * A tento skript budeme v konzoli spouštět takto:
 +<​code>​
 +./skript.sh
 +</​code> ​ * Skript by se měl spustit a ukončit bez chyb, pokud vše dopadlo jak má, skript je připraven.
 +  * Nyní budete všechny Vaše kusy kódy a příkazy psát od druhého řadku dolů.
 +
 +{{.:​info.png}} Pokud jsou na této stránce někde kusy kódu a chybí tam hlavička **#​!/​bin/​bash**,​ tak se počítá s tím, že je napsána na prvním řádku.
 +
 +====== Proměnné ======
 +Pro uchování dat používá každý programovací jazyk proměnné a Bash není výjimkou. Proměnné v Bashi nemají svůj datový typ, proto se do nich dá ukládat cokoliv. Mají pevně definovanou syntax: \ 
 +<​code>​
 +promenna=obsahPromenne
 +</​code>​
 +{{.:​info.png}} **Deklarace** je pouze alokování proměnné a **definice** je přiřazení hodnoty do této proměnné.
 +
 +{{.:​warning.png}} Dbejte na to, abyste používali proměnné, které mají již nějakou hodnotu !
 +
 +Proměnná se skládá ze svého **názvu** a **obsahu**.\ ​
 +**Název** může obsahovat písmena a čísla (**nesmí začínat číslem !**), které vystihují to, jakých bude proměnná nabývat hodnot
 +**Obsah** může být cokoliv, textový řetězec, číslo nebo výstup programů\ ​
 +
 +Pomocí následující příkladů Vám demonstruji použití proměnných:​ \ 
 +<​code>​
 + # definice promenne s deklaraci
 +promenna="​ahoj svete"
 + # promennou vypiseme pres echo
 +echo "​$promenna"​
 + # ekvivalentni vypis je take takto, vsimnete si jak ji obteka text
 +echo "​data:​${promenna}:​data"​
 + # promenna muze take nest obsah prikazu, používáme speciální uvozovky ``
 +promenna2=`ls`
 + # vypiseme promenna2
 +echo "​$promenna2"​
 + # ukazka prepsani promenne
 +pom="​ahoj"​
 +pom="​nazdar"​
 +pom="​cau"​
 + # toto vypise cau, protoze je to posledni vec co se priradila do promenne pom
 +echo "​$pom"​
 +</​code>​
 +====== Read ======
 +Read je příkaz pro získání dat od uživatele.\ ​
 +Syntaxe: \ 
 +<​code>​
 +read PROMENNA
 +</​code>​
 +Následující příkaz mluví za vše: \ 
 +<​code>​
 +echo -n "​Zadejte svuj vek: "
 +read vek
 +echo "Vas vek je $vek"
 +</​code>​Do proměnné **vek** je uložen vstup od uživatele a následně vypsán.
 +
 +====== If ======
 +If je řídící struktura, která slouží k rozhodovací podmínce **jestli něco platí či neplatí dělej**.\ ​
 +
 +Syntaxe: \ 
 +<​code>​
 + # Jednoduchý If
 +if [ podmínka ] ; then
 +   kus kódu, který se vykoná pokud platí podmínka
 +fi
 +
 + # Složený If
 +if [ podmínka ] ; then
 +   kus kódu, který se vykoná pokud platí podmínka
 +else
 +   kus kódu, který se vykoná pokud neplatí podmínka
 +fi
 +
 + # Složený If s dalším If
 +if [ podmínka ] ; then
 +   kus kódu, který se vykoná pokud platí podmínka
 +elif [ podmínka2 ] ; then
 +   kus kódu, který se vykoná pokud platí podmínka2
 +fi
 +</​code>​
 +Příklad: \ 
 +<​code>​
 +pom="​2"​
 +if [ ! "​$pom"​ -eq "​2"​ ] ; then
 +   echo "Neni to cislo dva"
 +else
 +   echo "Je to cislo dva"
 +fi
 +</​code>​
 +===== Podmínky =====
 +Podmínky můžou být následující:​ \ 
 +  * Řetězce:
 +  * **$promenna** délka řetězce je nenulová
 +  * **-z $promenna** délka řetězce je nulová
 +  * **"​$promenna"​ = "​$promenna2"​** řetězce jsou shodné
 +  * **"​$promenna"​ != "​$promenna2"​** řetězce jsou různé
 +  * Čísla:
 +  * **"​$promenna"​ -eq "​$promenna2"​** čísla jsou shodná
 +  * **"​$promenna"​ -ne "​$promenna2"​** čísla jsou rozdílná
 +  * **"​$promenna"​ -le "​$promenna2"​** promenna1 <= promenna2
 +  * **"​$promenna"​ -lt "​$promenna2"​** promenna1 < promenna2
 +  * **"​$promenna"​ -ge "​$promenna2"​** promenna1 >= promenna2
 +  * **"​$promenna"​ -gt "​$promenna2"​** promenna1 > promenna2
 +  * Soubory:
 +  * **"​$promenna"​ -ef "​$promenna2"​** soubory sdílí stejný i-uzel
 +  * **"​$promenna"​ -nt "​$promenna2"​** první soubor je novější než druhý
 +  * **"​$promenna"​ -no "​$promenna2"​** první soubor je starší než druhý
 +  * **-e "​$promenna"​** soubor existuje
 +  * **-d "​$promenna"​** soubor je adresář
 +  * **-f "​$promenna"​** soubor je obyčejný soubor
 +  * **-L "​$promenna"​** soubor je symbolický odkaz
 +  * **-w "​$promenna"​** soubor je zapisovatelný
 +  * **-x "​$promenna"​** soubor je spustitelný
 +
 +{{.:​info.png}} Pokud před výraz napíšu vykřičník **!**, celý výraz se neguje. Takže pokud mám např. **-e soubor** že testuje jestli soubor existuje, tak **! -e soubor** testuje jestli soubor neexistuje !
 +
 +===== Řetězení podmínek =====
 +Podmínky se dají spojovat do jedné přes operátor **&&​** log. AND a **||** log. OR.\  Abych to vysvětlil matematicky,​ tak **&&​** znamená **a současně**. Takže musí platit všechny podmínky, aby byla splněna výsledná podmínka. Místo toho **||** znamená **nebo**, takže stačí aby platila jedna z podmínek.\ ​
 +Způsob zápisuje je dvojí: \ 
 +<​code>​
 +if [ -e "​$pom"​ ] && [ -e "​$pom2"​ ] || [ -e "​$pom3"​ ] ; then ...
 +</​code>​Testuje jestli současně platí test existence souborů v proměnných **pom** a **pom2**. Tyto soubory musí oba existovat aby platila podmínka. Pokud jeden neexistuje, podmínka nikdy platit nebude. V tomto případě je třetí podmínka zbytečná.
 +
 +Druhý styl je ve výsledku stejný jako u prvního, ale způsob zápisu mně příjde elegantnější:​
 +<​code>​
 +-o znamená nebo, ||, OR
 +-a znamená a současně, &&, AND
 +if [ -e "​$pom"​ -a -e "​$pom2"​ -o -e "​$pom3"​ ] ; then ...
 +</​code>​
 +====== Switch ======
 +Switch je takový rozsáhlejší **If**.
 +
 +<​code>​
 +case "​$USER"​ in # promenna $USER
 +  root | honza ) # hodnoty: root nebo fuky
 +    echo "Ahoj Honzíku"​
 +    ;;
 +  * ) # vsechno ostatni moznosti
 +    echo "Ahoj uživateli"​
 +    ;;
 +esac
 +</​code>​
 +====== While ======
 +While patří k cyklům.
 +
 +<​code>​
 +while [ "​1"​ = "​1"​ ] # cyklus vcetne podminky
 +do # smycka po done, co se neustale opakuje, dokud plati podminka
 +   #echo
 +   echo "Dalsi slovo <​enter>,​ konec <:​exit>"​
 +   echo -n "Vase volba: "
 +   read data
 +   if [ "​$data"​ = ":​exit"​ ] ; then
 +      break # break slouzi k vlastnimu ukonceni cyklu a pokracovani dal, v toku programu
 +   fi
 +done # konec cyklu
 +</​code>​
 +====== For ======
 +For patří k posledním zástupcům cyklů. Používáme jej tehdy, když chceme zajistit nějaký určitý (i neurčitý) počet
 +opakování bloku příkazů.
 +
 +<​code>​
 +for i in {1..5} # promenna i bude v rozsahu 1 az 5
 +do # 5x se provede tento blok
 +   echo "​Promenna i = $i"
 +done
 +
 +# Jina syntaxe = stejny efekt
 +for (( i=1; i<=5; i++ ))
 +do
 + echo "​Promenna i = $i"
 +done
 +</​code>​
 +====== Funkce ======
 +Funkce se v bashi mají syntax:
 +
 +<​code>​
 +function nazevFunkce {
 +   # prikazy pro provedeni funkce
 +}
 +</​code>​
 +Funkce se poté ve skriptu volá takto:
 +<​code>​
 +nazevFunkce
 +</​code>​
 +====== Závěr ======
 +Tohle je pouze základní přehled nástrojů bashe a jeho použití ve vlastních skriptech. Pro lepší pochopení a naučení se dělání vlastních skriptů,
 +zkuste si podle návodu používat mnou vytvořené skripty.
 +
 +====== Odkazy ======
 +  * [[http://​cs.wikibooks.org/​wiki/​Bash#​Podm.C3.ADnky_a_testy|Odkaz]] na cs.wikibooks.org,​ kde je krátký návod na Bash