Shell je interpret příkazů pro operační systém. Bash je můj oblíbený shell, ale každý linuxový shell interpretuje příkazy zadané uživatelem nebo správcem systému do formy, kterou může použít operační systém. Když jsou výsledky vráceny programu shellu, odešle je do STDOUT, který je standardně zobrazí v terminálu. Všechny shelly, které znám, jsou také programovací jazyky.
Funkce jako doplňování karet, vyvolání a úpravy z příkazového řádku a zkratky, jako jsou aliasy, to vše přispívá k jeho hodnotě jako výkonného shellu. Jeho výchozí režim úprav příkazového řádku používá Emacs, ale jednou z mých oblíbených funkcí Bash je, že jej mohu změnit na režim Vi a používat editační příkazy, které jsou již součástí mé svalové paměti.
Pokud však Bash považujete pouze za skořápku, uniká vám mnoho z jeho skutečné síly. Při zkoumání svého třídílného linuxového samostudia (na kterém je založena tato série článků) jsem se o Bash dozvěděl věci, které jsem za více než 20 let práce s Linuxem nikdy 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, dokonale navržený pro použití na příkazovém řádku a ve skriptech shellu.
Tato třídílná série zkoumá použití Bash jako programovacího jazyka rozhraní příkazového řádku (CLI). Tento první článek se zabývá jednoduchým programováním příkazového řádku pomocí Bash, proměnných a ovládacích operátorů. Další články prozkoumají typy souborů Bash; řetězcové, číselné a různé logické operátory, které poskytují logiku řízení toku provádění; různé typy expanzí skořepin; a pro , zatímco a do smyčky, 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ů.
Skořápka
Shell je interpret příkazů pro operační systém. Bash je můj oblíbený shell, ale každý linuxový shell interpretuje příkazy zadané uživatelem nebo správcem systému do formy, kterou může použít operační systém. Když se výsledky vrátí do programu shell, zobrazí je v terminálu. Všechny shelly, které znám, jsou také programovací jazyky.
Bash znamená Bourne Again Shell, protože shell Bash je založen na starším shellu Bourne, který napsal Steven Bourne v roce 1977. K dispozici je mnoho dalších shellů, ale nejčastěji se setkávám se čtyřmi:
- csh: C shell pro programátory, kteří mají rádi syntaxi jazyka C
- ksh: Shell Korn, napsaný Davidem Kornem a oblíbený u uživatelů Unix
- tcsh: Verze csh s jednoduššími funkcemi
- zsh: Skořepina Z, která kombinuje mnoho vlastností jiných oblíbených mušlí
Všechny shelly mají vestavěné příkazy, které doplňují nebo nahrazují příkazy poskytované základními utilitami. Otevřete manuálovou stránku shellu a najděte sekci "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é. Použil jsem C shell, Korn shell a Z shell. Pořád se mi líbí Bash shell víc než kterýkoli z nich. Použijte ten, který vám nejlépe vyhovuje, i když to může vyžadovat, abyste vyzkoušeli některé z ostatních. Naštěstí je výměna skořápek docela snadná.
Všechny tyto shelly jsou programovací jazyky a také interprety příkazů. Zde je rychlý přehled některých programovacích konstrukcí a nástrojů, které jsou nedílnou součástí Bash.
Bash jako programovací jazyk
Většina systémových administrátorů používá Bash k vydávání příkazů, které jsou obvykle poměrně jednoduché a přímočaré. Bash však může jít nad rámec zadávání jednotlivých příkazů a mnoho systémových administrátorů vytváří jednoduché programy příkazového řádku, které provádějí řadu úkolů. Tyto programy jsou běžné nástroje, které mohou ušetřit čas a námahu.
Mým cílem při psaní programů CLI je ušetřit čas a úsilí (tj. být líným správcem systému). Programy CLI to podporují tím, že uvádějí několik příkazů ve specifickém pořadí, které se provádějí jeden po druhém, takže nemusíte sledovat průběh jednoho příkazu a psát další příkaz, když první skončí. Můžete jít dělat jiné věci a nemusíte neustále sledovat průběh každého příkazu.
Co je to „program“?
Free On-line Dictionary of Computing (FOLDOC) definuje program jako:"Instrukce prováděné počítačem, na rozdíl od fyzického zařízení, na kterém běží." WordNet z Princetonské univerzity definuje program jako:„…posloupnost instrukcí, které může počítač interpretovat a provést…“ Wikipedia má také dobrý záznam o počítačových programech.
Program se tedy může skládat z jedné nebo více instrukcí, které provádějí konkrétní související úlohu. Instrukce počítačového programu se také nazývá příkaz programu. Pro systémové správce 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 pro většinu linuxových distribucí, není výjimkou.
Zatímco tato řada používá Bash (protože je tak 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í schopnosti. Shell programy lze uložit do souboru pro opakované použití nebo je lze podle potřeby vytvořit na příkazovém řádku.
Jednoduché programy CLI
Nejjednodušší programy příkazového řádku jsou jeden nebo dva po sobě jdoucí příkazy programu, které spolu mohou nebo nemusí souviset a které se zadávají na příkazovém řádku před Enter je stisknuto tlačítko. Druhý příkaz v programu, pokud nějaký existuje, může být závislý na akcích prvního, ale nemusí to tak být.
Je zde také jeden kousek syntaktické interpunkce, který je třeba jasně uvést. Při zadávání jednoho příkazu na příkazovém řádku stiskněte klávesu Enter klávesa ukončí příkaz implicitním středníkem (; ). Při použití v programu shellu CLI zadaného jako jeden řádek na příkazovém řádku je nutné použít středník k ukončení každého příkazu a jeho oddělení od dalšího. Poslední příkaz v programu shellu CLI 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ím terminátorem:
[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.
To se nemusí zdát jako program, ale je to první program, se kterým se setkávám s každým novým programovacím jazykem, který se učím. Syntaxe se může pro každý jazyk trochu lišit, ale výsledek je stejný.
Pojďme 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 provedl jiné experimenty, zatímco můžete mít pouze výchozí adresáře a soubory, které se vytvoří v domovském adresáři účtu, když se poprvé přihlásíte k účtu přes plochu GUI.
[student@studentvm1 ~]$ 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 dává trochu větší smysl. Výsledky spolu souvisí, ale jednotlivá programová prohlášení jsou na sobě nezávislá. Všimněte si, že rád vkládám mezery před a za středník, protože to usnadňuje čtení kódu. Zkuste ten malý CLI program znovu bez explicitního středníku na konci:
[student@studentvm1 ~]$ echo "My home directory." ; ls
Ve výstupu není žádný rozdíl.
Něco o proměnných
Jako všechny programovací jazyky, i Bash shell umí pracovat s proměnnými. Proměnná je symbolický název, který odkazuje na konkrétní místo v paměti, které obsahuje nějakou hodnotu. Hodnota proměnné je proměnná, tj. je proměnná.
Bash nezapisuje proměnné jako C a příbuzné jazyky, ale definuje je jako celá čísla, plovoucí desetinná čárka nebo typy řetězců. V Bash jsou všechny proměnné řetězce. Řetězec, který je celočíselný, lze použít v celočíselné aritmetice, což je jediný typ matematiky, který Bash umí. Pokud je vyžadována složitější matematika, bc příkaz lze použít v programech a skriptech CLI.
Proměnné jsou přiřazené 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, ale nepředchází jí $ podepsat. Přiřazení VAR=10 nastaví hodnotu proměnné VAR na 10. Pro tisk hodnoty proměnné můžete použít příkaz echo $VAR . Začněte textovými (tj. nečíselnými) proměnnými.
Proměnné bash se stávají součástí prostředí shellu, dokud nejsou deaktivovány.
Zkontrolujte počáteční hodnotu proměnné, která nebyla přiřazena; měla by být nulová. Poté přiřaďte hodnotu proměnné a vytiskněte ji, abyste ověřili její hodnotu. To vše můžete provést v jediném programu CLI:
[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;
Hello World
[student@studentvm1 ~]$
Poznámka:Syntaxe přiřazení proměnných je velmi přísná. Na obou stranách stejné značky nesmí být žádné mezery (= ) přihlaste se v příkazu přiřazení.
Prázdný řádek označuje počáteční hodnotu 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 provádění jednoduchých matematických úloh. Není vhodný pro vědecké výpočty nebo cokoliv, co vyžaduje desetinná místa, jako jsou finanční výpočty. Pro tyto typy výpočtů existují mnohem lepší nástroje.
Zde je jednoduchý výpočet:
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63
Co se stane, když provedete matematickou operaci, jejímž výsledkem je číslo s plovoucí desetinnou čárkou?
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$
Výsledkem je nejbližší celé číslo. Všimněte si, že výpočet byl proveden jako součást echo prohlášení. Matematika se provádí před přiloženým příkazem echo kvůli pořadí priority Bash. Podrobnosti viz manuálová stránka Bash a hledejte "precedence."
Operátoři ovládání
Operátory ovládání shellu jsou jedním ze syntaktických operátorů pro snadné vytváření zajímavých programů příkazového řádku. Nejjednodušší formou programu CLI je pouze spojení několika příkazů v sekvenci na příkazovém řádku:
command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;
Všechny tyto příkazy běží bez problémů, pokud nedojde k žádné chybě. Co se ale stane, když dojde k chybě? Pomocí vestavěných && můžete chyby předvídat a počítat s nimi a || Operátory ovládání Bash. Tyto dva ovládací operátory poskytují určité řízení toku a umožňují vám měnit sekvenci provádění kódu. Středník je také považován za ovládací operátor Bash, stejně jako znak nového řádku.
&& Operátor jednoduše říká:"pokud je příkaz1 úspěšný, spusťte příkaz2. Pokud příkaz1 z jakéhokoli důvodu selže, příkaz2 je přeskočen." Tato syntaxe vypadá takto:
command1 && command2
Nyní se podívejte na některé příkazy, které vytvoří nový adresář a – pokud bude úspěšný – udělají z něj současný pracovní adresář (PWD). Ujistěte se, že váš domovský adresář (~ ) je OZP. Zkuste to nejprve v /root , adresář, ke kterému nemáte přístup:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$
Chybu způsobil mkdir příkaz. Neobdrželi jste chybu oznamující, že soubor nelze vytvořit, protože vytvoření adresáře selhalo. && ovládací operátor vycítil nenulový návratový kód, takže dotyk příkaz byl přeskočen. Pomocí && ovládací operátor zabraňuje dotyku příkaz se nespustil, protože při vytváření adresáře došlo k chybě. Tento typ řízení toku programu z příkazového řádku může zabránit skládání chyb a vytváření skutečného nepořádku. Ale je čas to trochu zkomplikovat.
|| ovládací operátor vám umožňuje přidat další příkaz programu, který se provede, když počáteční 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, spusťte příkaz2." To znamená, že pokud je příkaz1 úspěšný, příkaz2 je přeskočen. Zkuste to pokusem o vytvoření nového adresáře:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$
To je přesně to, co byste očekávali. Protože se nepodařilo vytvořit nový adresář, první příkaz selhal, což vedlo ke spuštění druhého příkazu.
Kombinace těchto dvou operátorů poskytuje to nejlepší z obou. Syntaxe ovládacího operátoru používající nějaké řízení toku má tuto obecnou formu, když && a || používají se ovládací operátory:
preceding commands ; command1 && command2 || command3 ; following commands
Tato syntaxe může být uvedena takto:"Pokud příkaz1 skončí s návratovým kódem 0, pak spusťte příkaz2, jinak spusťte příkaz3." Zkuste to:
[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$
Nyní zkuste poslední příkaz znovu pomocí vašeho domovského adresáře namísto /root adresář. Budete mít oprávnění vytvořit tento adresář:
[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$
Syntaxe řídicího operátoru, například command1 &&command2 , funguje, protože každý příkaz posílá do 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 typu selhání. Podle konvence znamená RC nula (0) úspěch a jakékoli kladné číslo znamená určitý typ selhání. Některé z nástrojů, které správci systému používají, stačí vrátit jedničku (1) k označení selhání, ale mnoho z nich používá jiné kódy k označení typu selhání, ke kterému došlo.
Proměnná prostředí Bash $? obsahuje RC z posledního příkazu. Toto RC lze velmi snadno zkontrolovat pomocí skriptu, dalšího příkazu v seznamu příkazů nebo dokonce přímo sysadminem. 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, než jste se na něj podívali.
[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x 2 student student 4096 Mar 2 08:21 chapter25
drwxrwxr-x 2 student student 4096 Mar 21 15:27 chapter26
-rwxr-xr-x 1 student student 92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student 4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$
RC je v tomto případě nula, což znamená, že příkaz byl úspěšně dokončen. Nyní zkuste stejný příkaz v domovském adresáři root, adresáři, ke kterému nemáte oprávnění:
[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$
V tomto případě je RC dva; to znamená, že uživateli bez oprávnění root bylo odepřeno oprávnění k přístupu k adresáři, ke kterému tento uživatel nemá povolen přístup. Řídící operátoři používají tyto RC, aby vám umožnili změnit sekvenci provádění programu.
Přehled
Tento článek se zabýval Bash jako programovacím jazykem a prozkoumal jeho základní syntaxi a také některé základní nástroje. Ukázala, jak tisknout data na STDOUT a jak používat proměnné a ovládací operátory. Další článek této série se zabývá některými z mnoha logických operátorů Bash, které řídí tok provádění instrukcí.