Pouzdro je interpret příkazů operačního systému. Bash je můj oblíbený shell, ale každý linuxový shell interpretuje příkazy zadané uživatelem nebo správcem systému do podoby, kterou může operační systém použít. Když se výsledky vrátí do programu shellu, odešle je na STDOUT, který je ve výchozím nastavení zobrazí v terminálu. Všechny shelly, které znám, jsou zároveň programovacími jazyky.

K jeho hodnotě jako výkonného shellu přispívají funkce, jako je doplňování tabulátorů, vyvolávání a editace příkazového řádku a zkratky, jako jsou aliasy. Jeho výchozí režim editace příkazového řádku používá Emacs, ale jednou z mých nejoblíbenějších funkcí Bashe je, že jej mohu přepnout do režimu Vi a používat editační příkazy, které jsou již součástí mé svalové paměti.

Pokud však o Bashi uvažujete pouze jako o shellu, uniká vám velká část jeho skutečné síly. Při výzkumu mého třísvazkového samostudia Linuxu (na němž je založena tato série článků) jsem se o Bashi dozvěděl věci, které jsem za více než 20 let práce s Linuxem neznal. Některé z těchto nových poznatků se týkají jeho použití jako programovacího jazyka. Bash je výkonný programovací jazyk, který je dokonale navržen pro použití na příkazovém řádku a v shellových skriptech.

Tento třídílný seriál se zabývá použitím jazyka Bash jako programovacího jazyka pro rozhraní příkazového řádku (CLI). Tento první článek se zabývá jednoduchým programováním v příkazovém řádku pomocí jazyka Bash, proměnnými a řídicími operátory. Další články se věnují typům souborů Bash, řetězcovým, číselným a různým logickým operátorům, které zajišťují logiku řízení toku vykonávání, různým typům expanzí shellu a cyklům for, while a until, které umožňují opakované operace. Podívají se také na některé příkazy, které zjednodušují a podporují používání těchto nástrojů.

Pouzdro

Pouzdro je interpret příkazů operačního systému. Mým oblíbeným shellem je Bash, ale každý linuxový shell interpretuje příkazy zadané uživatelem nebo správcem systému do podoby, kterou může operační systém použít. Když se výsledky vrátí do programu shellu, zobrazí je v terminálu. Všechny shelly, které znám, jsou zároveň programovacími jazyky.

Bash znamená Bourne Again Shell, protože shell Bash vychází ze staršího shellu Bourne, který v roce 1977 napsal Steven Bourne. Existuje mnoho dalších shellů, ale s těmito čtyřmi se setkávám nejčastěji:

  • csh: C pro programátory, kteří mají rádi syntaxi jazyka C
  • ksh: Korn shell, který napsal David Korn a který si oblíbili uživatelé Unixu
  • tcsh: Je to verze csh s více funkcemi pro snadnější používání
  • zsh: Všechny shelly mají vestavěné příkazy, které doplňují nebo nahrazují příkazy poskytované základními nástroji. Otevřete manuálovou stránku shellu a najděte oddíl „BUILT-INS“, kde najdete příkazy, které poskytuje

    Každý shell má svou vlastní osobnost a syntaxi. Některé vám budou fungovat lépe než jiné. Já jsem používal shell C, shell Korn a shell Z. Přesto se mi shell Bash líbí více než kterýkoli z nich. Použijte ten, který vám nejlépe vyhovuje, i když to může vyžadovat vyzkoušení některých dalších. Naštěstí je poměrně snadné měnit shelly.

    Všechny tyto shelly jsou programovací jazyky a také interprety příkazů. Zde je stručný přehled některých programovacích konstrukcí a nástrojů, které jsou nedílnou součástí jazyka Bash.

    Bash jako programovací jazyk

    Většina správců systému používá jazyk Bash k zadávání příkazů, které jsou obvykle poměrně jednoduché a přímočaré. Jazyk Bash však může jít nad rámec zadávání jednotlivých příkazů a mnoho sysadminů vytváří jednoduché programy příkazového řádku pro provádění řady úloh. Tyto programy jsou běžnými nástroji, které mohou ušetřit čas a námahu.

    Mým cílem při psaní programů CLI je ušetřit čas a námahu (tj. být líným sysadminem). Programy CLI to podporují tím, že vypisují několik příkazů v určitém pořadí, které se provádějí jeden po druhém, takže nemusíte sledovat průběh jednoho příkazu a zadávat další příkaz, když první skončí. Můžete jít dělat jiné věci a nemusíte neustále sledovat průběh jednotlivých příkazů.

    Co je to „program“?

    Svobodný on-line slovník výpočetní techniky (FOLDOC) definuje program jako: „Instrukce prováděné počítačem, na rozdíl od fyzického zařízení, na kterém jsou spuštěny.“ WordNet Princetonské univerzity definuje program jako: „…posloupnost instrukcí, které může počítač interpretovat a provádět…“. Wikipedia má také dobré heslo o počítačových programech.

    Program se tedy může skládat z jedné nebo více instrukcí, které provádějí specifický, související úkol. Instrukce počítačového programu se také nazývá příkaz programu. Pro správce systému je program obvykle posloupnost příkazů shellu. Všechny shelly dostupné pro Linux, alespoň ty, které znám, mají alespoň základní formu programovacích schopností a Bash, výchozí shell většiny linuxových distribucí, není výjimkou.

    Přestože tento seriál používá Bash (protože je všudypřítomný), pokud použijete jiný shell, obecné koncepty programování budou stejné, i když se konstrukce a syntaxe mohou poněkud lišit. Některé shelly mohou podporovat některé funkce, které jiné ne, ale všechny poskytují určité programovací možnosti. Programy shellu mohou být uloženy v souboru pro opakované použití nebo mohou být vytvořeny na příkazovém řádku podle potřeby.

    Jednoduché programy CLI

    Nejjednodušší programy příkazového řádku jsou jeden nebo dva po sobě jdoucí programové příkazy, které spolu mohou nebo nemusí souviset a které se zadávají na příkazovém řádku před stisknutím klávesy Enter. Druhý příkaz v programu, je-li nějaký, může být závislý na činnosti prvního, ale nemusí být.

    Je zde také jeden kousek syntaktické interpunkce, který je třeba jasně uvést. Při zadávání jediného příkazu na příkazovém řádku se stisknutím klávesy Enter ukončí příkaz implicitním středníkem (;). Při použití v programu CLI shellu zadaném jako jeden řádek na příkazovém řádku musí být středníkem ukončen každý příkaz a oddělen od dalšího. Poslední příkaz v programu CLI shellu může používat explicitní nebo implicitní středník.

    Některé základní syntaxe

    Následující příklady tuto syntaxi objasní. Tento program se skládá z jediného příkazu s explicitní koncovkou:

    $ echo "Hello world." ;
    Hello world.

    To se možná nezdá jako velký program, ale je to první program, se kterým se setkávám u každého nového programovacího jazyka, který se učím. Syntaxe může být v každém jazyce trochu jiná, ale výsledek je stejný.

    Nechme si tento triviální, ale všudypřítomný program trochu rozvést. Vaše výsledky se budou lišit od mých, protože jsem dělal jiné experimenty, zatímco vy možná máte jen výchozí adresáře a soubory, které se vytvoří v domovském adresáři účtu při prvním přihlášení k účtu přes grafické rozhraní plochy.

    $ echo "My home directory." ; ls ;
    My home directory.
    chapter25 TestFile1.Linux dmesg2.txt Downloads newfile.txt softlink1 testdir6
    chapter26 TestFile1.mac dmesg3.txt file005 Pictures Templates testdir
    TestFile1 Desktop dmesg.txt link3 Public testdir Videos
    TestFile1.dos dmesg1.txt Documents Music random.txt testdir1

    To už dává trochu větší smysl. Výsledky spolu souvisí, ale jednotlivé příkazy programu jsou na sobě nezávislé. Všimněte si, že před a za středníkem rád píšu mezery, protože to trochu usnadňuje čtení kódu. Zkuste ten malý program CLI ještě jednou bez explicitního středníku na konci:

    $ echo "My home directory." ; ls 

    Výsledek se nijak neliší.

    Něco o proměnných

    Stejně jako všechny programovací jazyky umí i shell Bash pracovat s proměnnými. Proměnná je symbolické jméno, které odkazuje na určité místo v paměti, které obsahuje nějakou hodnotu. Hodnota proměnné je měnitelná, tj. je proměnná.

    Bash nepopisuje proměnné jako jazyk C a příbuzné jazyky, které je definují jako celá čísla, typy s plovoucí řádovou čárkou nebo řetězce. V jazyce Bash jsou všechny proměnné řetězce. Řetězec, který je celým číslem, lze použít v celočíselné aritmetice, což je jediný typ matematiky, který je Bash schopen provádět. Pokud je vyžadována složitější matematika, lze v programech a skriptech CLI použít příkaz bc.

    Proměnným jsou přiřazeny hodnoty a lze je použít k odkazování na tyto hodnoty v programech a skriptech CLI. Hodnota proměnné se nastavuje pomocí jejího názvu, kterému však nepředchází znak $. Přiřazení VAR=10 nastaví hodnotu proměnné VAR na 10. Chcete-li vypsat hodnotu proměnné, můžete použít příkaz echo $VAR. Začněte s textovými (tj. nečíselnými) proměnnými.

    Proměnné jazyka Bash se stávají součástí prostředí shellu, dokud nejsou zrušeny.

    Zkontrolujte počáteční hodnotu proměnné, která nebyla přiřazena; měla by být nulová. Poté proměnné přiřaďte hodnotu a vypište ji, abyste ověřili její hodnotu. To vše můžete provést v jediném programu CLI:

    $ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;
    Hello World
    $

    Poznámka: Syntaxe přiřazování proměnných je velmi přísná. V příkazu přiřazení nesmí být na žádné straně znaku rovnosti (=) mezera.

    Prázdný řádek znamená, že počáteční hodnota proměnné MyVar je nulová. Změna a nastavení hodnoty proměnné se provádí stejným způsobem. Tento příklad ukazuje původní i novou hodnotu.

    Jak již bylo zmíněno, Bash může provádět celočíselné aritmetické výpočty, což je užitečné pro výpočet odkazu na umístění prvku v poli nebo pro řešení jednoduchých matematických úloh. Není vhodný pro vědecké výpočty nebo cokoli, co vyžaduje desetinná čísla, například finanční výpočty. Pro tyto typy výpočtů existují mnohem lepší nástroje.

    Tady je jednoduchý výpočet:

    $ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
    Result = 63

    Co se stane, když provedete matematickou operaci, jejímž výsledkem je číslo s pohyblivou řádovou čárkou?

    Výsledkem je nejbližší celé číslo. Všimněte si, že výpočet byl proveden jako součást příkazu echo. Matematická operace je provedena před uzavírajícím příkazem echo kvůli pořadí priority příkazu Bash. Podrobnosti naleznete v manuálové stránce jazyka Bash a vyhledejte „precedence“.

    Řídicí operátory

    Řídicí operátory prostředí Shell jsou jedním ze syntaktických operátorů pro snadné vytváření některých zajímavých programů příkazového řádku. Nejjednodušší formou programu CLI je pouhé řetězení několika příkazů za sebou na příkazovém řádku:

    command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

    Tyto příkazy se všechny bez problémů spustí, pokud nedojde k chybě. Co se však stane, když k chybě dojde? Pomocí vestavěných řídicích operátorů && a || Bash můžete chyby předvídat a umožnit jejich výskyt. Tyto dva řídicí operátory poskytují určité řízení toku a umožňují měnit posloupnost provádění kódu. Středník je také považován za řídicí operátor jazyka Bash, stejně jako znak nového řádku.

    Operátor && jednoduše říká: „Pokud je příkaz1 úspěšný, pak spusť příkaz2. Pokud příkaz1 z jakéhokoli důvodu selže, pak se příkaz2 přeskočí“. Tato syntaxe vypadá takto:

    command1 && command2

    Nyní se podívejte na některé příkazy, které vytvoří nový adresář a – pokud se to podaří – udělají z něj současný pracovní adresář (PWD). Ujistěte se, že PWD je váš domovský adresář (~). Nejprve to zkuste v adresáři /root, tedy v adresáři, ke kterému nemáte přístup:

    Byla vypuštěna chyba příkazem mkdir. Neobdrželi jste chybu označující, že soubor nemohl být vytvořen, protože vytvoření adresáře selhalo. Řídicí operátor && vycítil nenulový návratový kód, proto byl příkaz touch přeskočen. Použití řídicího operátoru && zabrání spuštění dotykového příkazu, protože při vytváření adresáře došlo k chybě. Tento typ řízení toku programu v příkazovém řádku může zabránit tomu, aby se chyby hromadily a nadělaly pořádnou paseku. Je však čas na něco složitějšího.

    Řídicí operátor || umožňuje přidat další příkaz programu, který se spustí, když původní příkaz programu vrátí kód větší než nula. Základní syntaxe vypadá takto:

    command1 || command2 

    Tato syntaxe zní: „Pokud příkaz1 selže, proveď příkaz2“. To znamená, že pokud příkaz1 uspěje, příkaz2 se přeskočí. Zkuste to tak, že se pokusíte vytvořit nový adresář:

    Toto je přesně to, co byste očekávali. Protože se nový adresář nepodařilo vytvořit, první příkaz selhal, což vedlo k provedení druhého příkazu.

    Kombinace těchto dvou operátorů poskytuje to nejlepší z obou. Syntaxe řídicího operátoru využívajícího určité řízení toku má při použití řídicích operátorů && a || tuto obecnou podobu:

    preceding commands ; command1 && command2 || command3 ; following commands

    Tuto syntaxi lze uvést takto: „Pokud příkaz1 skončí s návratovým kódem 0, pak proveďte příkaz2, v opačném případě proveďte příkaz3.“ Vyzkoušejte si to:

    Nyní zkuste poslední příkaz provést znovu s použitím domovského adresáře místo adresáře /root. Budete mít oprávnění k vytvoření tohoto adresáře:

    $ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
    $

    Syntaxe řídicího operátoru, jako je příkaz1 && příkaz2, funguje, protože každý příkaz odešle shellu návratový kód (RC), který indikuje, zda byl úspěšně dokončen, nebo zda během provádění došlo k nějakému selhání. Podle konvence znamená RC nula (0) úspěch a jakékoli kladné číslo indikuje nějaký typ selhání. Některé nástroje, které sysadminové používají, vracejí pouze jedničku (1), která indikuje neúspěch, ale mnohé používají jiné kódy, které indikují typ selhání, k němuž došlo.

    Proměnná shellu Bash $? obsahuje RC z posledního příkazu. Tento RC lze velmi snadno zkontrolovat skriptem, dalším příkazem v seznamu příkazů nebo dokonce přímo správcem systému. Začněte spuštěním jednoduchého příkazu a okamžitou kontrolou RC. RC bude vždy pro poslední příkaz, který byl spuštěn předtím, než jste se na něj podívali.

    RC je v tomto případě nula, což znamená, že příkaz byl úspěšně dokončen. Nyní zkuste stejný příkaz provést v domovském adresáři roota, tedy v adresáři, ke kterému nemáte oprávnění:

    V tomto případě je RC rovno dvěma; to znamená, že uživateli, který není root, bylo odepřeno oprávnění k přístupu do adresáře, do kterého nemá přístup. Řídicí operátory používají tyto RC, aby vám umožnily měnit posloupnost provádění programu.

    Shrnutí

    Tento článek se zabýval jazykem Bash jako programovacím jazykem a prozkoumal jeho základní syntaxi i některé základní nástroje. Ukázal, jak vypisovat data na STDOUT a jak používat proměnné a řídicí operátory. V dalším článku této série se podíváme na některé z mnoha logických operátorů jazyka Bash, které řídí průběh provádění instrukcí.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.