AUTOMATIZACE ÚKONŮ SPRÁVY OPERAČNÍCH SYSTÉMŮ II. Ing. Petr Klimša

Podobné dokumenty
PROGRAMOVÁNÍ V SHELLU

PSK3-9. Základy skriptování. Hlavička

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Skripty - úvod. Linux - skripty 2

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Sekvenční a podmíněné provádění

ŘÍDÍCÍ STRUKTURY - PODMÍNKY

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Proměnné a parametry. predn_08.odt :00:38 1

C2110 Operační systém UNIX a základy programování

C2110 Operační systém UNIX a základy programování

Střední odborná škola a Střední odborné učiliště, Hořovice

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

PRACUJEME S SHELLEM Ať žije BASH.

Úvod do Unixu. man: příkaz pro zobrazení nápovědy k danému příkazu, programu (pokud je k dispozici), např. man cp. pwd: vypíše cestu k aktuální pozici

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

8 Třídy, objekty, metody, předávání argumentů metod

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Střední odborná škola a Střední odborné učiliště, Hořovice

Linux-příkazový řádek

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

6. Příkazy a řídící struktury v Javě

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Úvod do Linuxu. SŠSI Tábor 1

Základní příkazy OS UNIX

Rozšíření ksh vůči sh při práci s proměnnými

Úloha 3 editor a skripty. připojte se vzdáleně na dray6.feld.cvut.cz heslo získáte na adrese

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

PHP tutoriál (základy PHP snadno a rychle)

6 Příkazy řízení toku

Stručný návod k programu Octave

Úvod do Operačních Systémů

Algoritmizace a programování

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Základy operačního systému LINUX část III

Unix je víceuživatelský a víceúlohový OS

BASH. Kouzla s příkazovou řádkou. Petr Koloros

Úvod do Operačních Systémů

Algoritmizace a programování

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Systém souborů (file system, FS)

Základní příkazy pro práci se soubory

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

ALGORITMIZACE A PROGRAMOVÁNÍ

Přednáška 1. Úvod. Historie OS Unix. Architektura OS Unix. Interpret příkazů. SHELL. Zpracování příkazové řádky. Speciální znaky. Zkratky příkazů.

LINUX SOUBORY. Zadejme příkaz ls l! V této lekci se odrazíme od dlouhého výpisu příkazu ls a uvidíme, kam nás to zanese. SPŠ Teplice - 3.

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Programovací jazyk Pascal

Základní příkazy UNIXu (Linuxu)

DUM 06 téma: Tvorba makra pomocí VBA

Identita uživatelů, přístupová práva. Linux

Operační systémy. Cvičení 1: Seznámení s prostředím

Pro označení disku se používají písmena velké abecedy, za nimiž následuje dvojtečka.

ANOTACE vytvořených/inovovaných materiálů

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Cvičení 2. Přesměrování vstupu a výstupu. Posloupnost příkazů. Příkazy pro informaci o uživatelích

- jak udělat konstantu long int: L long velka = 78L;

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky.

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

UŽIVATEL, SKUPINA, PROCES

Algoritmizace a programování

MAXScript výukový kurz

Tabulkový procesor. Základní rysy

2 Datové typy v jazyce C

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Úvod do Operačních Systémů

VISUAL BASIC. Práce se soubory

Základy PERLu snadno a rychle

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Formátové specifikace formátovací řetězce

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

5 Přehled operátorů, příkazy, přetypování

LINUX ADRESÁŘOVÁ STRUKTURA. Co to, hrome, je? V této lekci se budeme brouzdat adresáři. SPŠ Teplice - 3.V

Úvod do programování. Lekce 1

1. Umístěte kurzor do sloupce Datový typ na řádek s polem, ve kterém vytvořit chcete seznam.

Přednáška 5. Identita uživatelů, procesů a souborů. Přístupová práva a jejich nastavení. Úvod do Operačních Systémů Přednáška 5

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

10 Algoritmizace Příklad 2 Word 2007/ VBA

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Programování v C++, 2. cvičení

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Zápis programu v jazyce C#

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Paměť počítače. alg2 1

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Programování v jazyce C a C++

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Úvod do Operačních Systémů

Operační systém UNIX

A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk

Přednáška 1. Úvod. Historie OS Unix. Architektura OS Unix. Interpret příkazů SHELL. Zpracování příkazové řádky. Speciální znaky. Zkratky příkazů.

Sada 1 - PHP. 03. Proměnné, konstanty

Nastroje na zpracovani textu:

Úvod do programovacích jazyků (Java)

Transkript:

AUTOMATIZACE ÚKONŮ SPRÁVY OPERAČNÍCH SYSTÉMŮ II Ing. Petr Klimša ORLOVÁ 2013

Název: Autor: Vydání: Počet stran: 67 Určeno pro projekt: Číslo projektu: Automatizace úkonů správy operačních systémů II Ing. Petr Klimša první Dílčí kvalifikace nástroj pro efektivní získání kvalifikace a cesta k rychlé změně kompetencí CZ.1.07/3.2.07/03.0122 Vydavatel: Gymnázium a Obchodní akademie, Orlová, p. o. Ing. Petr Klimša Gymnázium a Obchodní akademie, Orlová, p. o.

Obsah: Úvod... 3 1. A zpátky k shellu (Linuxový shell)... 5 1.1. Proměnné shellu... 7 1.1.1. Podmíněné příkazy... 10 1.1.2. Často používané proměnné... 11 1.2. Podmínky... 12 1.2.1. Porovnání výrazů příkaz test... 12 1.2.2. Podmíněné příkazy (podmínky)... 14 1.3. Cykly... 18 1.3.1. Cyklus for... 18 1.3.2. Cyklus while... 22 1.3.3. Cyklus until... 23 1.4. Dodatky:... 25 1.5. Skripty... 27 Shrnutí:... 32 2. Přehled programovacích nástrojů... 34 3. Regulární výrazy... 36 3.1. Přehled regulárních výrazů... 36 3.1.1. Závorkování regulárních výrazů... 39 3.1.2. Pravidla pro aplikaci regulárních výrazů... 39 3.1.3. Možnosti výběru logické OR... 39 3.1.4. Rozšířené regulární výrazy... 40 3.2. Nástroje grep, egrep, sed, awk a regulární výrazy... 40 3.2.1. grep a egrep... 40 3.2.2. sed... 40 3.2.3. awk... 41 Shrnutí:... 41 Kontrolní otázky:... 41 4. Základy jazyka C... 42 4.1. Základní charakteristika... 42 4.2. Datové typy... 44 4.2.1. char... 44 4.2.2. řetězec znaků... 45 4.2.3. Prázdný datový typ void... 45 1

4.2.4. Celočíselné datové typy char, short int, int, long... 45 4.2.5. Reálná čísla float, double... 46 4.2.6. Logické datové typy... 46 4.2.7. Pole... 46 4.3. Vstup a výstup programu... 46 4.3.1. Parametry předané na vstupu programu... 46 4.4. Podmínky... 47 4.5. Cykly... 48 4.6. Knihovny v C a kompilace kódu... 49 4.3.2. Kompilace kódu... 50 4.7. Funkce v C... 50 Shrnutí:... 54 Kontrolní otázky:... 54 5. Základy jazyka Python... 56 5.1. Datové typy... 57 5.1.1. Řetězce znaků a operace s řetězci... 57 5.1.2. Prázdný datový typ... 57 5.1.3. Celá čísla a reálná čísla... 57 5.1.4. Logické datové typy... 58 5.1.5. Seznamy... 58 5.1.6. Slovník (hash; asociativní pole)... 60 5.1.7. Pole... 60 5.2. Vstup a výstup programu... 60 5.2.1. Parametry předané na vstupu programu... 60 5.3. Podmínky... 61 5.4. Cykly... 62 5.5. Funkce v Pythonu... 63 5.6. Moduly v Pythonu... 63 5.6.1. Přehled standardních modulů a některých jejich funkcí.... 65 5.6.2. Tvorba vlastních modulů... 66 Shrnutí:... 66 Kontrolní otázky:... 66 2

Úvod Právě jste otevřeli studijní materiál, který vám má usnadnit studium široké oblasti programování skriptů v Linuxu. Účelem tohoto studijního materiálu je poskytnout základní přehled o možnostech programování, s kterými se jako správce operačního systému můžete setkat, a poskytnout vám úvodní vhled do problematiky. Studijní materiál se zabývá tvorbou skriptů v shellu Bash, základy jazyka C a Python. Je ovšem nutné vás upozornit, že se opravdu jedná jen o základy, které je nutné rozšiřovat dalším studiem. Vzhledem k provázanosti jednotlivých témat bych vám doporučil, abyste při čtení nespěchali a pokud to jen půjde, tak abyste si procvičovali teorii praxí. A právě vzhledem k vzájemné provázanosti témat, pojmů a principů fungování bych vám určitě doporučil se vracet k již prostudovaným kapitolám nebo používat další literaturu. Uvidíte, že při každém dalším čtení vám budou probírané pojmy jasnější. Autor 3

POUŽÍVANÉ SYMBOLY Průvodce studiem vstup autora, doplnění textu Informace co se v kapitole dovíte Klíčová slova Čas potřebný ke studiu kapitoly Důležité pojmy nebo početní vztahy Příklad objasnění problematiky nebo řešený příklad Úkol k zamyšlení nebo cvičení Otázky a úkoly řešení najdete v rámci opory Řešení úkolů vážou se na konkrétní úkoly a otázky Část pro zájemce rozšíření látky, pasáže jsou dobrovolné Shrnutí shrnutí látky, shrnutí kapitoly Literatura Korespondenční úkol 4

1. A zpátky k shellu (Linuxový shell) Klíčové pojmy: shell, speciální znaky (metaznaky), proměnné shellu, astributy proměnných, skript, interaktivní skript, argumenty (parametry) skriptu, spouštění skriptu, podmínky a podmíněné příkazy, příkazy cyklu. Jestli se ptáte, proč takový podezřelý název kapitoly, tak to souvisí s tím, že základní informace o Shellu jsou uvedeny v opoře Instalace a konfigurace operačního systému Linux, na kterou opora, již právě začínáte číst, navazuje. Vím, že celá opora se má zabývat skriptování v Linuxu, ale dříve než se začnete věnovat samotnému skriptování, je potřeba rozšířit vaše dosavadní znalosti o Shellu a základních příkazech. Proč? Protože skriptování je vlastně seskupování příkazů do jednoho souboru a abyste mohli efektivně vytvářet skripty, měli byste zvládnout Shell, pro který budete skripty vytvářet. Uvidíte, že už i v této kapitole začnete se skriptováním, protože budete zapisovat příkazy, které pak jen ve skriptech zřetězíte. Shell je rozhraní pro komunikaci s uživatelem (pracovní prostředí). Můžete se setkat s rozdělení shlellů na: interaktivní shell zpracovává příkazy zadané ze standardního vstupu uživatelem, tzn. obvykle z klávesnice ( příkazy zadané v příkazové řádce). neinteraktivní shell zpracovává příkazy ze souboru (používá se k vykonání skriptu) Skript je posloupnost příkazů skriptovacího jazyka uložená v souboru. Podle použitého jazyka (případně interpreteru) se můžete setkat s shellovými skripty, PHP skripty, ASP skripty apod. Skripty jsou, na rozdíl od zkompilovaných programů, čitelné, takže pokud znáte daný jazyk, můžete s větší či menší námahou určit, co má daný skript dělat. V Linuxu se používá celá řada shellů (asi nejpoužívanějším je shell Bash): sh (Bourne shell) bash (Bourne again shell) csh (C shell) tcsh (TENEX C shell) ksh (Korn shell) a řada dalších. Zadávání příkazů: na jeden řádek je možné napsat více příkazů za sebou oddělených středníkem příkazy jsou pak vykonány tak, jak byly zapsány za sebou a jednotlivé příkazy jsou spuštěny až po ukončení předchozího příkazu clear; pwd;ls -l more; středník, mezera, ampersand (&) patří mezi tzv. metaznaky a nejsou shellem předávány jako argument programu, protože slouží ke specifikaci příkazů. oba metaznaky (středník i ampersand) ukončují příkazy. Pokud napíšete příkaz a neukončíte jej ani ampersandem ani středníkem, systém si to vyloží jako by byl ukončen středníkem. & zajišťuje spuštění příkazu na pozadí 5

chcete li spustit více příkazů na pozadí, pak zadejte: pwd & ls & ampersand ukončuje příkaz pwd a zároveň říká, že má být spuštěn na pozadí Mezi další metaznaky patří >, >>, <, <<, které jsou používány k přesměrování výstupu Zástupné (speciální) znaky zástupný znak popis ~ domovský adresář aktuálně přihlášeného uživatele ~jméno domovský adresář uživatele jméno (např. ~petr označuje domovský adresář uživatele petr)? jeden libovolný znak * libovolný počet libovolných znaků \znak právě jeden konkrétní znak [množina] libovolný znak z množiny znaků Je li přihlášen uživatel petr, pak příkaz cd ~/dokumenty je chápán jako příkaz cd /home/petr/dokumenty. Potřebujete li z nějakého důvodu použít například v názvu souboru speciální znak např. hvězdičku tak, aby jej systém chápal jako normální nikoli zástupný znak, zadejte před takový znak zpětné lomítko. Podívejte, jak je na obrázku použita hvězdička. V prvním případě je chápána jako zástupný znak, takže systém vypsal jména všech soborů v adresáři, kdežto v druhém případě systém pochopil, že má vypsat (dáno příkazem echo) znak hvězdička na obrazovku. Zpětné lomítko si proto představte jako přepínač, který ze speciálních znaků dělá obyčejné a z obyčejných speciální (např. \n je znak pro nový řádek). V Linuxu má svůj speciální význam také použití apostrofů a uvozovek. apostrofy všechno mezi apostrofy je bráno jako obyčejný text, tedy i speciální znaky apostrofy je vhodné použít právě pro text obsahující speciální znaky obrácené apostrofy `` umožňují výsledek jednoho příkazu vložit do druhého příkazu. Podívejte se na následující obrázek v části o uvozovkách. uvozovky vypínají nahrazování jmen (souborů, adresářů apod.), ale ponechávají funkční příkazy pro historii, proměnné, obrácené apostrofy a zpětné lomítko Předání argumentů mezi procesy Výstup jednoho procesu je vstupem druhého procesu a proces je vykonán, až jsou vygenerovány všechny jeho argumenty. Podívejte se na příklad na obrázku. 6

Příkaz echo vypíše zadané argumenty na standardní výstup (obvykle obrazovku). Příkaz echo, jehož úkolem je vypsat zprávu na obrazovku, není spuštěn dříve, než se dozví informace z procesu date a whoami. Pokud chcete upravit výstup příkazu na obrázku o smazání obrazovky a pár prázdných řádků, postačí jen příkaz upravit: clear; echo; echo; echo Ahoj, dnes je $(date) a jsi prihlasen jako $(whoami) Poznámka: předání výstupů mezi procesy lze provést místo závorek i pomocí apostrofů, ale ve složitějších příkazech to může být nepřehledná, proto raději použijte zde uvedený způsob pomocí závorek. Př.: cp $( find. - type f -name dopis* ) ~/zaloha Nejdříve systém vyhledá v aktuálním adresáři všechny soubory, jejichž jméno začíná slovem dopis a předá je jako vstup příkazu cp, který zkopíruje vyhledané soubory do podadresáře zaloha v domovském adresáři aktuálně přihlašeného uživatele 1.1. Proměnné shellu každá proměnná má svoje jméno, atributy a obsah (hodnotu) pozor, shell nerozlišuje, na rozdíl od programovacích jazyků, datové typy proměnných. Všechny proměnné jsou řetězec znaků, což s sebou přináší výhodu, že proměnné není nutné deklarovat, ale také nevýhodu, že nelze jednoduše porovnávat hodnoty proměnných mezi sebou. V shellu se vyskytují 3 typy proměnných (neplést s datovými typy, který, jak jsme si již řekli, je jen jeden): 1) vnitřní proměnné shellu jejich inicializaci a naplnění se stará shell sám obvykle jsou jen ke čtení 2) uživatelské proměnné definované uživatelem názvy jsou složeny z písmen a čísel (alfanumerické znaky) 3) proměnné speciálního významu uchovávají informace o běžících procesech, předávaných argumentech apod. názvy proměnný jsou ze speciálních znaků obvykle je uživatel nemůže upravit (jejich hodnoty jsou jen ke čtení) Přiřazení hodnoty proměnné inicializace proměnné a její naplnění hodnotou se provádí pomocí znaku = názvy proměnných se zapisují velkými písmeny platí to, na co jste zvyklí z většiny programovacích jazyků, že na levé straně je proměnná a na pravé straně hodnota proměnné. Přiřazení se provádí: PROMENNA=hodnota tzn., že do proměnné PROMENNA se přiřadí uvedená hodnota (JMENO=petr). JMENO $JMENO označuje proměnnou označuje hodnotu uloženou v proměnné JMENO 7

Př.: pokud není hodnota proměnné uvedena, shell to chápe jako pokyn k odstranění proměnné daného jména do proměnné je možné přiřadit výstup příkazu. Například do proměnné DATUM se vloží jako hodnota výstup příkazu date: DATUM=$(date) $proměnná ${ proměnná } ${ proměnná - výraz } ${ proměnná = výraz } ${ proměnná + výraz } hodnota proměnné hodnota proměnné, přičemž složené závorky slouží pro oddělení názvu proměnné od okolí (pro přehlednost) v případě, že je proměnná definována, je výsledkem její hodnota, ale v případě, že proměnná není definována, je výsledkem výraz a proměnná zůstává nedefinována v případě, že je proměnná definována, je výsledkem její hodnota, ale v případě, že proměnná není definována, je proměnná nadefinována a výraz je zapsán jako hodnota proměnné od této chvíle existuje proměnná s hodnotou obsazenou ve výrazu. Je li proměnná definována, je vrácena hodnota výraz, ale v případě, že proměnná není definována, není vrácena žádná hodnota. atributy proměnných Mezi atributy proměnných patří: viditelnost (děditelnost) neměnitelnost viditelnost (děditelnost): platí, že proměnné použité v jednom shellu se nepředávají do druhého shellu (proměnné a jejich hodnoty vytvořené v jednom shellu nejsou dostupné z vnořeného shellu (vnořeným shellem se rozumí shell, který byl spuštěn z jiného shellu). Na obrázku vidíte, že z shellu je spuštěn pomocí příkazu bash další šel, a v něm není definována proměnná POZDRAV. V nadřazeném shellu má proměnná POZDRAV hodnotu ahoj. Spuštění nového shellu bash. V podřízeném shellu nemá proměnná POZDRAV definovanou hodnotu. Pozn. shell ukončíte příkazem exit 8

Aby proměnné byly dostupné z vnořených shellů, musí se zviditelnit pmocí příkazu export. V podřízeném shellu má proměnná POZDRAV, která byla v nadřazeném shellu exportována, viditelnou hodnotu ahoj Příkaz export provede přenesení proměnné a její hodnoty i do vnořených shellů. Tzn., že proměnná se stane viditelná. Změna hodnoty proměnné ve vnořeném shellu se neprojeví v shellu nadřazeném. Změna v nadřazeném shellu se ale projeví ve vnořeném shellu. V nadřazeném shellu má proměnná pozdrav hodnotu ahoj. Otevření podřízeného shellu V podřízeném shellu má proměnná hodnotu ahoj. Následně je v podřízeném shellu hodnota změněna. Návrat do původního nadřazeného shellu. V nadřazeném shellu zůstala hodnota proměnné na původní hodnotě ahoj. Proměnné lze exportovat z nadřazeného shellu do podřízeného, ale opačně ne. Chcete li, aby se určité proměnné dědily do podřízeného shellu pokaždé, když se uživatel přihlásí, exportujte tyto proměnné v některém z inicializačních skriptů (~/.profile apod.). neměnitelnost: slouží k tomu, aby proměnná byla jen ke čtení (není možné změnit její hodnotu) k nastavení atributu proměnné na jen ke čtení slouží příkaz readonly uvedený před názvem proměnné nastavení proměnné jen ke čtení platí jen v daném shellu a nepřenáší se do vnořených shellů. jakmile je proměnná nastavena na jen ke čtení, není možné tento atribut odvolat. Proměnnou pak nelze odstranit a zanikne až ukončením shellu proměnné speciálního významu Jedná se o proměnné (uvedené v tabulce), které jsou jen ke čtení a jejich hodnoty mění samotný shell. Jsou označeny speciálními znaky. speciální obsahují hodnoty o proměnná $$ PID shellu $! PID posledního procesu spuštěného na pozadí $? návratová hodnota posledního dokončeného procesu celočíselná hodnota (obvykle popsaná v manuálový stránkách 9

daných programů) hodnota 0 znamená, že proces proběhl bez chyb Arimtmetické oprace v Shellu aritmetické operace mají tvar: $[výraz] 1.1.1. Podmíněné příkazy k podmíněnému řízení příkazů se používá návratová hodnota uložená ve speciální proměnné $? využívají se metaznaky && a, které se používají ve tvaru: příkaz1 && příkaz2 příkaz1 příkaz2 příkaz2 je vykonán, jestliže návratová hodnota příkazu 1 je nula (neboli příkaz2 je vykonán, jestliže příkaz1 proběhl bez chyb) příkaz2 je vykoná, je li návratová hodnota příkazu1 <>0 (neboli jestliže příkaz1 skončil s chybou, je vykonán příkaz2) V Linuxu existují dva programy (příkazy), které mají vždy stejnou a předem definovanou návratovou hodnotu. Jsou to příkazy true a false. False má vždy návratovou hodnotu 1 (tzn. chybu) a příkaz true vrací vždy návratovou hodnotu 0 (tzn. bez chyb). Př.: mkdir zaloha && cd zaloha Příkaz2 (cd zaloha) se provede pouze v případě, že příkazu mkdir se povedlo vytvořit nový adresář záloha Př.: mkdir zaloha echo nemohu vytvořit adresar zaloha Pokud příkaz mkdir zaloha skončí s chybou, je vypsaná zpráva nemohu vytvorit adresar zaloha. Všimněte si, že schválně není použito hlášení adresář již existuje, protože příčin, proč uživatel nemůže vytvořit adresář, může být více - např. uživatel nemá potřebná oprávnění. Když se pozorně podíváte na předchozí obrázek, zjistíte, že se vypsala 2 hlášení. Co podniknete, abyste zajistili, že se systémové hlášení nebude vypisovat? Pošlete je do zařízení null, které slouží k zahození toho, co nechceme. K podmíněnému řízení příkazů můžete pomocí metaznaků && a zřetězit více příkazu za sebou. Vyhodnocování pak probíhá zleva doprava. 10

Protože jsme nepřesměrovali systémové hlášení na zařízení /dev/null, objevilo se na obrazovce. Protože je použit metaznak && vykoná se příkaz cd zaloha pouze v případě, že příkaz mkdir vrátí návratovou hodnotu 0, tzn., bude úspěšný ve vytvoření adresáře zaloha. Protože je použit metaznak &&, příkaz cd zaloha1 se vykoná pouze v případě, že příkaz mkdir zaloha1 byl úspěšný Protože je použit metaznak, vykoná se příkaz mkdir zaloha1 pouze v případě, kdy v proměnné $? bude uložena jiná hodnota než 0 (tzn. předchozí příkaz skončil s chybou). A protože příkaz mkdir zaloha skončil s chybou a příkaz cd zaloha se ani nevykonal, je ve speciální proměnné $? hodnota 1. Proto se vykoná příkaz mkdir zaloha1. 1.1.2. Často používané proměnné S některými často používanými proměnnými shellu jste se již seznámili ve sbírce Instalace operačního systému a jeho konfigurace II. Linux. Nyní je o některé doplníme a ukážeme si pár příkladů s použitím právě nabytých znalostí o proměnných. CDPATH seznam adresářů oddělených dvojtečkou, který systém použije, jestliže selže příkaz cd. HISTFILE název souboru, v němž je zapsán seznam naposledy použitých příkazů. Defaultně se jedná o soubor ~/.bash_history HISTFILESIZE počet řádků (příkazů), které systém udržuje v souboru s historii příkazů HISTSIZE počet příkazů, které shell udržuje v paměti a můžete je vyvolat pomocí šipek na klávesnici HOME cesta k domovskému adresáři Př.: Zjistěte, v kterém souboru se uchovávají příkazy, které aktuálně přihlášený uživatel použil. Příkazy vypište Příkaz echo vypíše z proměnné HISTFILE cestu k souboru s historií příkazů a tato cesta je pak předána jako vstupní argument příkazu cat. Protože příkazů může být více, je zajištěno pomocí příkazu more, že se budou vypisovat po stránkách. Př. Zjistěte, kolik příkazů systém udržuje v paměti. Změňte tuto hodnotu na 10. echo $HISTSIZE; HISTSIZE=10 Nezapomeňte, že pokud změníte hodnotu proměnné, platí tato změna jen po dobu aktuálního sezení. Tzn. po novém přihlášení bude na původní hodnotě. Chcete li hodnoty proměnných změnit trvale, musíte provést jejich změnu v inicializačních skriptech shellu (buď pro všechny uživatele nebo pro příslušného uživatele). HOSTNAME jméno počítače HOSTTYP architektura počítače LC_ALL definuje národní prostředí. Hodnota této proměnné překrývá nastavení ostatních proměnných s názvem LC_ a slouží k natavení lokálních zvyklostí jak jazyk, datum, čas apod. MAIL cesta k souboru s poštou 11

PATH seznam adresářů oddělených tečkou, v kterých systém hledá zadaný příkaz PWD obsahuje hodnotu aktuálního adresáře RUNLEVEL číslo úrovně běhu, v němž se systém nachází RANDOM proměnná jejíž hodnota je pseudonáhodné číslo. Při každém výpisu hodnoty vrátí z generátoru náhodných čísle jiné číslo. SHLVL úroveň vnoření shellu. Po přihlášení má shell úroveň 1. Po přihlášení je úroveň vnoření shellu =1 Spuštění dalšího shellu Bash. Jeho úroveň vnoření = 2. Po ukončení vnořeného shellu jsme opět v úrovni vnoření =1. TERM nastavení emulace terminálů UID UID aktuálně přihlášeného uživatele USER username aktuálně přihlášeného uživatele Pokud přemýšlíte, jak zjistit seznam proměnných, které jsou v shellu vytvořeny, pak existuje jednoduchý způsob: zadejte příkaz echo znak $ a dvakrát zmáčkněte klávesu tabulátor. Systém se vám bude snažit nabídnout ke znaku $ pokračování a vypíše vám seznam existujících proměnných. 1.2. Podmínky 1.2.1. Porovnání výrazů příkaz test Pro porovnání výrazů se používá příkazy test a příkaz [], které mají stejný význam a provedou porovnání: dvou řetězcových hodnot dvou celočíselných hodnot vlastností souborů (stáří, typ souborů apod.) Výsledkem porovnání výrazu je návratová hodnota nula nebo jedna, která je uložena ve speciální proměnné $?. Návratová hodnota nula je vrácena, jestliže je výraz pravdivý, a jednička, jestliže je výraz nepravdivý. 12

Operátory pro porovnání řetězců řetězec délka řetězce není nulová (je nenulová) -z řetězec délka řetězce je nulová řetězec1 = řetězec2 řetězce jsou shodné řetězec1!= řetězec2 řetězce se nerovnají (jsou různé) Operátory pro porovnání číselných hodnot hodnota1-eq hodnota2 hodnoty jsou shodné hodnota1-le hodnota2 hodnota1 je menší nebo rovno než hodnota2 hodnota1-lt hodnota2 hodnota1 je menší než hodnota2 hodnota1 -ge hodnota2 hodnota1 je větší nebo rovno než hodnota2 hodnota1 -gt hodnota2 hodnota1 je menší než hodnota2 hodnota1 -ne hodnota2 hodnoty se nerovnají Často se testování řeší tak, že se nepoužívá příkaz test, ale pouze hranaté závorky. Pozor mezi hranatými závorkami a samotným výrazem musí být mezery! Mezi výrazem a hranatými závorkami musí být mezera. Provádí se testování, zda zapsaný výraz je pravdivý (tj. zda řetězce jsou stejné). Protože výraz je pravdivý (řetězce jsou stejné), je výsledkem testu návratová hodnota 0. Ještě častěji se testování a výpis hodnoty návratové proměnné zadávají z důvodu přehlednosti na jednom řádku. Když si na to zvyknete, nezapomenete zadat v případě, kdy to potřebujete, zapsat příkaz k vypsání návratové hodnoty. Výše uvedené příklady byly více méně bez praktického použití. Proč také zadávat, aby nám Linux porovnal, zda řetězec abc je stejný s řetězcem abcd. To víme, že není. Podívejte se na následující příklad, ve kterém potřebujete zjistit, zda se systém právě teď nachází v domovském adresáři uživatele. [ $(pwd) = $HOME]; echo $? Vrátí hodnotu aktuální pozice (v kterém adresáři se nacházíme) Vrátí cestu k domovskému adresáři aktuálně přihlašeného uživatele. Vypíše výslednou hodnotu porovnání Porovná, zda jsou řetězce (v tomto případě dvě cesty k adresářům) stejné. Protože se uživatel aktuálně nachází v kořenovém adresáři, vrátí porovnání přítomnosti v domoském adresáři hodnotu 1, čili nepravda. Uvedený příklad můžete ještě upravit například takto: [ $(pwd) = $HOME]; echo Nejste v domovskem adresari Pro testování vlastností souborů se používají operátory uvedené v následující tabulce. Nezapomeňte, že i adresář je vlastně soubor, takže jej pomocí operátorů uvedených v tabulce můžete testovat také. 13

Operátory pro testování vlastností souborů (adresářů) soubor1 -ef soubor2 oba soubory sdílejí stejný i node soubor1 -nt soubor2 soubor1 je novější než soubor2 soubor1 -ot soubor2 soubor1 je starší než soubor2 -e soubor soubor existuje -d soubor soubor existuje a je adresář -f soubor soubor je obyčejný soubor -L soubor soubor je symbolický odkaz -r soubor soubor je čitelný (je k němu oprávnění read) -s soubor soubor není prázdný (má velikost větší než 0) -w soubor soubor je zapisovatelný -x soubor soubor je spustitelný Na následujícím obrázku si můžete prohlédnout, jak se testuje, zda objekt zaloha v aktuálním adresáři je nebo není adresář. Pro řadu programátorů zvyklých na použití podmínek ve tvaru if.. then..else může být zápis pomocí hranatých závorek a zřetězení příkazů méně přehledný. V takovém případě můžete použít klasických struktur příkazu if, o němž se dozvíte v následující části. Testované výrazy lze spojovat pomocí logických spojek AND a OR, k čemuž můžete použít následující parametry. Logické operátory -a spojí 2 testy pomocí AND -o spojí 2 testy pomocí OR 1.2.2. Podmíněné příkazy (podmínky) slouží k podmíněnému vykonání příkazů obecná syntaxe: if.. then else ukončení podmínky se provádí pomocí fi návratová hodnota je 0 (true) nebo 1 (false) Syntaxe a použití příkazu if if výraz; then příkazy; fi jestliže platí výraz, vykonej příkazy if výraz; then příkazy1;else příkazy2; jestliže platí výraz, vykonej příkazy1, jinak fi vykonej příkazy2 if výraz; then příkazy1;podmínky; fi jestliže platí výraz, vykonej příkazy, jinak kde podmínky se zadávají ve tvaru: plat li podmínka, vykonej její příkazy, jinak elif výraz; then příkazy;elif platí li podmínka, vykonej její příkazy Všimněte si, že za výraz a příkazy se vkládají středníky. Dejte si na tuto skutečnost pozor, ať se zbytečně netrápíte při hledání chyby, proč podmínka nefunguje. Použití příkazu if si ukážeme na jednoduchých příkladech. Všechny následující příklady budou vycházet ze situace na obrázku, kde si všimněte, že: soubor1 je prázdný (má nulovou velikost), kdežto soubor2 obsahuje data o velikosti 4B. 14

adresář pokus1 je prázdný, kdežto pokus2 obsahuje ještě soubor3. Všimněte si ale, že přestože v adresáři pokus1 nejsou uloženy žádné soubory nebo podadresáře, je jeho velikost 4KB. Př. Vytvořte skript testuj, který příjme jako vstupní parametr jméno adresáře a pokusí se přejít zadaného adresáře. Pokud se mu to nepovede, vypíše zprávu Nelze vstoupit do adresáře, v opačném případě zahlásí úspěch. Přesměruje chybové hlášení, aby systém v případě, že zadaný adresář neexistuje, neobtěžoval vlastním hlášením. Vstupní argument (jméno adresáře) Jiný způsob zápisu příkazu test. Pozor na mezeru mezi výrazem a hranatými závorkami!!! Př. Vytvořte skript testuj2, který jako vstupní parametr přijme název objektu v aktuálním adresáři a zjistí, zda daný objekt v aktuálním adresáři existuje a zda je adresář nebo soubor. V případě, že objekt neexistuje, vypíše o tom zprávu. Poznámka: Nezapomeňte, že vše v Linuxu je soubor! Použitím kulatých závorek si neuškodíte, spíše si zápis zpřehledníte. #!/bin/bash #!/bin/bash cd $1 2>/dev/null if [ $? = 0 ]; then echo Prechod do adresare $1 je mozny; else echo Nelze vstoupit do adresare $1; fi if (test -e $1); then if (test -d $1); then echo Objekt $1 je adresar.; else echo Objekt $1 neni adresar.; fi; else echo Objekt $1 neexistuje.; fi Porovná návratovou hodnotu naposledy provedeného příkazu (uloženou v proměnné $?), což byl příkaz cd $1. Pokud byl příkaz úspěšný, tzn., že se povedlo vstoupit do adresáře, tak vrátil hodnotu 0. Parametry příkazu test: -e vrací true (0), jestliže soubor existuje -d vrací true (0), jestliže se jedná o adresář Vnořená podmínka. Adresář pokus1 na rozdíl od adresáře pokus existuje. 15

Př. Napište skript, který zjistí, zda zadaný soubor existuje a je prázdný. Pro zjišťování existence souboru (nezapomeňte, že v Linuxu je i adresář soubor) můžete využít parametrů příkazu test: e vrací hodnotu true, jestliže soubor existuje s vrací hodnotu true, jestliže soubor není prázdný Příkaz test s parametrem -s vrací #!/bin/bash hodnotu true (0) jestliže není prázdný. if (test -e $1); then if (test -s $1); then echo Objekt $1 neni prazdny.; else echo Objekt $1 je prazdny.; fi; else echo Objekt $1 neexistuje.; fi Vnořená podmínka. Další možnou variantou téhož příkladu je otočit logiku příkazu test a provést negaci výsledného parametru s, který vrací true v případě, že soubor není prázdný. #!/bin/bash if (test -e $1); then if (test! -s $1); then echo Objekt $1 je prazdny.; else echo Objekt $1 neni prazdny.; fi; else echo Objekt $1 neexistuje.; fi Příkaz test s negovaným -s vrací hodnotu true (0) jestliže je prázdný. Vnořená podmínka. Poznámka: Všimněte si, že v případě adresářů má adresář pokus1, ve kterém nejsou žádné soubory, velikost 4KB. Z toho plyne, že tento způsob ověřování nemůžete použít na adresáře. 16

Další možností řešení tohoto zadání je spojení podmínek pomocí logického operátoru AND, k čemuž slouží parametr a příkazu test. #!/bin/bash if (test -e $1 -a -s $1 ); then echo Objekt $1 neni prazdny.; fi if (test -e $1 -a! -s $1 ); then echo Objekt $1 je prazdny.; fi if (test! -e $1); then echo Objekt $1 neexistuje.; fi Psaní podmínek a zejména pak testování výrazů je pro začátečníka přehlednější použitím příkazu if then else. Zápis lze ale zjednodušit (to je myšleno opravdu jako ironie). Podívejte se na následující příklad. Př. Napište skript, který v případě, že nebude existovat adresář pokus1 a ani pokus2, vytvoří adresář pokus3. Pozor na záludnost češtiny. V tomto případě se myslí, že neexistuje li pokus 1 a zároveň neexistuje li pokus2, má se vytvořit pokus3. V takovémto případě by podmínka mohla být formulována takto: if (test! -d pokus1 -a! -d pokus2); then mkdir pokus3; fi Využívá se parametru d, který vrátí hodnotu true, jestliže objekt existuje a je to adresář. Jinou formou tohoto zápisu může být: [ test! -d pokus1 -a! -d pokus2 ] mkdir pokus3 Tzv. vícenásobné větvení příkaz case příkaz case slouží k vykonání příkazu za podmínky shody vstupního slova se vzory slov jedná se o podmínku použitelnou v případě většího množství voleb Syntaxe a použití příkazu case case slovo in vzory_slova) příkazy;;vzory_slova) příkazy;;esac Př. Vytvořte skript, který načte jméno a porovná jej se seznamem jmen, pro příslušné jméno pak vykoná nějakou akci. Pozor, příkazy jsou #!/bin/bash ukončeny 2 středníky! echo -n Zadej jmeno: ; read JMENO; case $JMENO in petr) echo Vykonavam prikazy pro volbu $JMENO;; pavel) echo Vykonavam prikazy pro volbu $JMENO;; jan) echo Vykonavam prikazy pro volbu $JMENO;; *) echo Pro toto zadane jmeno: $JMENO, nemam co nabidnout;; esac Ve všech ostatních případech, které neodpovídají výše uvedenému seznamu 17

1.3. Cykly v shellu se používají příkazy cyklu: o for o while o until cykly je možné vnořovat Mějte na paměti, že z hlediska daného shellu jsou všechny proměnné globální. Ať se vám nestane, že některým přiřazením přepíšete hodnotu, která je využívána například právě cyklem. Představte si, že v cyklu budete používat proměnnou POČET. for POCET in 1 2 3; do echo počet je: $POCET; done Pokud by měla proměnná POČET jinou hodnotu, tak spuštěním cyklu ji už nemá, ale bude postupně mít hodnotu 1, pak 2 a pak 3, takže ať v proměnné POČET bylo před spuštěním cyklu cokoli, je tam po jeho skončení hodnota 3. 1.3.1. Cyklus for Syntaxe: for index-seznamu in seznam do příkazy; done Proměnná index seznamu nabývá při každém průchodu cyklem hodnotu ze seznamu. Seznam je možné definovat různými způsoby. Například: výčtem prvků seznamu: 1 2 3 nebo petr karel emil seznamem získaným jako výsledek z provedení příkazu ls, cat apod. * doplní seznam všech souborů v aktuálním adresáři. Stále myslete na to, že vše je soubor. Pozor, použití * k definování seznamu se netýká skrytých souborů, ty nejsou do výpisu zahrnuty. *.txt provede pro seznam všech souborů v aktuálním adresáři, jejichž název (přípona) končí na.txt. seznam prvků z proměnné v shellu tcsh je příkaz foreach cyklus for se často používá pro hromadné přejmenování souborů protože v daném shellu jsou proměnné použité v cyklu globální, musí být v případě vnořených cyklů použity jiné proměnné, jinak se budou vzájemně přepisovat. Př. Předpokládejte, že máte v adresáři soubory dopis1.txt, dopis2.txt až dopis5.txt. Vytvořte skript pro zálohu všech souborů, které začínají zadaným jménem. Záloha bude označena příponou bak. 18

#!/bin/bash for cislo in 1 2 3 4 5 do cp $1$cislo $1$cislo.bak done ls *.bak Doplní jméno zadané jako argument skriptu a doplní jej postupně o příslušné číslo ze seznamu. Př. Napište interaktivní skript, který se uživatele zeptá na seznam souborů (jmen apod.). Tento seznam uloží do proměnné seznam a následně vypíše jednotlivé soubory. #!/bin/bash echo -n Zadejte seznam souboru oddelenych mezerou: read seznam echo; echo Bylo zadano: for soubor in $ seznam do echo $soubor done Př. Napište skript, který seznam pro příkaz for získá ze souboru. Všimněte si, jak je předán cyklu for výsledek provedení příkazu cat! #!/bin/bash for soubor in $(cat soubory) do echo $soubor done Obsah souboru soubory Pokud byste zadali toto: for soubor in cat soubory, dostali byste: Shell by totiž pochopil, že se jedná o seznam, jehož prvky tvoří cat a soubory. Podívejte se některé další skripty a jejich výsledek. Všímejte si rozdílů. 19

Př. Podívejte se, jaké výsledky získáte, pokud zadáte do seznamu pro for * nebo příkaz ls. Vypíše seznam všech souborů a adresářů v aktuálním adresáři (netýká se skrytých). #!/bin/bash for soubor in * do echo V adresari je: $soubor done V tomto případě nechápe ls jako příkaz, ale jako položku v seznamu. Viz. už výše uvedený příklad s příkazem cat. #!/bin/bash for soubor in ls do echo V adresari je: $soubor done Tento způsob zajistí, že výsledek příkazu ls se předá jako vstup do seznamu příkazu for. #!/bin/bash for soubor in $(ls) do echo V adresari je: $soubor done Všimněte si, co se provedlo, jestliže jste zadali příkaz ls s parametrem -l. Jednotlivé řádky dlouhého výpisu příkazu ls se rozsekaly na samostatné položky pro vstup příkazu for. #!/bin/bash for soubor in $(ls -l) do echo V adresari je: $soubor done Zamyslete se nad dalšími způsoby zápisu cyklu for for seznam in $@ for seznam in $(find /* -name \*.txt) 20

for seznam in Toto je seznam, ktery mam for seznam in Zde bude vypisovat \* ve vete. for seznam in Zde bude vypisovat * ve vete. for seznam in Zde bude vypisovat * ve vete. Jak jednoduché a užitečné může být použití příkazu for, kterému předáte seznam souborů, s kterými chcete pracovat, pro správu systému si ukážeme na následujícím příkladu. Potřebujete například provést změnu oprávnění v adresáři a jeho podadresářích na hodnotu 400 pro všechny soubory, jejichž vlastníkem je uživatel Petr (pouze pro soubory vlastněné Petrem). #/bin/bash for soubor in $(find. -user petr) do chmod 400 $soubor done Když se nad tím zamyslíte, tak takto můžete provést změnu oprávnění pro vybrané uživatele jen tím, že výše uvedenému kódu dáte jako vstupní seznam jména uživatelů, kterých se to má týkat. 21

Využití syntaxe jazyka C Pro příkaz for v shellu je možné použít i syntaxi jazyka C a využít tak jeho možností. Obecná syntaxe je: for ((nastavení_počáteční_hodnoty_proměnné; podmínka; krok)) for ((i = 1; i < 10; i++)) do echo $i done for ((i = 10; i > 0; i--)) do echo $i done Vhodné je například použití pro opakování v určitém, předem známém počtu opakování. Př. Napište skript, který ze vstupních argumentů skriptu načte slovo a počet, který určí, kolikrát se má slovo vypsat na obrazovku. Zadané slovo pak vypíše ve tvaru 1. slovo, 2. slovo atd. #!/bin/bash echo -n Zadejte slovo: ; read slovo; echo -n Zadejte maximalni pocet: ; read pocet; for ((cislo = 1; cislo <= $pocet; cislo++)) do echo $cislo. $slovo done 1.3.2. Cyklus while cyklus s podmínkou na začátku; je li výraz pravdivý, jsou vykonány příkazy v těle cyklu; tzn., dokud platí podmínka, dělej. k okamžitému ukončení cyklu slouží příkaz break k přeskočení zbytku cyklu a pokračování novým porovnáním slouží příkaz continue Syntaxe: while výraz do příkazy; done Př. Vytvořte skript, který načte číslo z klávesnice a bude vypisovat číslo snížené o jedničku tak dlouho, dokud bude číslo větší než 0. #!/bin/bash echo -n Zadejte cislo: ; read cislo; while (test cislo -gt 0) do 22

echo $cislo cislo=$[ $cislo - 1 ] done Dejte si pozor na to : že příkaz test nepoužívá znaky <> ale operátory lt, gt apod. jak se zadává aritmetický výraz pro změnu hodnoty proměnné cislo 1.3.3. Cyklus until dokud není splněna podmínka, vykonávej příkazy v těle cyklu. tzn., příkazy v těle cyklu jsou vykonány, dokud je podmínka false (navratový kód je různý od nuly). Syntaxe: until výraz do příkazy; done Př. Vytvořte skript, který načte číslo z klávesnice a bude vypisovat číslo snížené o jedničku tak dlouho, dokud bude číslo větší než 0. #!/bin/bash echo -n Zadejte cislo: ; read cislo; until (test cislo -eq 0) do echo $cislo cislo=$[ $cislo - 1 ] done Poznámky: při práci s proměnnými v cyklech wihle a until nezapomeňte upravovat hodnotu řídící proměnné cyklu (cyklus for to dělá za vás). nezapomeňte, že vyhodnocení výrazu lze zapsat jak pomocí příkazu test, tak pomocí [ ]. při práci s cykly wihle a until se někde musí vzít výchozí hodnota řídící proměnné. Sytaxe jazyka C pro příkazy wihle I pro příkazy cyklu while a until je v shellu možné použít i syntaxi jazyka C a využít tak jeho možností. Obecná syntaxe je: 23

while ((podmínka)) do příkazy done Pro vysvětlení na příkladech použijeme stejný jednoduchý příklad, který jsme použili pro příkaz cyklu for. Př. Napište skript, který ze vstupních argumentů skriptu načte slovo a počet, který určí, kolikrát se má slovo vypsat na obrazovku. Zadané slovo pak vypíše ve tvaru 1. slovo, 2. slovo atd. #!/bin/bash echo -n Zadejte slovo: ; read slovo; echo -n Zadejte maximalni pocet: ; read pocet; while ((cislo <= $pocet)) do echo $cislo. $slovo ((cislo++)) done 24

1.4. Dodatky: Tato krátká část kapitoly o shellu obsahuje některé drobnosti, které se jinam nevešly K přesměrování výstupu, o který nemáte zájem, můžete použít zařízení /dev/null. Vše, co je na toto zařízení zasláno je zahozeno. Představte si to tak, že vše, co zašlete na zařízení null, pošlete do nicoty. Často je využíváno k přesměrování chybových hlášení. Př. Chcete li vytvořit adresář, který již existuje, systém zahlásí chybu. Na druhém obrázku vidíte,že v případě přesměrování systém chybové hlášení nevypíše. Abyste mohli účinně psát skripty je také potřeba mít přehled o základních příkazech viz.studijní materiál Instalace operačního systému a jeho konfigurace II. Linux. Příkazy uvedené v tomto materiálu je ovšem potřeba průběžně doplňovat dalším studiem o další a další příkazy. Zde jsou dva, které můžete využít při psaní skriptů: sleep způsobí prodlevu mezi vykonáním dalšího příkazu např. sleep 10 wc vypíše počet řádků určitého výstupu. V kombinaci s jinými příkazy např. ls l může sloužit k zjištění počtu souborů v daném adresáři. Parametry: -c vrátí počet bitů -m vrátí počet znaků -l vrátí počet řádků echo vypíše výstup na obrazovku a přejde na nový řádek. Parametr n potlačí přechod na nový řádek dos2unix převádí textové soubory z formátu používaného ve Windows do kódování Linuxu. Linux a Windows používají jiné kódy pro ukončení řádků. unix2dos převádí textové soubory z formátu Linuxu do formátu Windows Zapamatujte si příkazy dos2unix a unix2dos, protože můžete každou chvíli potřebovat skript napsaný v jednom prostředí použít v druhém prostředí. Pojmenovaná roura vytvořená příkazem mknod (na uživatelské úrovni pomocí příkazu mkfifo) využívá speciálního souboru, který jedním procesem může být otevřený pro vstup a jiným procesem pro výstup a mohou si tak vzájemně předávat data, což u standardní roury není možné. do roury musí na jedné straně alespoň jeden proces zapisovat a na druhé straně alespoň jeden proces číst Funkce v shellu obdobně jako u jiných programovacích jazyků je možné i v shellu vytvářet funkce funkce přijímá vstupní parametry (argumenty) 25

funkce může vracet návratovou hodnotu pomocí příkazu return. Není li příkaz return použit, je jako návratová hodnota funkce použita návratová hodnota posledního příkazu. o použití return provede okamžité ukončení funkce a nastaví hodnotu proměnné $? na hodnotu definovanou return (nebo posledního použitého příkazu ve funkci). o je li použit příkaz exit, je funkce ukončena. syntaxe: název () { tělo funkce } kde () je metaznak určující, že se jedná o funkci funkce je vyhodnocována v aktuálním shellu změny hodnot proměnných se projeví v aktuálním shellu. Je li potřeba funkci použít ve vnořených shellech, používá se příkaz export. Automatické zaznamenávání činnosti Při psaní skriptů, a nejen při této činnosti, můžete použit jako pomůcku příkaz script, který obdobně jako záznamník zaznamená do souboru zadané příkazy, ale také odezvu systému. script název_souboru Ukončení záznamu se provádí pomocí CTRL + D 26

1.5. Skripty Skript: posloupnost příkazů, které se mají vykonat. Chod skriptu může být řízen pomocí podmínek, cyklů apod. textový soubor obsahující seznam příkazů skript není kompilovaný do strojového (spustitelného, binárního) kódu, je pomalejší, ale za to čitelnější relativně snadno se vytváří a upravuje ve Windows se skripty označují jako dávkové soubory (s příponou.bat) Dříve, než začnete psát skripty, byste měli: znát princip základních datových struktur (podmínek, cyklů apod.) znát strukturu souborů v Linuxu mít přehled o použití základních příkazů Linuxu a jejich parametrů Typy úkolů vhodných pro skripty: automatizace práce se soubory a strukturou adresářů zálohování obecně všude tam, kde není potřeba velká interakce s uživatelem. Tam, kde je potřeba větší interakce s uživatelem, je vhodné najít již připravené aplikace nebo si ji naprogramovat pomocí programovacího jazyka Abyste mohli vyzkoušet spouštění skriptu a uvědomit si okolnosti ovlivňující toto spouštění, vytvořte si jednoduchý skript pozdrav, který smaže obrazovku a pozdraví vás (chcete vyzkoušet spuštění skriptu, proto není nutné vytvářet šílenosti): Na obrázku vidíte, že pokud se takovýto soubor pokusíte spustit, nic se nestane. Aby byl skript skriptem, nestačí jen samotný kód uvnitř skriptu, ale je potřeba systému sdělit, že se jedná o skript, což se provádí změnou oprávnění k souboru. Spuštění skriptu nastavení oprávnění Ke spuštění skriptu musí být nastavena potřebná oprávnění. Vše je vcelku logické. Aby uživatel mohl vytvořený skript spustit, potřebuje oprávnění ke skriptu: číst (r) systém si musí uživatelovým jménem přečíst, jaké příkazy jsou ve skriptu zadány spustit (x) systém musí uživatelovým jménem být schopný příkazy uvedené ve skriptu vykonat Když říkám, že uživatelovým jménem, znamená to, že pokud má mít uživatel možnost skript spustit, měl by mít oprávnění číst a spouštět buď jako vlastník, nebo jako člen skupiny, nebo, pokud má být skript spustitelný kýmkoli, pro všechny ostatní. Na následujícím obrázku vidíte, jak se změna oprávnění projevila na spustitelnosti skriptu. Všimněte si také, že systém po nastavení oprávnění spustit na soubor barevně skript odlišuje. 27

Systému je v tuto chvíli jedno, co je napsáno uvnitř souboru. Pokud nastavíte na soubor oprávnění spustit (x), považuje systém soubor za spustitelný, neboli skript. O obsah souboru (skriptu) se začne zajímat až v okamžiku, kdy jej má vykonat. Z tohoto důvodu je maximální oprávnění pro běžný soubor hodnota 6 (reprezentující oprávnění rw) a nikoliv 7 (rwx), jak nastavují mnozí studenti, protože nastavením oprávnění 7 (rwx) například na soubor dopis.txt, systému říkají, že dopis.txt je spustitelným souborem (skriptem). A to není pravda. Takže pro jistotu ještě jednou. Skript dělá skriptem: kód uvnitř skriptu (začínající #!/bin/bash) nastavením oprávnění číst a spouštět ke skriptu (rx) V případě volání překladače může být problém s jeho umístěním, které se může v různých systémech lišit. Lze tedy provést drobnou úpravu, která vám volání překladače zevšeobecní. K tomuto účelu slouží příkaz env, která nastaví standardní prostředí a spustí program, který mu je předán jako argument. Zápis by pak vypadal například takto: #!/bin/env bash #!/bin/env python apod. Spuštění skriptu a prohledávání aktuálního adresáře Se spouštěním skriptu také souvisí, zda v případě, že chcete spustit skript a zadáte do příkazové řádky jméno skriptu, prohledává aktuální adresář. V případě spuštění programu (skriptu) z aktuálního adresáře, nezapomeňte, že záleží na nastavení proměnné PATH, zda Linux prohledává aktuální adresář. Adresáře uvedené dříve mají vyšší prioritu, protože, systém spustí program v prvním adresáři, ve kterém jej podle seznamu v proměnné PATH nalezne. Př. Máte li připravený skript v aktuálním adresáři, pak jeho spuštění v případě, že: 1) systém prohledává aktuální adresář: 2) systém neprohledává aktuální adresář: V takovém případě voláte skript určením, že se skript nahází v aktuálním adresáři:./ Protože v proměnné PATH není uveden aktuální adresář reprezentovaný tečkou, systém se nepodíval do aktuálního adresáře, proto skript nenalezl. V obou případech je možné skript spustit zadáním absolutní cesty ke skriptu. Poznámka: občas se na místo dopsání aktuálního adresáře do proměnné PATH doporučuje, aby si každý uživatel v domovském adresáři ukládal skripty a programy, které chce spustit, do podadresáře bin ve svém domovském adresáři a proměnnou PATH pak rozšířit o cestu ~/bin. Oba uvedené způsoby spuštění spustí skript v podřízeném shellu, což s sebou nese důsledky: 28

proměnné, které nebyly exportovány, boudou v podřízeném shellu nedostupné proměnné z poddřízeného shellu budou po ukončení zapomenty 3) speciální způsob spuštění. Skript je spuštěn:. název_skriptu Jedná se o speciální spuštění skriptu ve stejném shellu. jsou dostupné proměnné z aktuálního shellu hodnoty proměnných změněné skriptem zůstávají po ukončení skriptu zachovány Na prvním obrázku máte pomocí hodnot proměnných $POKUS a $SHLVL ukázáno, že v případě spuštění skriptu pomocí./skript je použit vnořený shell a původní hodnota proměnné POKUS je po ukončení skriptu nezměněna, kdežto v případě spuštění skriptu speciálním způsobem. skript, je použit stávající shell a hodnota proměnné POKUS je po ukončení skriptu změněna. Při psaní skriptů pro manipulaci se strukturou adresářů je nutné si rozmyslet, zda použijete relativní nebo absolutní cestu k souborům a adresářům. Struktura skriptu skript se skládá z hlavičky a těla skriptu hlavička identifikuje Shell, který má skript zpracovat, přičemž je nepovinná. Pokud hlavička není uvedená je skript proveden aktuálním shellem. Pokud je v hlavičce uveden shell, je skript tomuto shellu předán, není li, je skript spuštěn aktuálním shellem jako vnořený. tělo skriptu obsahuje příkazy, které jsou vykonány shell musí být uveden absolutní cestou shell se uvádí ve tvaru: #!/cesta_k_shellu argumenty, kde argumenty upřesňují chování Shellu, který bude skript spouštět. Např: #!/usr/bin/perl skript bude předán interpreteru jazyka PERL pro rozlišení skriptů různých interpreterů se obvykle používají přípony :.sh shell.pl PERL.py Python.tcl Tcl/Tk 29

Argumenty předávané skriptům jméno_skriptu [argumenty] argumenty slouží k upřesnění chování (vlastností) spouštěného programu (skriptu k argumentům lze přistupovat buď jednotlivě, nebo jako k celku k argumentům předávaným skriptu při jeho spuštění lze přistupovat pomocí proměnných speciálního významu Proměnné speciálního významu pro přístup k argumentům skriptu $0 jméno skriptu $n n tý argument, kde n nabývá hodnot 1,2,3..9 (nula je jméno skriptu) ${n} libovolný n tý argument. V případě existence více argumentů je potřeba použít složené závorky, protože $11 by Shell chápal jako zřetězení $1 a čísla 1 $# číslo posledního argumentu $* seznam všech argumentů $@ seznam všech argumentů Př. Napište skript, který jako vstupní argumenty načte seznam jmen a následně vypíše: jméno skriptu hodnotu 1. zadaného argumentu počet zadaných argumentů vypíše všechny zadané argumenty #/bin/bash echo echo Jmeno skriptu: $0 echo Hodnota prvniho zadaneho argumentu je: $1 echo Pocet zadanych argumentu je: $# echo Byly zadany tyto argument: $@ Jak jste si asi všimli, tak proměnné $* a $@ mají význam všechny vstupní argumenty. Rozdíl je ale v tom, jak jsou chápány mezery mezi argument. V případě * jsou všechny mezery chápány jako znaky, takže argument tvoří jeden řetězec znaků $1 $2 $3, což z předchozího příkladu je řetězec petr karel. V případě @ jsou mezery chápány jako metaznaky a všechny zadané argumenty brány jako skupina samostatných argumentů $1 $2 $3, s nimiž se manipuluje společně. V našem předchozím příkladě je to tedy argument petr a karel, které jsou pak vypsány společně a odděleny mezerou. Pokud byste zadané vstupní parametry předávali dalšímu programu, tak použitím $* předáváte řetězec znaků petr karel a použitím $@ předáváte samostatně řetězce petr a karel. 30

V případě, že budete potřebovat odstranit přebytečné argumenty, můžete k tomu použít příkaz shift, který zleva odstraní zadaný počet argumentů: shift 2 odstraní argumenty $1 a $2. Př. Napište skript pozdrav, který vás pozdraví a řekne vám datum a čas. Vstupními argumenty budou vaše jméno a bydliště. #!/bin/bash echo; echo Ahoj $1 z $2. Dnes je $(date); echo Takto to vypadá, když se jako vstupní argumenty předá jméno a bydliště a takto, když se zapomenou zadat. Interaktivní skripty umožňují uživateli vložit hodnoty do už běžícího skriptu (umožňují od uživatele získat informace za chodu skriptu). interaktivou zajišťuje příkaz read, který ukládá do definované proměnné vstup od uživatele. Př. Použijeme předchozí velmi jednoduchý příklad se zadáním jména a příjmení, ale tentokrát nebudeme jméno a bydliště požadovat jako vstupní argument, ale zeptáme se na něj až za chodu skriptu. Variantou je dát místo středníku #!/bin/bash && a pak se načtení provede, jen echo -n Zadejte jmeno: ; read JMENO když předchozí příkaz proběhne echo -n Zadejte bydliste: ; read BYDLISTE úspěšně. echo Ahoj $JMENO z $BYDLISTE. Dnes je $(date). Parametr n příkazu echo zajistí, že se kurzor nepřemístí na další řádek. Dalším častým případem bývá situace, kdy potřebujete od uživatele získat jméno a heslo. Na rozdíl od předchozího případu potřebujete, aby se zadané heslo nezobrazovalo na obrazovce. K tomu slouží příkaz stty, který potlačí výpis všech znaků. #!/bin/bash echo -n Zadejte jmeno: ; read JMENO echo -n Zadejte heslo: ;stty -echo;read HESLO;stty echo;echo echo Vase jmeno je: $JMENO a zadane heslo: $HESLO. Pozor, stty potlačí výpis všech znaků i znaku přechodu na nový řádek. Proto je nutné po opětovné aktivaci výpisu znaků a před zobrazením výpisu přejít na nový řádek pomocí příkazu echo. 31

Ke zjednodušení interakce s uživatelem se také používá příkaz select, který slouží k výběru z více nabízených možností. Umožňuje také řešit situaci, když uživatel zadá vstup neodpovídající nabízeným možnostem. syntaxe: select proměnná in nabídky do příkazy done pro ukončení se používá příkaz break pokud uživatel zadá hodnotu z nabídky je tato hodnota uložena do proměnné REPLY a odpovídající možnost z nabídky je uložena do proměnné (v příkladě na obrázcích dole je to proměnná VOLBA). V případě, že zadá možnost, která není v nabídce, je zadaná odpověď uložena do proměnné REPLY a proměnná VOLBA zůstane prázdná. obě proměnné VOLBA i REPLY nezanikají po ukončení příkau select Vzhledem k tomu, že často potřebujete omezit rozhodnutí jen na možnosti uvedené v nabídce, je vhodné příkaz select zkombinovat s použitím podmínky, která určí, kdy je možné select ukončit. S příkazem select se používá proměnná REPLY do které se zapíše zvolená odpověď. V proměnné VOLBA bude uložena hodnota nazdar v proměnné REPLY bude uložena hodnota 3 Shrnutí: Jedním ze silných nástrojů Linuxu jsou jeho shelly, které umožňují automatizovat řadu činností nejen pomocí již připravených příkazů, ale také možností vytvářet vlastní skripty a v nivy využívat podmínek, cyklů, funkcí, vlastních proměnných apod. Je ovšem potřeba mít povědomí o tom, že v Linuxu může být celá řada shellů jako sh, bash, csh, tcsh apod. Při práci s shellem se používá řada proměnných ať už vnitřních proměnných, uživatelských proměnných nebo proměnných speciálního významu. Pamatujte, že pokud vytváříte vlastní proměnné zapisují se velkými písmeny např. JMENO a hodnota v nich uložená je reprezentována např. zápisem $JMENO. Pokud je proměnná používat v určitém shellu, není viditelná v jiném shellu, pokud nebyl použit příkaz export. V situacích, kdy je potřeba řídit vykonání příkazu podle toho, jak proběhl předchozí příkaz se používá podmíněných příkazů && a. Pro složitější vyhodnocování se používá příkaz if then elxe v kombinaci s příkazem test pro vyhodnocování výrazů, který lze ovšem zapsat také v podobě příkazu [ ]. Pro opakování činností jsou v shellu k dispozici příkazy cyklu for, while, until a také je možné použít cyklů zapsaných v jazyce C. 32