Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Shell jako programovací jazyk Příkazy větvení Dva operátory pro tvorbu podmíněných příkazů if, case Obecný formát: if podmínka then příkaz1 [else příkaz2]

Podobné prezentace


Prezentace na téma: "Shell jako programovací jazyk Příkazy větvení Dva operátory pro tvorbu podmíněných příkazů if, case Obecný formát: if podmínka then příkaz1 [else příkaz2]"— Transkript prezentace:

1 Shell jako programovací jazyk Příkazy větvení Dva operátory pro tvorbu podmíněných příkazů if, case Obecný formát: if podmínka then příkaz1 [else příkaz2] fi Klíčová slova musí být od předcházejícího textu oddělena středníkem nebo CR, na místě podmínky operátor true, false, libovolný příkaz. Každý program po svém ukončení nastavuje stavový příznak, 0 – úspěšné ukončení (true), kladné – neúspěšné ukončení (false). Přístupnost stavového příznaku - $? grep 0 – alespoň jeden výskyt 1 – žádný výskyt 2 – syntaktická chyba $ if false > then echo “To nepujde” > else echo “To by slo” > fi To by slo $

2 Shell jako programovací jazyk Po prvním řádku shell přechází na prompt druhé úrovně, v každé větvi struktury if – fi může být i více příkazů. $ if true > then echo “Prave je: “ > date > else > echo “Prave bylo: “ > date > fi Prave je Saturday Mar 31 08:44: $ $ cat kde.2 # vyhledani uzivatele echo “zadej jmeno uzivatele: read jmeno if who | grep $jmeno then echo -n "" else echo "$jmeno neni prihlasen" fi $ kde.2 zadej jmeno uzivatele: vdumek vdumek ttyq0 Mar 31 08:36 $

3 Shell jako programovací jazyk Příkaz test Slouží k vyhodnocení pravdivostní hodnoty výroku (existence souboru, hodnota proměnných, …). Existují dvě syntaxe, první používá samotné jméno příkazu test, druhá místo slova test používá hranaté závorky ([]), do kterých uzavírá přepínače a argumenty. test -přepínač argument [ -přepínač argument ] Závorky musí být z obou stran obklopeny mezerami (odlišení od použití při náhradě znaků v argumentech příkazů). $ if test $karel > then echo “karel existuje” > else echo “karel neexistuje” > fi $

4 Shell jako programovací jazyk Přepínače pro rozhodování na základě vlastností souborů test -f soubor vrací hodnotu true, pokud soubor existuje (není speciální, ani adresář) test -r soubor vrací hodnotu true, pokud soubor existuje a lze z něj číst test -w soubor vrací hodnotu true, pokud soubor existuje a lze do něj psát test -x soubor vrací hodnotu true, pokud soubor existuje a lze jej spustit test -d soubor vrací hodnotu true, pokud soubor existuje a je to adresář test -s soubor vrací hodnotu true, pokud soubor existuje a má nenulovou velikost

5 Shell jako programovací jazyk $ cat cp.safe # cp.safe soubor1 soubor2 # kopíruje soubor soubor1 do souboru soubor2 # pokud soubor2 existuje, ohlásí chybu if [ -f $2 ] then echo "cp.safe: soubor $2 existuje !" else cp $1 $2 fi $ Vícenásobné větvení if podmínka1 then příkaz1 elif podmínka2 then příkaz2 … elif podmínkaN then příkazN else příkazN fi

6 Shell jako programovací jazyk $ cat cp.safe.2 # cp.safe.2 soubor1 soubor2 # kopíruje soubor soubor1 do souboru soubor2 # pokud soubor2 existuje, ohlásí chybu if [ -f $2 ] then echo "cp.safe.2: soubor $2 existuje !" elif [ -f $2/$1 ] then echo "cp.safe.2: soubor $2/$1 existuje !" else cp $1 $2 fi $ Druhý argument může být i jméno adresáře

7 Shell jako programovací jazyk $ cat cp.safe.3 # cp.safe.3 soubor1 soubor2 # kopíruje soubor soubor1 do souboru soubor2 # pokud soubor2 existuje, ohlásí chybu if [ -f $2 ] then echo "cp.safe.3: soubor $2 existuje.\nprepsat? [A/N]" read prepsat elif [ -f $2/$1 ] then echo "cp.safe.3: soubor $2/$1 existuje.\nprepsat? [A/N]" read prepsat else cp $1 $2 fi if [ $prepsat = A ] || [ $prepsat = a ] then cp $1 $2 fi $ prikaz1 && prikaz2 prikaz 2 se provede, pokud prikaz1 skonci uspesne prikaz1 || prikaz2 prikaz 2 se provede, pokud prikaz1 skonci neuspesne

8 Shell jako programovací jazyk Operátor = slouží k porovnání shodnosti dvou řetězců, pro porovnání shodnosti celých čísel použijeme operátory: -eqvrací true, pokud jsou čísla shodná -nevrací true, pokud nejsou čísla shodná -gtvrací true, pokud je číslo za operátorem větší -ltvrací true, pokud je číslo před operátorem menší -levrací true, pokud je číslo před operátorem menší nebo rovno -gevrací true, pokud je číslo před operátorem větší nebo rovno Pro budování složitějších konstrukcí je možné používat unární operátor ! (negace výrazu), operátor logického součtu -o a logického součinu -a echo zadej prvni cislo: read prvni echo "zadej druhe cislo: " read druhe echo "zadej treti cislo:" read treti echo "zadej ctvrte cislo:" read ctvrte zadej prvni cislo: 5.45 zadej druhe cislo: 4.24 zadej treti cislo: 3.65 zadej ctvrte cislo: a 2. stejne nebo 3. > >= 3. if [ $prvni -eq $druhe ] || [ $treti -gt $ctvrte ] then echo "1. a 2. stejne nebo 3. > 4." fi if [ $prvni -ge $treti ] then echo "1. >= 3." else echo "1. < 3." fi

9 Shell jako programovací jazyk Příkaz exit Slouží k ukončení provádění scénáře. Je-li uveden argument, stává se stavovým příznakem, který vrací scénář shellu (doporučuje se zachovávat konvenci návratu 0 při úspěšném provedení) Příkaz expr Nástroj pro zpracování aritmetických výrazů. Argumenty bere jako aritmetické výrazy (pouze celočíselné, musí být odděleny mezerami), vyhodnocuje je a výsledek předává na standardní výstup. … read prepsat else cp $1 $2 || exit … $ expr $ expr / 3 3 $ expr `expr 1 + 7` / 3 2 $ pet=`expr 2 + 3` $ echo $pet 5 $

10 Shell jako programovací jazyk Příkaz case Další příkaz pro větvení, obecný formát: case slovo in vzor1) příkaz1 ;; vzor2) příkaz2 ;; … esac Provádí se postupné porovnání s jednotlivými vzory, je-li vzor shodný se slovem, provede se odpovídající příkaz. Jednotlivé vzory pro společný příkaz jsou odděleny znakem |. Ve vzorech se může používat i zástupných znaků *, ?, […], "…", '…', \ $ cat cp.safe.4 # cp.safe.4 soubor1 soubor2 # kopiruje soubor1 do soubor2 # pokud soubor2 existuje, řeší se to if [ -f $2 ] then echo "soubor $2 existuje! [p] prepsat [z] zmenit jmeno [n] neprepisovat" read prepsat elif [ -f $2/$1 ] then echo "soubor $2/$1 existuje! [p] prepsat [z] zmenit jmeno [n] neprepisovat" read prepsat else cp $1 $2 || exit fi case $prepsat in p|P) cp $1 $2 ;; z|Z) cp $1 $2. ;; esac

11 Shell jako programovací jazyk Příkazy pro iterace Operátor for for proměnná in seznam_hodnot do příkazy done proměnné jsou postupně přiřazovány hodnoty uvedené v seznamu_hodnot a pro každou hodnotu se provedou příkazy těla cyklu. Seznam hodnot je často tvořen jmény souborů. $ cat maz # script maze soubory v aktuálním # adresáři po interaktivním dotazu for soubor in * do echo "smazat $soubor? [A/N]" read odpoved case $odpoved in [aA]*) rm $soubor ;; esac done $ $ cat cyklusfor for cislo in 1 2 echo "Prubeh pro: $cislo" done $ cyklusfor Prubeh pro: 1 Prubeh pro: 2 $ $ cat cyklusfor1 for cislo in [1-2] echo "Prubeh pro: $cislo" done $ cyklusfor1 Prubeh pro: [1-2] $

12 Shell jako programovací jazyk $ cat cyklusfor2 for cislo in $* echo "Prubeh pro: $cislo" done $ cyklusfor2 a b c d e Prubeh pro: a Prubeh pro: b Prubeh pro: c Prubeh pro: d Prubeh pro: e $ $ exi1 1 parametr je vetsi, roven 0 vratim cislo 1 $ exi1 -5 parametr je mensi nez 0 vratim cislo -5 $ $ cat exi echo "vratim cislo $1" exit $1 $ $ cat exi1 if [ $1 -lt 0 ] then echo "parametr je mensi nez 0" echo `exi $1` else echo "parametr je vetsi, roven 0" echo `exi $1` fi $

13 Shell jako programovací jazyk Příkazy pro iterace Operátor while Jde o jakousi kombinaci příkazů for a if, kdy se o provedení iterace rozhoduje na základě vyhodnocení podmínky. Tělo cyklu je uzavřeno do konstrukcí do … done. while podmínka do příkazy done Podmínkou může být i provedení příkazu (úspěšné provedení - nulová hodnota - splněná podmínka) $ cat uz.je.pryc while who | grep vdumek > /dev/null sleep 60 done echo "uz sel k certu !!" $ /dev/null - soubor, který slouží k přesměrování rušivých výstupů, zaslaná data jsou ztracena. Script je potřeba spustit na pozadí (&), jinak by byl terminál blokován.

14 Shell jako programovací jazyk Příkazy pro iterace Operátor until Inverze operátoru while: until podmínka do příkazy done Příkazy těla cyklu se provádějí, pokud je podmínka nepravdivá. V podmínce cyklů while a until se často využívá příkaz test. Break, continue Slouží k ukončení cyklů. Break způsobí přechod na následující příkaz za done, fi, esac. Continue má za následek započetí nové iterace, aniž by se provedly příkazy za continue. $ cat uz.je.tady until who | grep vdumek > /dev/null sleep 60 done echo "Pozor, Dumek je tady !!" $

15 Shell jako programovací jazyk Funkce Shell umožňuje uživateli definici vlastních funkcí: jméno_funkce () {jméno_funkce () příkazy{ … příkazy } … } Jménem funkce může být libovolný řetězec, kulaté závorky oznamují shellu, že se jedná o definici funkce, mezi složenými závorkami jsou uvedeny příkazy, které má funkce vykonávat. $ cdl () { > cd $1 > echo -n "Adresar: " > pwd > ls -la | more > } $ $ cat u_cdl echo "Zadej jmeno adresare: " read adresar cdl $adresar $ Funkce se vyvolá svým jménem a případnými argumenty. Může být volána jak z příkazového řádku, tak ve scénáři. Shelovské funkce nelze exportovat. Řešením problému je operátor. (tečka), který zajistí spouštění argumentu v aktuální kopii shellu.

16 Shell jako programovací jazyk $ ucdl zadej jmeno adresare: /usr/people ucdl[3]: cdl: not found $. ucdl zadej jmeno adresare: /usr/people Adresar je: /usr/people total 64 drwxr-xr-x 12 root sys 4096 Feb 23 13:44. drwxr-xr-x 37 root sys 4096 Nov 15 12:38.. drwxr-xr-x 9 guest guest 4096 Jan guest drwxr-xr-x 17 heriban user 4096 Jan heriban drwxr-xr-x 3 jdvorak user 96 Apr jdvorak drwxr-xr-x 3 jroupec user 96 Nov jroupec drwxr-xr-x 9 sandera user 4096 May sandera drwxr-xr-x 94 root sys 4096 Feb 28 10:44 students drwxr-xr-x 11 vdumek user 4096 Apr 2 19:13 vdumek drwxr-xr-x 3 zbyzel user 88 Nov 5 13:58 zbyzel $

17 Shell jako programovací jazyk $ sh -x neni + who + grep root + echo root uz je pryc root uz je pryc $ $ sh -v neni while who | grep root > /dev/null do sleep 10 done echo "root uz je pryc" root uz je pryc $ Ladění scriptů -x průběh scénáře (+) -v podrobnější informace


Stáhnout ppt "Shell jako programovací jazyk Příkazy větvení Dva operátory pro tvorbu podmíněných příkazů if, case Obecný formát: if podmínka then příkaz1 [else příkaz2]"

Podobné prezentace


Reklamy Google