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? | ||
+ | </ |