C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -1C2110 Operační systém UNIX a základy programování Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kamenice 5, CZ-62500 Brno PS/2020 Distanční forma výuky: Rev1 6. lekce / modul 1 C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -2- Proměnné C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -3- Proměnné V jazyce Bash se proměnnou rozumí pojmenované umístění v paměti, které obsahuje hodnotu. Hodnota proměnné v jazyce Bash je vždy typu řetězec (text). Nastavení proměnné: $ JMENO_PROMENNE=hodnota $ JMENO_PROMENNE="hodnota s mezerami" Přístup k hodnotě proměnné: $ echo $JMENO_PROMENNE Zrušení proměnné: $ unset JMENO_PROMENNE Přehled všech definovaných proměnných: $ set nesmí být mezera mezi jménem proměnné a = "TEXT ${PROMENNA}TEXT" pokud má být hodnota součásti textu, tak se název proměnné uvádí do složených závorek C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -4Nastavení proměnné $ JMENO_PROMENNE="hodnota s mezerami" $ JMENO_PROMENNE ="hodnota s mezerami" $ JMENO_PROMENNE= "hodnota s mezerami" $ JMENO_PROMENNE="hodnota s mezerami" program [arg1...] interpretuje se jako název programu mezera interpretuje se jako argument programu mezera interpretuje se jako název programuJMENO_PROMENNE se nastaví na prázdný řetězec, hodnota proměnná je dostupná pouze spouštěnému programu lze uvést několik proměnných a jejich hodnot (v zápisu se dvojice JMÉNO=HODNOTA oddělují mezerou), které jsou dostupné jen pro spuštěný program pokud název programu obsahuje rovnítko, musí být název uveden v uvozovkách C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -5- Řetězce V jazyce Bash lze použít čtyři typy řetězců: • bez uvozovek A=pokus B=* C=$A • s uvozovkami A="pokus hokus" B="* $A" • s jednoduchými uvozovkami (apostrof) A='pokus hokus' B='* $A' • s obrácenými jednoduchými uvozovkami (obrácený apostrof) A="`ls –d`“ B="pocet : `ls | wc –l`" nedochází k expanzi (nejedná se o argument, ale o hodnotu proměnné) nahradí se hodnotou proměnné A nahradí se hodnotou proměnné A, hvězdička se neexpanduje (je uvedena v uvozovkách) text je uveden přesně, bez žádné expanze či transformace hodnota proměnně obsahuje dvě slova oddělené mezerou do místa obrácených uvozovek se vloží standardní výstup příkazu uvedeného v uvozovkách C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -6Expanze řetězce/příkazové řádky Pořadí expanze řetězce/příkazové řádky: vstupní text (řetězec) expanze proměnných mezivýsledek expanze speciálních znaků (wildcards) výsledek pokud je text uveden ve standardních uvozovkách ("), nebo není obsažen ve slově, které by bylo možné expandovat, expanze se neprovede pokud je text uveden v jednoduchých uvozovkách (‘), expanze se neprovede Podrobněji: man bash C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -7Cvičení I 1. Nastavte proměnnou A na hodnotu 55. 2. Vypište hodnotu proměnné A (příkazem echo) 3. Vylistujte všechny proměnné nastavené v daném terminálu. Je mezi nimi proměnná A? Použijte příkaz less nebo more k zpřehlednění výpisu. 4. Použijte příkaz grep a vypište pouze řádek obsahující záznam o proměnné A. Vyhledávací vzor zvolte tak, aby byl nezávislý na hodnotě proměnné. 5. Vypište všechny nastavené proměnné, jejichž jména začínají písmenem A (grep ^TEXT). 6. Změňte hodnotu proměnné na "tohle je dlouhy retezec". 7. Vypište hodnotu proměnné A. 8. Zrušte proměnnou A. 9. Ověřte, že jste proměnnou zrušili (postupem řešeným v bodě 4). 10. Postupně nastavujte proměnné A, B a C podle příkladů uvedených na straně 5. Postupně ověřujte jejich hodnotu příkazy set a echo. Analyzujte případné rozpory. Pracujte v interaktivním režimu shellu. C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -8Aritmetické operace C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -9Aritmetické operace Možné zápisy: (( I = I + 1 )) (( I++ )) Aritmetická operace se získáním výsledku: I=$(( I + 1 )) echo "Hodnota I zvetsena o jedna : $(( I + 1 ))" Další informace: man bash hodnotu výsledku se vypíše do místa zápisu • Aritmetické operace s celými čísly lze vykonat v bloku (( ... )). • Znaky se v bloku interpretují jako názvy proměnných. Proto není nutné používat operátor $ pro získávání jejich hodnoty. • Hodnoty proměnných se interpretují jako celá čísla. Pokud konverze selže, tak se použije nulová hodnota. C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -10Aritmetické operace Možné zápisy: (( I = I + 1 )) (( I++ )) Aritmetická operace se získáním výsledku: I=$(( I + 1 )) echo "Hodnota I zvetsena o jedna : $(( I + 1 ))" Další informace: man bash hodnotu výsledku se vypíše do místa zápisu • Aritmetické operace s celými čísly lze vykonat v bloku (( ... )). • Znaky se v bloku interpretují jako názvy proměnných. Proto není nutné používat operátor $ pro získávání jejich hodnoty. • Hodnoty proměnných se interpretují jako celá čísla. Pokud konverze selže, tak se použije nulová hodnota. vhodnější zápis C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -11- Operátory = přiřazení + sčítání - odčítání * násobení / celočíselné dělení % zbytek po celočíselném dělení (modulo) ++ inkrementace (zvýšení hodnoty o 1) –- dekrementace (snížení hodnoty o 1) Příklad: A=5 (( B = A / 3 )) (( C = A % 3 )) echo $A $B $C 5 1 2 C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -12Příkaz expr Příkaz expr vyhodnocuje matematické výrazy, výsledky se tisknou do standardního výstupu. Další informace: man expr Příklady: $ expr 1 + 2 3 $ expr 2 \* 3 6 I=`expr $I + 1` výsledek vložíme do proměnné I \ zabrání expanzi speciálního znaku * na jména souborů a adresářů nacházejících se v aktuálním adresáři předáváme hodnotu proměnné, je nutné použít operátor $ Další možností je použití příkazu bc, který umí pracovat i s reálnými čísly. C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -13Cvičení II 1. Napište skript, ve kterém nastavíte proměnné A a B na hodnoty 5 a 6. Dále postupně vypisujte hodnotu součtu, rozdílu, podílu a násobení hodnot v proměnných A a B pomocí příkazu echo. C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -14Proměnné a procesy C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -15- Procesy Proměnné Proces: pid, ppid Proces: pid, ppid Proměnné rodičovský proces dceřiný proces • Prvním spuštěným procesem po spuštění systému je proces “init/systemd” • Každý příkaz spuštěný v shellu (příkazové řádce) je procesem pid = identifikátor procesu ppid = identifikátor rodičovského procesu Proces je instance běžícího programu. paměť vyhrazená pro proměnné C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -16Proměnné a procesy Proměnné Proces: pid, ppid Proces: pid, ppid Proměnné rodičovský proces dceřiný proces Každý proces má vyhrazenou část pro ukládání hodnot proměnných. Dceřiný proces v okamžiku svého spuštění získá kopii proměnných (exportovaných) a jejich hodnot od rodičovského procesu. Tyto proměnné může dle potřeby měnit nebo mazat. Dále může nastavovat nebo mazat nové proměnné. Všechny tyto změny však po skončení dceřiného procesu zaniknou. Změny se neprojeví na hodnotách původních proměnných rodičovského procesu. Export proměnné: $ export JMENO_PROMENNE $ export JMENO_PROMENNE="hodnota" export export s přiřazením C2110 Operační systém UNIX a základy programování 6. lekce / modul 1 -17Cvičení III $ ./print_C $ C="hodnota 1" ./print_C $ echo $C $ C="hodnota 2" $ echo $C $ ./print_C $ export C $ ./print_C 1. Zrušte proměnnou PATH. Jak se změna projeví na funkcionalitě příkazové řádky? Zkuste spustit příkaz ls a pwd. Chovaní vysvětlete. 2. Kdy se provede expanze divokého znaku * v následujícím příkladu: 3. Napište skript s názvem print_C, který vypíše hodnotu proměnné C. Vysvětlete chování v následujících příkladech: $ B="Obsah adresare je *" $ echo $B Pracujte v novém terminálu.