Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| — |
vyuka:podminky_a_cykly [2023/11/15 20:54] (aktuální) |
||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| + | ===== Řídící konstrukce v shellu ===== | ||
| + | Dnes si ukážeme podmínku '' | ||
| + | Průběžně si také ukážeme několik pomocných příkazů - '' | ||
| + | ---- | ||
| + | ==== test === | ||
| + | Příkaz, jehož aliasem je hranatá závorka - '' | ||
| + | Vrací true / false, ovšem pouze jako návratový kód. Má smysl ho tedy používat právě v podmínkách. | ||
| + | |||
| + | Nejdůležitější použití: | ||
| + | <code bash> | ||
| + | # FUNKCE SE SOUBORY | ||
| + | # Existuje soubor file? | ||
| + | test -e file | ||
| + | |||
| + | # Lze do souboru file zapisovat? | ||
| + | test -w file | ||
| + | |||
| + | # FUNKCE S ŘETĚZCI | ||
| + | # Je proměnná $A neprázdná? | ||
| + | test -n " | ||
| + | |||
| + | # Je proměnná $A prázdná? | ||
| + | test -z " | ||
| + | |||
| + | # FUNKCE S ČÍSLY | ||
| + | # Je $A stejná jako (equals) $B ? | ||
| + | test $A -eq $B | ||
| + | |||
| + | # Je $A menší než (lesser then) $B? | ||
| + | test $A -lt $B | ||
| + | |||
| + | # Je $A menší nebo rovna (lesser or equal then) $B? | ||
| + | test $A -le $B | ||
| + | |||
| + | # Je $A větší než (greater then) $B? | ||
| + | test $A -gt $B | ||
| + | | ||
| + | # Je $A větší nebo rovna (greater or equal then) $B? | ||
| + | test $A -ge $B | ||
| + | </ | ||
| + | Více ve [[http:// | ||
| + | |||
| + | Použití v podmínce if: | ||
| + | ==== if ==== | ||
| + | Za '' | ||
| + | |||
| + | Nejjednodušší: | ||
| + | <code bash> | ||
| + | if [příkaz podmínky] | ||
| + | then | ||
| + | [příkazy k vykonání] | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | Použití '' | ||
| + | <code bash> | ||
| + | if [příkaz podmínky] | ||
| + | then | ||
| + | [udělej cosi] | ||
| + | else | ||
| + | [udělej něco jiného] | ||
| + | fi | ||
| + | </ | ||
| + | Použití '' | ||
| + | <code bash> | ||
| + | read num | ||
| + | if [ $num -eq 5 ] | ||
| + | then | ||
| + | echo "Cislo je vetsi nez pet" | ||
| + | elif [ $num -lt 5 ] | ||
| + | echo "Cislo je mensi nez pet" | ||
| + | else | ||
| + | echo "Jina moznost" | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | Pozor: | ||
| + | * Tam kde jsou odřádkování skutečně musí být odřádkování - nebo středník ; | ||
| + | * nezapomeňte na '' | ||
| + | |||
| + | |||
| + | === Příklady === | ||
| + | < | ||
| + | if test $A -eq $B | ||
| + | then | ||
| + | echo "A je rovno B!" | ||
| + | else | ||
| + | echo "A se nerovná B." | ||
| + | fi | ||
| + | |||
| + | if [ $A -lt $B ] | ||
| + | then | ||
| + | echo "A je menší než B" | ||
| + | elif [ $A -gt $B ] | ||
| + | echo "A je větší než B" | ||
| + | elif [ $A -eq $B ] | ||
| + | echo "A je stejné jako B" | ||
| + | else | ||
| + | # Možná to nejsou čísla | ||
| + | echo " | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | === Úloha: === | ||
| + | Jak ve scriptu zkontrolovat, | ||
| + | |||
| + | ---- | ||
| + | ==== expr ==== | ||
| + | '' | ||
| + | |||
| + | Například tedy: | ||
| + | <code bash> | ||
| + | expr 5 + 5 | ||
| + | expr 3 \* 2 | ||
| + | </ | ||
| + | (Nezapomeňme, | ||
| + | |||
| + | Každý člen výrazu musí být samostatný parametr - tedy oddělený od ostatních mezerou. Vypočítat pomocí '' | ||
| + | <code bash> | ||
| + | expr 5 \* 3 + 8 | ||
| + | </ | ||
| + | |||
| + | Lze použít (odescapované) závorky - pro změnu priority operací: | ||
| + | <code bash> | ||
| + | expr 5 \* \( 3 + 2 \) | ||
| + | #Vypíše 25 | ||
| + | |||
| + | expr 5 \* 3 + 2 | ||
| + | #Vypíše 17 | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | <code bash> | ||
| + | # | ||
| + | expr $1 + $2 | ||
| + | |||
| + | #Zvýšení hodnoty proměnné | ||
| + | a=`expr $a + 1` | ||
| + | |||
| + | ---- | ||
| + | ==== seq ==== | ||
| + | Příkaz '' | ||
| + | <code bash> | ||
| + | seq 1 5 | ||
| + | #vypíše 1 2 3 4 5 | ||
| + | </ | ||
| + | |||
| + | Lze ale i změnit krok (navyšovat o deset a ne o jednu, nebo dokonce záporně) - se třemi parametry jako | ||
| + | |||
| + | '' | ||
| + | <code bash> | ||
| + | seq 10 -2 1 | ||
| + | #vypíše 10 8 6 4 2 | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | ====read==== | ||
| + | '' | ||
| + | Dá se použít například v interaktivní kalkulačce: | ||
| + | <code bash> | ||
| + | #!/bin/sh | ||
| + | echo "Zadej prvni cislo" | ||
| + | read a | ||
| + | echo "Zadej druhe cislo" | ||
| + | read b | ||
| + | echo " | ||
| + | </ | ||
| + | ---- | ||
| + | ===for=== | ||
| + | <code bash> | ||
| + | for promenna in seznam | ||
| + | do | ||
| + | prikaz | ||
| + | done | ||
| + | </ | ||
| + | Přičemž '' | ||
| + | Mohou to být čísla: | ||
| + | <code bash> | ||
| + | for a in 1 2 3 4 | ||
| + | do | ||
| + | expr $a * $a | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | Stejně tak to ale mohou být i slova: | ||
| + | <code bash> | ||
| + | for a in stul zidle lampa skrin | ||
| + | do | ||
| + | echo $a je kus nabytku | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | Je tedy vidět, na co se nám hodí příkaz '' | ||
| + | |||
| + | Cyklus "pro všechna čísla od 1 do 100 vypiš jejich dvojnásobky" | ||
| + | < | ||
| + | for a in `seq 1 100` | ||
| + | do | ||
| + | expr $a \* 2 | ||
| + | done | ||
| + | |||
| + | ---- | ||
| + | ===while=== | ||
| + | <code bash> | ||
| + | while podminka | ||
| + | do | ||
| + | prikaz | ||
| + | done | ||
| + | </ | ||
| + | Cyklus while se opakuje, dokud je podmínka splněna. Je tedy potřeba zajistit, aby někdy splněna byla - jinak cyklus nikdy neskončí. | ||
| + | |||
| + | Podmínka ve '' | ||
| + | <code bash> | ||
| + | a=0 | ||
| + | while [ $a -le 100 ] | ||
| + | do | ||
| + | echo $a | ||
| + | | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | Nebo na čtení ze vstupu pomocí příkazu '' | ||
| + | <code bash> | ||
| + | while read radek | ||
| + | | ||
| + | echo " | ||
| + | done | ||
| + | |||
| + | Nebo na čtení ze souboru: | ||
| + | <code bash> | ||
| + | while read radek | ||
| + | do | ||
| + | echo " | ||
| + | done < soubor | ||
| + | </ | ||
| + | (pozor na soubory které nekončí znakem nové řádky!) | ||
| + | |||
| + | === Úloha:=== | ||
| + | Vytvořte script secti.sh, který sečte všechny svoje parametry (které jsou číselné). | ||
| + | Tj. například | ||
| + | <code bash> | ||
| + | ./secti.sh 1 4 5 12 | ||
| + | 22 | ||
| + | </ | ||
| + | |||
| + | === Úloha === | ||
| + | Script, který očísluje řádky vstupu / souboru. | ||
| + | Tj ze souboru | ||
| + | < | ||
| + | ahoj | ||
| + | svete | ||
| + | jak se mas? | ||
| + | </ | ||
| + | udělá: | ||
| + | < | ||
| + | 1 ahoj | ||
| + | 2 svete | ||
| + | 3 jak se mas? | ||
| + | </ | ||