Shell programování. Příkazový jazyk Shell. Kdo to potřebuje

  • Konzultace

Proč a pro koho je článek?

Zpočátku to byla připomínka pro studenty, kteří začínají pracovat se systémy podobnými Unixu. Jinými slovy, článek je určen pro ty, kteří nemají žádné předchozí zkušenosti s prací v unixovém systému. příkazový řádek, ale z toho či onoho důvodu se chce nebo potřebuje naučit, jak s ním efektivně interagovat.

Převyprávění many (dokumentace) nebude a článek jejich čtení nijak neruší ani nenahrazuje. Místo toho budu mluvit o hlavních věcech (příkazy, techniky a principy), kterým musíte rozumět od samého začátku práce v unixovém shellu, aby byla práce efektivní a příjemná.

Článek se týká plnohodnotných unixových prostředí, s plně funkčním shellem (nejlépe zsh nebo bash) a poměrně širokou nabídkou standardní programy.

Co je shell

Shell (shell, aka „příkazový řádek“, aka CLI, aka „konzola“, aka „terminál“, aka „černé okno s bílými písmeny“) je textové rozhraní komunikace s operační systém(No, přesně řečeno, toto je naprogramovat, která takové rozhraní poskytuje, ale nyní je tento rozdíl zanedbatelný).

Obecně práce přes shell vypadá takto: uživatel (tedy vy) zadá příkaz z klávesnice, stiskne Enter, systém příkaz provede, výsledek provedení zapíše na obrazovku a opět čeká na zadání. další příkaz.

Typický pohled shella:

Shell je primární způsob interakce se všemi serverovými systémy typu Unix.

Kde se nacházejí systémy příkazového řádku?

Kde na vás může čekat unixový shell, oblíbené možnosti:
  • MacOS (bash);
  • vzdálený přístup k serveru pro práci nebo pro osobní webový projekt;
  • domácí souborový server se vzdáleným přístupem;
  • Ubuntu, PC-BSD na notebooku/stolním počítači - systémy podobné unixu dnes se snadno instalují a používají.

Jaké problémy je rozumné řešit pomocí shellu?

Přirozené úkoly, pro které je skořápka vhodná, užitečná a nepostradatelná:
  • interaktivní práce v terminálu:
    • provádění kompilace, spouštění úloh přes make;
    • porovnávání textových souborů;
    • rychlá ad-hoc analýza dat (počet jedinečných IP v protokolu, rozdělení záznamů po hodinách/minutách atd.);
    • jednorázové hromadné akce (zabít mnoho procesů; pokud pracujete se systémem správy verzí, zvrátit nebo vyřešit spoustu souborů);
    • diagnostika toho, co se děje v systému (semafory, zámky, procesy, deskriptory, místo na disku atd.);
  • skriptování:
    • instalační skripty, u kterých se nemůžete spolehnout na přítomnost jiných interpretů - to není pro začátečníky;
    • funkce pro přizpůsobení interaktivního shellu (ovlivnění pozvánky, změna adresáře, nastavení proměnné prostředí) - také opravdu není pro začátečníky;
    • jednorázové skripty, jako je hromadné překódování souborů;
    • makefiles.

Absolutně první kroky

Začněme: přihlaste se a odhlaste se

Ujistěte se, že přesně víte, jak spustit shell a jak jej opustit.

Pokud pracujete na počítači s nainstalovaným Ubuntu, musíte jej spustit Terminálový program. Po dokončení můžete okno jednoduše zavřít.

V systému MacOS - spusťte také Terminál.

Pro přístup vzdálený server- použijte ssh (pokud máte MacOS, Ubuntu nebo jiný unixový systém lokálně) nebo putty (pokud máte Windows).

Kdo jsem, kde to jsem?

Spusťte následující příkazy:
  • hostname - zobrazuje název stroje (serveru), na kterém se právě nacházíte;
  • whoami - zobrazí vaše přihlašovací jméno (vaše jméno v systému);
  • tree -d / |less - pseudografická reprezentace stromu adresářů na počítači; výstup z rolování - q ;
  • pwd - zobrazí adresář, ve kterém se právě nacházíte; na příkazovém řádku nemůžete být „jen tak“, musíte být v nějakém adresáři (=aktuální adresář, pracovní adresář). Aktuální pracovní adresář je pravděpodobně zobrazen ve výzvě.
  • ls - seznam souborů v aktuálním adresáři; ls /home - seznam souborů v zadaném adresáři;

Historie příkazů (historie)

Důležitou vlastností plnohodnotného příkazového řádku je historie příkazů.

Spusťte několik příkazů: hostname, ls, pwd, whoami. Nyní stiskněte klávesu nahoru. Předchozí příkaz se objeví ve vstupním řádku. Pomocí kláves nahoru a dolů se můžete pohybovat v historii dopředu a dozadu. Když se dostanete na název hostitele, stiskněte Enter - příkaz bude proveden znovu.

Příkazy z historie lze nejen opakovaně spouštět, ale i upravovat. Procházejte historií k příkazu ls, přidejte k němu přepínač -l (ukáže se ls -l , před mínusem je mezera, ale za ním ne). Stiskněte Enter - upravený příkaz bude proveden.

Listování historií, úpravy a opětovné spouštění příkazů jsou nejčastější akce při práci na příkazovém řádku, takže si na to zvykněte.

Kopírovat-vložit

Příkazový řádek je velmi textově orientovaný: příkazy jsou textové, vstupní data pro většinu standardních programů jsou textová a výsledkem práce je nejčastěji také text.

Na textu je skvělé, že jej lze kopírovat a vkládat, a to platí i na příkazovém řádku.

Zkuste příkaz datum +"%y-%m-%d, %A"
Zadali jste to úplně ručně nebo jste to zkopírovali z článku? Ujistěte se, že jej můžete zkopírovat, vložit do terminálu a spustit.

Jakmile se naučíte používat man, ujistěte se, že můžete kopírovat a spouštět ukázkové příkazy z nápovědy Pro kontrolu vyhledejte sekci PŘÍKLADY v nápovědě programu date, zkopírujte a spusťte první uvedený příklad (pro případ: znak dolaru není součástí příkazu, jedná se o symbolický obrázek vstupní výzvy).

Jak přesně zkopírovat text z terminálu a vložit jej do terminálu, záleží na vašem systému a jeho nastavení, tak dejte univerzální návod, bohužel to nepůjde. Na Ubuntu zkuste toto: zkopírujte - stačí vybrat myší, vložit - prostřední tlačítko myši. Pokud to nefunguje nebo máte jiný systém, podívejte se na internet nebo se zeptejte zkušenějších přátel.

Klávesy a možnosti

Když jste prozkoumávali historii příkazů, již jste se setkali s tím, že příkaz ls má alespoň dvě možnosti. Pokud to zavoláte právě takto, zobrazí se jednoduchý seznam:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Pokud přidáte přepínač -l, zobrazí se podrobné informace pro každý soubor:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l celkem 332 -rw-rw-r-- 1 akira akira 198. února 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 února 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 13. února 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 13. února 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 13. února 11:35 shell-survival-quide.pdf
To je velmi typická situace: pokud jsou do volání příkazu přidány speciální modifikátory (klávesy, volby, parametry), chování příkazu se změní. Porovnejte: strom / a strom -d / , název hostitele a název hostitele -f .

Kromě toho mohou příkazy obsahovat názvy souborů, adresářů nebo jednoduše textové řetězce. Pokus:

Ls -ld /home ls -l /home grep root /etc/passwd

muž

man - Pomoc s příkazy a programy dostupnými na vašem počítači, stejně jako systémová volání a standardní knihovna C.

Zkuste: man grep , man atoi , man chdir , man man .

Posouvání vpřed a vzad se provádí pomocí tlačítek „nahoru“, „dolů“, „PageUp“, „PageDown“ opuštění zobrazení nápovědy se provádí tlačítkem q. Vyhledávání konkrétní text v článku nápovědy: stiskněte / (lomítko), zadejte text, který chcete vyhledat, stiskněte Enter. Přesun na další výskyty - klávesa n.

Všechny referenční články jsou rozděleny do kategorií. Nejdůležitější:

V případě shody jmen je nutné uvést, z jaké kategorie má být certifikát vystaven. Například man 3 printf popisuje funkci ze standardní knihovny C a man 1 printf popisuje konzolový program se stejným jménem.

Pomocí příkazu man -k můžete zobrazit seznam všech článků nápovědy dostupných na vašem počítači. (tečka je také součástí komada).

méně

Když jste v malém okně terminálu, musíte vidět velmi dlouhý text(obsah nějakého souboru, dlouhý muž atd.), používají speciální programy „pager“ (od slova page, tedy ploutve stránky). Nejoblíbenější scroller je méně a je to ten, který vám poskytuje rolování při čtení manuálových stránek.

Zkuste a porovnejte chování:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

Soubor můžete přenést na pager přímo v parametrech:

Méně /etc/bash.bashrc

Listování nahoru a dolů - tlačítka "nahoru", "dolů", "PageUp", "PageDown", exit - tlačítko q. Hledání konkrétního textu: stiskněte / (lomítko), zadejte text, který chcete hledat, stiskněte Enter. Přesun na další výskyty - klávesa n. (Poznáváte pokyny o člověku? Není divu, méně se také používá k zobrazení nápovědy.)

Práva

Jakýkoli soubor nebo adresář má soubor „práv“ s ním spojených: právo číst soubor, právo zapisovat do souboru, právo soubor spustit. Všichni uživatelé jsou rozděleni do tří kategorií: vlastník souboru, skupina vlastníků souboru, všichni ostatní uživatelé.

Oprávnění k souboru můžete zobrazit pomocí ls -l . Například:

> ls -l Makefile -rw-r--r-- 1 akira studenti 198 13. února 11:48 Makefile
Tento výstup znamená, že vlastník (akira) může soubor číst a zapisovat, skupina (studenti) může pouze číst a všichni ostatní uživatelé mohou také pouze číst.

Pokud při práci obdržíte zprávu o odmítnutí oprávnění, znamená to, že nemáte dostatečná práva k objektu, se kterým jste chtěli pracovat.

Přečtěte si více v man chmod.

STDIN, STDOUT, dopravníky (potrubí)

S každým vykonávaným programem jsou spojeny 3 standardní datové toky: vstupní datový tok STDIN, výstupní datový tok STDOUT, chybový výstupní tok STDERR.

Spusťte program wc, zadejte text Dobrý den dnes, stiskněte Enter, zadejte text dobrý den, stiskněte Enter, stiskněte Ctrl+d. Program wc zobrazí statistiku počtu písmen, slov a řádků ve vašem textu a na konci:

> wc dobrý den dnes dobrý den 2 5 24
V tomto případě jste zadali dvouřádkový text do STDIN programu a ve STDOUT jste obdrželi tři čísla.

Nyní spusťte příkaz head -n3 /etc/passwd , měl by vypadat nějak takto:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash démon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
V tomto případě program head nečetl nic ze STDIN, ale zapsal tři řádky do STDOUT.

Můžete si to představit takto: program je potrubí, do kterého proudí STDIN a vytéká STDOUT.

Nejdůležitější vlastnost Příkazový řádek Unixu spočívá v tom, že „potrubí“ programy mohou být vzájemně propojeny: výstup (STDOUT) jednoho programu lze přenést jako vstupní data (STDIN) do jiného programu.

Taková konstrukce propojených programů se anglicky nazývá potrubí nebo rusky dopravník nebo potrubí.

Sloučení programů do potrubí se provádí pomocí symbolu | (svislý pruh)

Spusťte příkaz head -n3 /etc/passwd |wc , bude to vypadat nějak takto:

> head -n3 /etc/passwd |wc 3 3 117
Stalo se toto: program head vytiskl tři řádky textu ve STDOUT, který okamžitě přešel na vstup wc programu, který zase spočítal počet znaků, slov a řádků ve výsledném textu.

Můžete kombinovat tolik programů, kolik chcete, do potrubí. Například můžete do předchozího kanálu přidat další program wc, který bude počítat, kolik slov a písmen bylo ve výstupu prvního wc:

> head -n3 /etc/passwd |wc |wc 1 3 24

Vytváření potrubí (pipes) je velmi častým úkolem při práci na příkazovém řádku. Pro příklad, jak se to dělá v praxi, si přečtěte část „Vytvoření potrubí s jednou vložkou“.

I/O přesměrování

Výstup (STDOUT) programu lze nejen přenést do jiného programu pomocí potrubí, ale také jednoduše zapsat do souboru. Toto přesměrování se provádí pomocí > (znaménko větší než):

Datum > /tmp/today.txt
V důsledku provedení tohoto příkazu se na disku objeví soubor /tmp/today.txt. Prohlédněte si jeho obsah z pomocí kat/tmp/today.txt

Pokud soubor se stejným názvem již existoval, jeho starý obsah bude zničen. Pokud soubor neexistuje, bude vytvořen. Adresář, ve kterém je soubor vytvořen, musí existovat před provedením příkazu.

Pokud nechcete soubor přepsat, ale raději přidat výstup na jeho konec, použijte >> :

Datum >> /tmp/today.txt
Zkontrolujte, co je nyní zapsáno v souboru.

Kromě toho můžete programu místo STDIN předat libovolný soubor. Pokus:

WC

Co dělat, když je něco nejasné

Pokud se setkáte s chováním systému, kterému nerozumíte, nebo chcete dosáhnout určitého výsledku, ale nevíte přesně jak, doporučuji vám postupovat v následujícím pořadí (mimochodem, to platí nejen pro shelly):
  • Co nejjasněji formulujte otázku nebo úkol – není nic těžšího než vyřešit „něco, co nevím“;
  • zapamatujte si, zda jste se již setkali se stejným nebo podobným problémem - v tomto případě stojí za to vyzkoušet řešení, které fungovalo minule;
  • přečtěte si příslušné manuálové stránky (pokud rozumíte, které manuálové stránky jsou ve vašem případě vhodné) - možná najdete vhodné příklady použití příkazů, potřebné volby nebo odkazy na další příkazy;
  • přemýšlejte: je možné úkol trochu změnit? - možná mírnou změnou podmínek získáte problém, který již víte, jak vyřešit;
  • položte svou jasně formulovanou otázku ve vyhledávači - možná odpověď najdete na Stack Overflow nebo jiných stránkách;
Pokud nic z výše uvedeného nepomůže, požádejte o radu učitele, zkušeného kolegu nebo kamaráda. A nebojte se klást „hloupé“ otázky – není ostuda nevědět, je ostuda se nezeptat.

Pokud řešíte obtížný problém (sami, s pomocí internetu nebo jiných lidí), zapište si své řešení pro případ, že by se u vás nebo vašich přátel znovu objevil stejný problém. Nahrávat můžete jednoduše textový soubor, v Evernote, publikovat na sociálních sítích.

Pracovní metody

Zkopírujte a vložte- z manuálových stránek, z článků na StackOverflow atd. Příkazový řádek se skládá z textu, využijte toho: zkopírujte a použijte ukázkové příkazy, zapište si úspěšné nálezy na památku, zveřejněte je na Twitteru a blozích.

Vytáhněte předchozí příkaz z historie, přidejte další příkaz do potrubí, spusťte, opakujte.Cm. Viz také část „Vytvoření potrubí s jednou vložkou“.

Základní příkazy

  • přechod do jiného adresáře: cd ;
  • prohlížení obsahu souborů: kočka, méně, hlava, ocas;
  • manipulace se soubory: cp, mv, rm;
  • prohlížení obsahu adresáře: ls , ls -l , ls -lS ;
  • adresářová struktura: strom , strom -d (můžete předat adresář jako parametr);
  • hledat soubory: najít . -jméno ... ;

Analytics

  • wc, wc-l;
  • sort -k - řazení podle zadaného pole;
  • sort -n - číselné řazení;
  • diff - porovnání souborů;
  • grep , grep -v , grep -w , grep "\ " , grep -E - hledání textu;
  • uniq , uniq -c - unifikace řetězce;
  • awk - ve volbě awk "(tisk $1)" lze ponechat pouze první pole z každého řádku, $1 lze změnit na $2, $3 atd.;

Diagnostika systému

  • ps axuww - informace o procesech (spuštěných programech) běžících na stroji;
  • top - interaktivní prohlížení procesů nejnáročnějších na zdroje;
  • df - použité a volné místo na disku;
  • du - celková velikost souborů v adresáři (rekurzivně s podadresáři);
  • strace , ktrace - co systém nazývá proces dělá;
  • lsof - jaké soubory proces používá;
  • netstat -na, netstat -nap - které porty a zásuvky jsou v systému otevřené.

Možná nemáte některé programy, které je třeba nainstalovat dodatečně. Některé možnosti těchto programů jsou navíc dostupné pouze privilegovaným uživatelům (root).

Hromadné a poloautomatické provádění

Nejprve přeskočte tuto část, budete tyto příkazy a konstrukce potřebovat, až se dostanete k jednoduchému skriptování v shellu.
  • test - podmínky kontroly;
  • zatímco čtete-smyčku řádek po řádku STDIN;
  • xargs - náhrada řetězců ze STDIN do parametrů zadaného programu;
  • seq - generování posloupností přirozených čísel;
  • () - kombinovat výstup několika příkazů;
  • ; - dělat jednu věc za druhou;
  • && - provést, pokud byl první příkaz úspěšně dokončen;
  • || - provést, pokud selže první příkaz;
  • tee - duplikovat výstup programu do STDOUT a do souboru na disku.

Smíšený

  • datum - aktuální datum;
  • curl - stáhne dokument ze zadané adresy URL a zapíše výsledek do STDOUT;
  • dotyk - aktualizovat datum změny souboru;
  • zabít - poslat signál procesu;
  • true - nedělá nic, vrací true, užitečné pro organizování věčných smyček;
  • sudo - spusťte příkaz jako root "a.

Vytvoření potrubí s jednou vložkou

Podívejme se na příklad skutečné úlohy: potřebujeme zabít všechny procesy task-6-server běžící jako aktuální uživatel.

Krok 1
Pochopte, který program produkuje přibližně potřebná data, i když ne v jejich čisté podobě. Pro náš úkol se vyplatí získat seznam všech procesů v systému: ps axuww. Zahájit.

Krok 2
Podívejte se na přijatá data očima, vymyslete filtr, který vám některá nepotřebná data vyhodí. Toto je často grep nebo grep -v . Pomocí klávesy „Nahoru“ vytáhněte předchozí příkaz z historie, přiřaďte mu vynalezený filtr a spusťte jej.

Ps axuww |grep `whoami`
- pouze procesy aktuálního uživatele.

Krok 3
Opakujte krok 2, dokud nezískáte čistá data, která potřebujete.

"
- všechny procesy s požadovaným názvem (plus možná další, jako vim task-6-server.c atd.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v méně
- pouze procesy s požadovaným názvem

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(tisk $2)"

Pids požadovaných procesů, krok 3 dokončen

Krok 4.
Aplikujte vhodný konečný manipulátor. Pomocí klávesy „Nahoru“ vytáhneme předchozí příkaz z historie a přidáme zpracování, které dokončí řešení problému:

  • |wc -l pro počítání počtu procesů;
  • >pids pro zápis pids do souboru;
  • |xargs kill -9 procesů ukončení.

Tréninkové úkoly

Chcete si procvičit nové dovednosti? Vyzkoušejte následující úkoly:
  • získat seznam všech souborů a adresářů ve vašem domovském adresáři;
  • získat seznam všech mužských článků z kategorie 2 (systémová volání);
  • spočítejte, kolikrát se slovo grep objeví v manuálové stránce programu grep;
  • spočítat, kolik procesů aktuálně běží jako root;
  • zjistit, který příkaz se objeví v maximálním počtu kategorií nápovědy (man);
  • spočítejte, kolikrát se slovo var objeví na stránce ya.ru.
Nápověda: budete potřebovat find , grep -o , awk "(tisk $1)" , regulární výrazy v grep , curl -s .

Co dál studovat?

Pokud se vám začne líbit příkazový řádek, nepřestávejte, neustále zlepšujte své dovednosti.

Zde je několik programů, které se určitě budou hodit, pokud žijete na příkazovém řádku:

  • najít se složitými možnostmi
  • apropos
  • lokalizovat
  • telnet
  • netcat
  • tcpdump
  • rsync
  • obrazovka
  • zgrep, zless
  • visudo
  • crontab -e
  • poslat mail
Navíc se časem vyplatí zvládnout nějaký skriptovací jazyk, jako je perl nebo python, nebo dokonce oba.

Kdo to potřebuje?

Má vůbec cenu učit se dnes skriptování příkazového řádku a shellu? Rozhodně to stojí za to. Uvedu jen několik příkladů požadavků Facebooku na kandidáty, kteří chtějí získat práci na FB.

Programovací jazyk shellu má několik konstrukcí, které vašim programům poskytnou flexibilitu:

  • Komentáře vám umožní popsat funkce programu;
  • "zde dokument" umožňuje zahrnout řádky do shellu programu, které budou přesměrovány jako vstup do některých příkazů shellu programu;
  • Příkaz exit umožňuje ukončit program v požadovaném bodě a použít návratové kódy;
  • Konstrukce cyklu for a while vám umožní opakovat skupinu příkazů ve smyčce;
  • podmíněné příkazy if a case provedou skupinu příkazů, pokud je splněna nějaká podmínka;
  • Příkaz break umožňuje bezpodmínečně opustit smyčku.

9.3.1. Komentáře

Pro vložení komentáře do programu použijte znak #. Pokud se za příkazem objeví znak #, provede se samotný příkaz a komentář se ignoruje. Formát řádku komentáře:

#komentář

9.3.2. "Zde dokument"

"Zde dokument" vám umožňuje umístit řádky do programu shell, které jsou přesměrovány jako příkazový vstup v tomto programu. Toto je jeden způsob, jak poskytnout vstup pro příkaz v programu shellu bez použití samostatného souboru. Záznam se skládá ze znaku přesměrování<< и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак!.

Formát příkazu je následující:

Příkaz<...vstupní řádky... oddělovač

9.3.3. Použití ed v programu shellu

"Zde dokument" navrhuje způsob použití ed v programu shellu. Řekněme, že chcete vytvořit shellový program, který zavolá editor ed, provede globální změny v souboru, zapíše změny do souboru a poté ukončí ed. Následující obrazovka ukazuje obsah programu ch.text, který provádí tyto úlohy:

$ cat ch.text echo Zadejte název souboru read file1 echo Zadejte přesný text, který chcete změnit.<

read old_text echo Zadejte přesně nový text, který nahradí výše uvedený.

přečtěte si nový_text ed - $file1

Všimněte si znaménka - (mínus) v příkazu ed. Tato možnost zabraňuje vytištění počítadla znaků na obrazovku. Všimněte si také formátu příkazu ed pro globální nahrazení:
G/$old_text/s//$new_text/g
Program používá 3 proměnné: soubor1, starý_text, nový_text. Při spuštění tento program používá příkaz read k získání hodnot těchto proměnných. Tyto proměnné obsahují následující informace:
soubor - název souboru, který bude upravován;

old_text - text, který bude změněn;

new_text - nový text. Do programu jsou zavedeny proměnné, zde dokument přesměruje globální příkaz nahradit, příkaz write a příkaz end na příkaz ed. Spusťte program ch.text. Získejte následující obrazovku: $ch.text Zadejte poznámku názvu souboru Zadejte přesný text, který chcete změnit. Milý Johne: $

Zadejte přesně nový text, který nahradí výše uvedený.

K čemu se to může týkat:

$ kočičí poznámka

Po interaktivním spuštění příkazu můžete vidět výstupní kód, když napíšete:

Zvažte následující příklad:

$ cat hi Toto je soubor ahoj.

$echo$?

0 $ kočka ahoj kočka: nelze otevřít ahoj $ echo $? 2 $ V prvním případě soubor hi existuje ve vašem adresáři a máte oprávnění ke čtení. Pomocí příkazu cat můžete vytisknout obsah souboru. Výsledkem příkazu cat je návratový kód 0, který získáte zadáním parametru $? Ve druhém případě soubor buď neexistuje, nebo nemáte oprávnění ke čtení. Příkaz cat vytiskne diagnostickou zprávu a vrátí kód 2. shell program

po dokončení se normálně ukončí

poslední příkaz

v souboru. K ukončení programu však můžete použít příkaz exit. Ještě důležitější je, že můžete použít příkaz exit k získání návratových kódů programu shell.

9.3.5. Cykly

Příkazy cyklu for a while umožňují provést příkaz nebo sekvenci příkazů vícekrát. 9.3.5.1. pro vyjádření Příkaz for provede sekvenci příkazů pro každý prvek seznamu. Má formát: Pro variabilní v_seznamu_hodnot dělat příkaz_1

příkaz_2

.

.

.

poslední příkaz hotovo Pro každou iteraci cyklu je další prvek seznamu přiřazen k proměnné uvedené v příkazu for. Na tuto proměnnou lze odkazovat kdekoli v příkazech v rámci příkazu do. Při vytváření každé části příkazů se musíte ujistit, že pro každé provedení je na konci cyklu odpovídající provedeno.

Proměnná může mít libovolný název. Pokud se například vaše proměnná jmenuje var, pak odkaz na $var v seznamu příkazů zpřístupní hodnotu. Pokud je operátor in vynechán, pak hodnota pro var bude sada argumentů zadaných v příkazu a dostupných ve speciálním parametru $*. Pro každou hodnotu bude proveden seznam příkazů mezi klíčovými slovy do a done.

Když jsou provedeny příkazy pro poslední prvek seznamu, program provede níže uvedený řádek hotovo. Pro variabilní dělat Příkaz for provede sekvenci příkazů pro každý prvek seznamu. Má formát: Pro variabilní dělat příkaz_1

9.3.5.2. zatímco prohlášení

Operátor zatímco smyčka

Po provedení některých doplňků dostaneme následující program:

Operátor echo Zadejte prosím jméno každé osoby a poté a echo Prosím ukončit seznam jmen s a<^d>při čtení x do echo $x>>xfile hotovo echo xfile obsahuje následující jména: cat xfile $

Všimněte si, že po dokončení smyčky program provede níže uvedené příkazy.

První dva příkazy echo používají speciální znaky, takže speciálnímu významu unikají uvozovky. Následující obrazovka ukazuje výstup enter.name:

$enter.name Zadejte prosím jméno každé osoby a poté a Seznam jmen ukončete znakem a<^d>Mary Lou Janice <^d>xfile obsahuje následující jména: Mary Lou Janice $

Po dokončení cyklu program vytiskne všechna jména obsažená v xfile.

9.3.6. Pomocí /dev/null

Souborový systém má soubor /dev/null, kam můžete uložit nechtěný výstup. Pokud například jednoduše zadáte příkaz who, systém odpoví, kdo na systému pracuje. Pokud přesměrujete výstup tohoto příkazu do /dev/null:

Kdo > /dev/null

pak nedostaneš odpověď.

9.3.7. Podmíněné výroky

když...tak prohlášení

Příkaz if říká programu shellu, aby provedl posloupnost příkazů poté, pokud byl úspěšně dokončen poslední příkaz v seznamu příkazů příkazu if. Pokud konstrukce končí klíčovým slovem fi.

Obecný formát konstrukce if je:

Li Pro variabilní dělat pak Pro variabilní dělat fi

Například program vyhledávacího shellu demonstruje použití konstrukce if ... then. Vyhledávací program používá příkaz grep k vyhledání slova v souboru. Pokud je grep úspěšný, program zobrazí nalezené slovo. Obrazovka bude vypadat takto:

$ hledání kočky echo Zadejte slovo a název souboru.

read word file if grep $word $file then echo $word is in $file fi $

Tento program zobrazuje výstup příkazu grep. Pokud chcete uložit odpověď systému na příkaz grep ve vašem programu, použijte soubor /dev/null a změňte příkazový řádek if na následující:

Pokud grep $word $file > /dev/null

Nyní spusťte vyhledávací příkaz. Odpoví pouze zprávou zadanou po příkazu echo.

Li Pro variabilní dělat Konstrukt if ... then ... else může provádět alternativní sadu příkazů po else, pokud je sekvence if nepravdivá. Formát této konstrukce je následující: Pro variabilní dělat .spodu Pro variabilní dělat fi

Pomocí této konstrukce můžete vylepšit vyhledávací program tak, aby vám řekl jak slovo nalezeno, tak slovo nenalezeno. V tomto případě bude vyhledávací program vypadat takto:

$ hledání kočky echo Zadejte slovo a název souboru.

číst soubor word if grep $word $file > /dev/null then echo $word je v $file else echo $word NENÍ v $file fi $

testovací příkaz

Příkaz test se používá k organizaci smyčky. Testuje určité podmínky na pravdivost a je užitečný pro organizování podmíněných struktur. Pokud je podmínka pravdivá, cyklus bude pokračovat. Pokud je podmínka nepravdivá, smyčka se ukončí a provede se další příkaz. Několik příkladů použití příkazu test: Test -r soubor true, pokud soubor existuje a je čitelný; soubor test -w true, pokud soubor existuje a je možné do něj zapisovat; soubor test -x true, pokud soubor existuje a je spustitelný;

soubor test -s

true, pokud soubor existuje a má alespoň jeden znak; test var1 -eq var2 true, pokud se var1 rovná var2; test var1 -ne var2

true, pokud se var1 nerovná var2.

Příklad. Pojďme vytvořit shell program, který přesune všechny spustitelné soubory z aktuálního adresáře do vašeho adresáře bin. K tomu použijeme příkaz test -x pro výběr spustitelných souborů. Program mv.file bude vypadat takto:

$ cat mv.file echo zadejte v cestě ke čtení cesty k adresáři pro soubor proveďte if test -x $soubor then mv $soubor $cesta/$soubor fi hotovo $ 1Konstrukt case ... esac vám umožňuje vybrat jeden z několika vzorů a poté provést seznam příkazů pro tento vzor. Výraz vzoru musí začínat klíčovým slovem in a za posledním znakem každého vzoru musí být umístěna pravá závorka. Posloupnost příkazů pro každý vzor končí dvěma znaky;;. Konstrukce případu musí být ukončena klíčovým slovem esac. ;;Obecný formát konstrukce případu je: Případ slovo v ;;vzor1) Případ slovo v ;; *)Případ slovo v ;;příkazový řádek

.

Pokud není nalezena první šablona, ​​provede se přechod na druhou šablonu. Pokud je nalezen jakýkoli vzor, ​​program nezohledňuje zbývající vzory, ale přejde k příkazu následujícímu po esac. Znak * se používá jako vzor pro hledání libovolného slova a poskytuje vám tak sadu příkazů, které budou provedeny, pokud nebude nalezen žádný jiný vzor. Vzor hvězdička (*) je proto umístěn jako poslední vzor v konstrukci případu, takže ostatní vzory jsou kontrolovány jako první. To vám pomůže odhalit nesprávné a neočekávané zadání.

Šablony mohou používat metaznaky *, ?, . To poskytuje flexibilitu programu.

Podívejme se na příklad. Program set.term nastavuje proměnnou TERM podle typu terminálu, který používáte. Používá se následující příkazový řádek:

TERM=název_terminálu

Šablona * je poslední v seznamu šablon. Vydá varovnou zprávu, že neexistuje žádný odpovídající vzor pro zadaný typ terminálu, a umožní vám dokončit konstrukci případu.

$ kočka set.term echo Pokud máte typ TTY 4420 v 4420 echo Pokud máte typ TTY 5410 v 5410 echo Pokud máte typ TTY 5420 v 5420, přečtěte si výraz případový výraz v 4420) TERM-T4 ;;

5410) TERM-T5 ;;

5420) TERM-T7 ;;

*) echo není správný typ terminálu;;

$ kočka set.term esac export TERM echo konec programu $

9.3.8. Bezpodmínečné předání kontroly

Příkaz break bezpodmínečně zastaví provádění jakékoli smyčky, ve které se vyskytuje, a předá řízení příkazu po klíčových slovech done, fi nebo esac.

V předchozím příkladu programu set.term můžete k ukončení programu použít příkaz break místo echo, jako v následujícím příkladu:echo Pokud máte typ TTY 4420 v 4420 echo Pokud máte typ TTY 5410 v 5410 echo Pokud máte typ TTY 5420 v 5420, přečtěte si výraz případový výraz v 4420) TERM-T4 ;;5410) TERM-T5 ;;5420) TERM-T7 ;;

*) přestávka;;

esac export TERM echo konec programu $Příkaz continue způsobí, že program okamžitě přejde na další iteraci cyklu while nebo for, aniž by provedl zbývající příkazy ve smyčce.

MOSKVA 2007 : Laboratorní workshop na předmětu: „Operační systém

Červený

Provádění jednotlivých příkazů v shellu není vždy efektivní způsob práce s shellem SHELL. Poměrně často musíte při práci s operačním systémem Linux provádět stejnou sekvenci akcí každý měsíc, každý týden, každý den a někdy i několikrát denně. Řekněme například, že pracujete pro společnost jako tester softwaru (Test Manager). Každý den musíte provést jednu sadu akcí v příkazovém shellu Linuxu, konkrétně: připojení zařízení CD-ROM; zkopírování všech informací z něj do složky, řekněme, /opt/program na vašem pevném disku; demontáž CD-ROM; čtení souboru readme z této složky; instalace programu z pevný disk ze složky /opt/program; vytvoření nového souboru sestavy v adresáři /home/user/report_program a smazání celého obsahu distribuce z pevného disku. A to i přesto, že vaším hlavním úkolem je testovat software a identifikovat chyby. Úkol je na první pohled jednoduchý, ale je nepohodlné provádět takové akce několikrát denně, přestože děláte i jiné věci. Nebo například pracujete ve firmě jako správce systému a obsluhujete asi 50 počítačů. Každý den je potřeba zkopírovat na všechny počítače stejný soubor s instrukcemi pro aktuální den od ředitele společnosti pro všechny podřízené. Mezi vaše úkoly navíc patří na konci pracovního dne uložení všech dat každého uživatele na společný firemní server z osobních počítačů podřízených. Úkol je také na první pohled jednoduchý, ale psaní příkazů v příkazovém interpretu pro 50 počítačů zabere spoustu času. Co když navíc děláte chyby při psaní například z únavy? Data jsou pro ředitele a jeho majitele velmi důležitá a nemůžete o ně přijít. Ale tohle je pořád jednoduché kroky. Představte si, že se názvy souborů sestav, názvy datových složek a názvy počítačů pokaždé změní? co potom dělat? Existuje pouze jedna cesta ven - napsat soubor skriptu , tj. vytvořte textový soubor, ve kterém potřebujete popsat celou sekvenci příkazů s cestami, volbami, argumenty, výrazy, akcemi a tak dále, abyste mohli provést konkrétní skript. Například zálohování dat. Po zadání příkazů do souboru textového skriptu se soubor stane spustitelným nebo se provedou jeho speciální příkazy pro provedení interpretu příkazů. Použití souborů skriptů je zvláště efektivní, pokud velmi často potřebujete spouštět sekvenci velký počet příkazy Je to také účinný nástroj, pokud provádění následujících příkazů závisí na výsledcích předchozích příkazů. Pomocí souborů skriptů můžete také používat aritmetické a logické výrazy a vytvářet smyčky, které opakovaně provádějí skupinu příkazů Linuxu.

Vytváření souborů skriptů. Skriptování je sekvenční sada příkazů, příkazů shellu a některých dalších symbolů v textovém souboru. Soubory skriptů se také nazývají skripty a interpreti příkazů se nazývají SHELL. Vzhledem k tomu, že dnes existují různé interprety příkazů, zápis souboru skriptu pomocí dalších symbolů, například metasymbolů, spolu s příkazy by neměl odporovat pravidlům syntaxe vybraného interpretru příkazů, ve kterém se má tento skript provádět. Proces zápisu takových souborů se nazývá programování SHELL. Podívejme se jako příklad na proces programování pomocí interpretu BASH. Skripty a skriptovací pravidla v této laboratoři tedy nemusí být přenosné na jiné interprety, jako je C Shell nebo TC Shell.

Posloupnost #!. Psaní jakéhokoli skriptu začíná tím, že patří jednomu z příkazových interpretů. První řádek skriptu obvykle obsahuje sekvenci #! , který říká systému, který interpret má provádět příkazy v daném skriptu. Pokud je prvním znakem mezera, považuje se skript za napsaný v BASH nebo PDKSH. Pokud skript začíná pouze symbolem #, je k jeho provedení vyžadován TC Shell. Pokud za znakem # následuje znak !, jádro spustí interpret, jehož cesta je uvedena dále v tomto řádku. Například pro BASH by to bylo další záznam: #!/bin/sh . Mezera nebo jeden znak # na začátku skriptu stačí pro interprety BASH Shell a TC Shell pouze v případě, že budou číst svůj skript. Aby jeden interpret rozpoznal skripty druhého, je nutné do skriptu zahrnout znaky #! , za kterým následuje cesta tlumočnického programu. Poté, když je zavolán skript, bude aktuální interpret ukončen, místo něj bude načten jiný typ skriptu a skript bude proveden. Doporučuje se vždy spouštět všechny skripty sekvencí #! . Řádky začínající symbolem # lze také použít ke komentování akcí uživatele ve skriptu. Když shell narazí na symbol #, ignoruje tento řádek. Každý komentář musí končit znakem na konci řádku. Používání komentářů je známkou dobrých mravů.

Rozšiřování a spouštění skriptů. Soubory skriptů mají obvykle nejen názvy, ale také přípony. Nejčastěji se jako rozšíření používá kombinace písmen sh z latinského slova shell. S touto příponou je bez otevření souboru okamžitě jasné, že se jedná o shell skript, protože opět je nám jasné, že soubor s příponou . C s největší pravděpodobností vstupní soubor jazyků vysoká úroveň C a C++. Po napsání obsahu souboru se soubor uloží. Existují dva způsoby, jak spustit soubor: buď jej spustit jako spustitelný pomocí příkazu chmod, nebo jej spustit pomocí speciálních operátorů shellu: sh a. Uživatelé obvykle nastaví soubor skriptu na osmičkové hodnoty 750 nebo 550. V následujícím příkladu vytvoříme skript script.sh spustitelný pomocí příkazu chmod a spustíme jej z aktuálního adresáře na pozadí.

chmod u+x script.sh

./ skript.sh &

Nyní vraťme předchozí atributy do souboru a spusťte jej k provedení pomocí příkazu BASH.

chmod u-x script.sh

sh script.sh&

Tým echo . Kromě seznamu standardních linuxových příkazů je nejjednodušší věcí, kterou můžete ve skriptu použít, zobrazit textové komentáře uživateli pomocí příkazu echo. Například, tento příkaz lze použít k pozvání uživatele k provedení nějaké akce nebo k pozdravu uživatele. Následující příklad používá echo k zobrazení pozdravu.

echo "Dobré odpoledne!"

Týmčíst . Když vytváříte skripty, můžete také použít proměnné a skripty napsané pro jiné interprety a příkazy. Příkaz read slouží jako příkaz, který uživatele vyzve k zadání. Je kombinován s nápovědou pro uživatele, která uživatele vyzve k zadání požadovaných informací. Zde je příklad použití read.

echo "Zadejte své jméno:"

číst vaše _ jméno

echo“ Druh den "vaše_jméno"!

Tento skript je složitější než předchozí. Zde je použita proměnná vaše_jméno, jejíž hodnota je pak použita ve spojení s textem.

Použití proměnných. Stejně jako programovací jazyky můžete také použít proměnné v shellu, můžete přiřadit hodnoty proměnným pomocí operátoru přiřazení rovného „=“. Nejprve zadejte název proměnné, poté znak „=“ bez mezery a poté hodnotu proměnné bez mezery. Název proměnné se může skládat z libovolného počtu abecedních znaků, včetně znaku podtržítka. Název může obsahovat čísla, ale nesmí začínat číslem. Všechny ostatní znaky (zejména vykřičník, ampersand a mezera) by neměly být součástí názvu. Takové symboly si interpret rezervuje pro zvláštní účely. V důsledku toho se název může skládat pouze z jednoho slova, protože při analýze příkazů interpret zachází s mezerou jako s oddělovačem mezi názvy příkazů a argumenty. Hodnota proměnné se může skládat z libovolné sekvence znaků. V následujícím příkladu přiřadíme do proměnné „ppp“ hodnotu „www123yyy“.

ppp =” www 123 yyy

Pokud jako hodnotu proměnné používáte hodnotu řetězce, použijte dvojité uvozovky. Jakmile je hodnota přiřazena, můžete pomocí názvu proměnné odkazovat na tuto hodnotu, například ji použít jako argument pro příkazy skriptu. Na hodnotu proměnné lze odkazovat jejím názvem, kterému předchází operátor $. Znak dolaru je speciální operátor, který používá název proměnné k odkazování na její hodnotu, tedy k jejímu skutečnému vyhodnocení. Nyní můžete pomocí známého příkazu echo a proměnné „ppp“ zobrazit hodnotu této proměnné.

echo $ppp

www123yyy

Argumenty příkazového řádku. Ve skriptu, stejně jako v příkazech Linuxu, můžete použít argumenty. Argument ve skriptu je označen operátorem $ následovaným číslem pozice na příkazovém řádku. Číslování parametrů začíná jedničkou a končí devítkou. První parametr je nastaven na $1, druhý na $2 atd. Argument $0 je vyhrazen pro název skriptu shellu, což je první slovo na příkazovém řádku. Standardně je možné nastavit 9 proměnných od $1 do $9. Pokud zadáte více argumentů, můžete na každý z nich odkazovat samostatně podle jeho čísla. Následující příklad zadává na příkazový řádek tři argumenty. Nejprve vytvořte skript argumentů s argumenty a poté jej spusťte.

Vezměte prosím na vědomí, že pokud potřebujete použít víceslovný argument(y), musíte argument(y) uzavřít na příkazovém řádku do dvojitých uvozovek. Někdy je potřeba zadat přesný počet argumentů ve skriptu, to lze provést pomocí argumentu $#. Volba $* umožňuje zadat všechny argumenty na příkazovém řádku.

Variabilnívývozní. Někdy pro různé soubory skriptů potřebujete použít určitou proměnnou, která již byla definována. Proměnné, které definujete v shellu, jsou pro něj lokální. V jistém smyslu taková proměnná patří jejímu interpretovi. Nemůžete přímo definovat proměnnou pro jiný interpret, ale můžete exportovat definici proměnné z jednoho interpretu do druhého pomocí příkazu export. Příkaz export obsahuje instrukci pro systém, podle které bude pro každý nově vytvořený shell definována kopie této proměnné. Každý nový shell bude mít svou vlastní kopii exportované proměnné. V následujícím příkladu definujeme proměnnou „rrr“ a exportujeme ji pro další interprety pomocí příkazu export.

Aritmetické operace - příkaznechat . Příkaz let je příkaz shellu BASH, který provádí operace s aritmetickými hodnotami. Pomocí tohoto příkazu na nich můžete porovnávat nebo provádět číselné hodnoty. aritmetické operace, jako je sčítání nebo násobení. Formát příkazu: let operátor hodnota1 hodnota2. Uveďme příklad.

$ nechat 2 * 5

10

Aritmetické výrazy, které používají operátor let, mohou také zahrnovat operátory přiřazení. Následující příklad přiřadí výsledek vynásobení dvou čísel k proměnné total.

$ let „total=2*5“

$ echo $celkem

10

$

Porovnávací operátory se často používají k porovnání číselných hodnot v řídicích konstrukcích, jako jsou smyčky a podmíněné větve. V následujícím příkladu příkazy skriptu soubor1 čtyřikrát zobrazí slovo "Ahoj!" V tomto případě se pro ovládání výstupu ze smyčky používá operátor let "ttt".<= 4", а для увеличения переменной цикла again на единицу - оператор let "ttt = ttt + 1". Обратите внимание на то, что при изменении переменной again ее вычислять не требуется.

Soubor1

ttt=l

zatímco ať "ttt<= 4"

dělat

echo $ttt Ahoj!

nechť "ttt = ttt + 1"

hotovo

Spuštění skriptu:

$file1

Ahoj!

Ahoj!

Ahoj!

Kromě toho můžete použít i jiné aritmetické operátory. Tabulka 1 uvádí aritmetické a porovnávací operátory Bash Shell.

Tabulka 1 - Příkazy shellu BASH

Aritmetické operátory

Funkce

Násobení

Přidání

Odčítání

Rozdělení se zbytkem

Porovnávací operátory

Funkce

Více než

Méně než

Větší než nebo rovno

Menší nebo rovno

Rovnost ve výrazech

Rovnost v příkazu let

Ne rovné

Logické AND

Logické NEBO

Logické NE

Kontrolní struktury. Ovládací konstrukce jsou navrženy tak, aby řídily provádění příkazů skriptu shellu. Tyto konstrukce vám umožňují organizovat opakované provádění určité sekvence příkazů nebo vybírat příkazy k provedení, které jsou v konkrétní situaci nezbytné. Řídicí struktura se skládá ze dvou hlavních komponent: kontrolních operací a příkazů. Výsledek porovnání (testování podmínky) je vrácen jako pravdivý nebo nepravdivý a poté jsou na základě výsledku provedeny konkrétní příkazy. Existují dva typy řídicích struktur: cyklický (cykly) A podmíněné (uslovia). Cyklický konstrukt se používá k opakovanému provádění příkazů, zatímco podmíněný konstrukt se používá k provádění sekvence příkaz., který splňuje určité podmínky. Interpret shellu BASH vám umožňuje používat tři smyčkové konstrukce while, for a for-in a dvě podmíněné konstrukce, if a case.

Kontrolní konstrukce while a if jsou konstrukce pro obecné účely, které se běžně používají k řešení problémů, jako jsou iterativní výpočty a testování různých podmínek. Kontrolní konstrukce case a for jsou zaměřeny na užší okruh úloh. Konstrukce případu je vícerozměrný operátor a je speciálním případem podmíněného operátoru if. Tento design se často používá při vytváření menu. Konstrukt for je smyčka, která zpracovává všechny informace jednou pro každou hodnotu obsaženou v seznamu, dokud nenarazí na konec seznamu.

Kromě porovnávání hodnot nebo proměnných lze řídicí konstrukce if a while použít k testování, zda systémový příkaz Linuxu uspěl nebo selhal. Připomeňme, že v Linuxu každý provedený příkaz vrací ukončovací kód. Pokud byl příkaz úspěšný, jeho ukončovací kód je 0. Pokud z nějakého důvodu nebyl příkaz úspěšně proveden, bude ukončovacím kódem nějaká kladná hodnota označující typ chyby. Kontrolní konstrukce if a while vám umožňují zkontrolovat, zda byl výstupní kód 0 nebo nějaká jiná hodnota. Pokud je výstupní kód nula, provedení příkazu bylo úspěšné a řídicí konstrukce if nebo while bude dokončena.

Týmtest . Hodnoty můžete porovnávat nejen pomocí konstruktů podmíněného řízení, ale také pomocí příkazu test. Při porovnávání dvou hodnot test vrátí 0, pokud je porovnání úspěšné. Příkaz test umožňuje porovnávat celá čísla, řetězce a dokonce provádět logické operace. Společně s příkazem test použijte možnosti, které určují typ porovnání. Kompletní seznam možností je uveden v tabulce 2.

Tabulka 2. Operace prováděné příkazem BASH shell test

Porovnání celých čísel

Funkce

Více než

Méně než

Více než rovné

Méně než stejné

Ne rovné

Porovnání řetězců

Funkce

Kontrola prázdného řetězce

Kontrola přítomnosti hodnoty řetězce

Testovací řetězce pro rovnost

Kontrola řetězců na nerovnosti

Kontrola řetězce sestávajícího z nul

Logické operace

Funkce

Logické AND

Logické NEBO

Logické NE

Kontrola souborů

Funkce

Zjištění existence souboru a jeho pravidelnosti

Zkontroluje, zda je soubor prázdný

Kontrola schopnosti číst ze souboru

Kontrola, zda lze do souboru zapisovat nebo jej změnit

Zkontroluje, zda je soubor spustitelný

Zkontroluje, zda je název souboru názvem adresáře

Zkontroluje, zda je název souboru symbolický odkaz

Zkontroluje, zda název souboru označuje bajtově orientované zařízení

Zkontroluje, zda název označuje blokově orientované zařízení

Příkaz test má následující syntaxi:

test value -option value

testovací řetězec = řetězec

Následující příklad ukáže příklad použití příkazu test. Porovnejme celočíselné hodnoty k tomu použijeme volbu rovnosti –eq. Pro kontrolu výsledku porovnávací operace použijeme kód dokončení posledního provedeného příkazu test, který je uložen v proměnné $? tlumočnická skořápka.

$ tot = 4

$test$ tot -ekv 7

$echo$?

1

Příkaz test $tot –eq 7 lze také napsat v jiném tvaru:

$ [ $tot –eq 7 ]

Podmíněné konstrukce:if, if-else, elif, case . Interpret shellu BASH obsahuje několik konstrukcí podmíněného řízení (Tabulka 3), které vám umožňují vybrat konkrétní příkazy Linuxu, které se mají provést. Mnohé z těchto konstrukcí se podobají konstrukcím podmíněného řízení v programovacích jazycích, ale existují určité rozdíly.

Tabulka 3 – Struktury řízení tlumočníkabashShell

Struktury podmíněného řízení

Funkce

if příkaz then fi příkaz

Konstrukce if způsobí provedení akce, pokud je výsledek testu pravdivý

if command then command else fi příkaz

Konstrukt if-else způsobí provedení akce, pokud je kód dokončení testovaného příkazu pravdivý, jinak se provede akce else.

if command then command elif command then command else fi příkaz

Konstrukce elif vám umožňuje vnořovat klauzule if, což vám umožňuje vybrat si z mnoha možností; pokud je podmínka testovaná první konstrukcí pravdivá, příkazy v ní uvedené se provedou a řízení se nepřenese na další konstrukci elif

řetězec případu ve vzoru) příkaz;; esac

Konstrukce případu porovnává hodnotu řetězce s jedním z několika vzorů. Když je nalezena shoda, provedou se příkazy odpovídající tomuto vzoru

příkaz && příkaz

Logická operace AND vrátí 0 (pravda), pokud obě instrukce vrátí 0; pokud se některý z příkazů nevrátí nulová hodnota, výsledek operace AND je „false“ a tato operace vrací nenulovou hodnotu

tým | | tým

Logická operace OR, která vrátí 0 (pravda), pokud jedna nebo obě instrukce vrátí 0 (pravda); pokud oba příkazy vrátí nenulovou hodnotu, pak je výsledek operace OR nepravdivý a operace vrátí nenulovou hodnotu

Tým

Logická operace NOT, invertuje kód dokončení příkazu

zatímco příkaz dělá příkazy hotovo

Konstrukce while provádí akci, dokud příkaz test nevrátí hodnotu true.

dokud příkaz proveďte příkazy hotovo

Konstrukce dokud provádí akci, dokud příkaz test nevrátí hodnotu false.

Cyklické řídicí struktury

Funkce while, do, for, for-in, select

pro proměnnou v seznamu hodnot do příkaz done

Konstrukce for-in je navržena pro zpracování seznamu hodnot. Proměnné jsou postupně přiřazeny hodnoty ze seznamu

pro proměnné provedení příkazu hotovo

Konstrukce for je navržena tak, aby zpracovávala argumenty skriptu postupně. Proměnné je postupně přiřazena hodnota každého argumentu

select line in element-list do command done

Konstrukce select vytvoří nabídku na základě položek v daném seznamu a poté provede zadaný příkaz (obvykle příkaz case)

Podmíněná konstrukce-li - pak . Podmíněná konstrukce if nastavuje podmínku pro provedení příkazu. Tato podmínka je ukončovací kód konkrétního příkazu Linux. Pokud byl příkaz úspěšně dokončen (to znamená, že výstupní kód je 0), provedou se příkazy uvnitř příkazu if. Pokud se ukončovací kód liší od 0, příkazy uvnitř konstrukce if nebudou provedeny. Někdy je potřeba vybrat jednu ze dvou možností v závislosti na tom, jak byl příkaz Linuxu proveden. Klíčové slovo else v klauzuli if umožňuje vybrat jednu ze dvou možností. Zde je syntaxe příkazu if-then-else.

Jak bylo uvedeno výše, pro sestavení libovolných algoritmů je nutné mít operátory pro kontrolu stavu. Shell bash podporuje výběrová prohlášení -lipakjinak a případ, stejně jako smyčkové operátory pro,zatímco, , což z něj dělá výkonný programovací jazyk.

5.8.1 Provozovatelé -li A test(nebo )

Konstrukce podmíněného operátoru v mírně zjednodušené podobě vypadá takto:

if list1 then list2 else list3 fi

Kde seznam1, seznam2 a seznam3 jsou sekvence příkazů oddělené čárkami a končící středníkem nebo znakem nového řádku. Tyto sekvence lze navíc uzavřít do složených závorek: (seznam).

poslední příkaz -li zkontroluje hodnotu vrácenou příkazy z seznam1. Pokud je v tomto seznamu několik příkazů, pak se kontroluje hodnota vrácená posledním příkazem v seznamu. Pokud je tato hodnota 0, pak příkazy from seznam2; pokud tato hodnota není nula, příkazy from seznam3. Hodnota vrácená takovýmto složeným operátorem -li, je stejná jako hodnota vytvořená posledním příkazem v právě prováděné sekvenci.

Úplný formát příkazu -li má tvar:

if list then list [ elif list then seznam ] ... [ else list ] fi

(zde hranaté závorky znamenají pouze to, že to, co je v nich obsaženo, nemusí nutně obsahovat operátor).

Jako výraz, který přijde hned poté -li nebo elif, často používaný příkaz test, které lze také označit hranatými závorkami. Tým test vyhodnotí nějaký výraz a vrátí 0, pokud je výraz pravdivý, a jinak 1. Výraz je předán programu test jako argument. Místo psaní

testovací výraz,

Výraz můžete uzavřít do hranatých závorek:

[výraz].

Vezměte prosím na vědomí, že test a [ jsou dvě jména stejného programu, ne nějaká magická konverze provedená shellem bash(pouze syntaxe [ vyžaduje zadání uzavírací závorky). Všimněte si také, že místo test v designu -li lze použít jakýkoli program.

Na závěr uvádíme příklad použití operátoru -li:

if [ -e textmode2.htm ] ; pak

ls textový režim*

jiný

pwd

O operátorovi test(nebo […]) potřebujeme mít zvláštní rozhovor.

5.8.2 Provozovatel test a podmíněné

Podmíněné výrazy použité v příkazu test, jsou postaveny na základě kontroly atributů souborů, porovnávání řetězců a běžných aritmetických porovnávání. Složité výrazy jsou sestaveny z následujících unárních nebo binárních operací („základní stavební bloky“):

    Soubor

True, pokud existuje soubor s názvem file.

    B soubor

Pravda, pokud soubor existuje a jedná se o speciální soubor blokového zařízení.

    C soubor

Pravda, pokud soubor existuje a jedná se o soubor zařízení se speciálními znaky.

    D soubor

Pravda, pokud soubor existuje a je to adresář.

    E soubor

Pravda, pokud je soubor pojmenovaný soubor existuje.

    F soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je to běžný soubor.

    G soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je nastaven jeho bit změny skupiny.

    H soubor nebo -L soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je symbolickým odkazem.

    K souboru

Pravda, pokud je soubor pojmenovaný soubor existuje a je nastaven jeho "lepivý" bit.

    P soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je pojmenované potrubí(FIFO).

    R soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a má nastaveno oprávnění ke čtení

    S soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a jeho velikost je větší než nula.

    Tfd

True, pokud deskriptor souboru fd je otevřená a ukazuje na terminál.

    Soubor U

Pravda, pokud je soubor pojmenovaný soubor existuje a je nastaven jeho uživatelský bit změny.

    W soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a má nastaveno oprávnění k zápisu.

    X soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je spustitelný.

    O soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je vlastněn uživatelem, na kterého ukazuje skutečné ID uživatele.

    G soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a patří do skupiny identifikované efektivním ID skupiny.

    S soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a je zásuvka.

    N soubor

Pravda, pokud je soubor pojmenovaný soubor existuje a od posledního přečtení se změnil.

    soubor1 -nt soubor2

Pravda, pokud soubor soubor1 má pozdější čas úpravy než soubor2.

    soubor1 -ot soubor2

Pravda, pokud soubor soubor1 starší než soubor2.

    soubor1 -ef soubor2

Pravda, pokud soubory soubor1 A soubor2mají stejná čísla zařízení a inodů(inod).

    O optname

True, pokud je povolena možnost shellu optname. Vysvětlení viz manuálová stránka bash.

    Z struna

True, pokud je délka řetězce nula.

    N řetězec

True, pokud délka řetězce není nula.

    řetězec1 == řetězec2

Pravda, pokud se řetězce shodují. Místo == lze použít = .

    řetězec1 !== řetězec2

Pravda, pokud se řetězce neshodují.

    řetězec1< string2

Pravda, pokud linka řetězec1 lexikograficky předchází řetězec řetězec2(pro aktuální národní prostředí).

    řetězec1 > řetězec2

Pravda, pokud linka řetězec1 lexikograficky přichází za řádek řetězec2(pro aktuální národní prostředí).

    arg1 OP arg2

Zde OP- uh pak jedna z aritmetických porovnávacích operací: -ekv(rovná se), -ne(není stejné) -lt(méně než) -le(menší nebo rovno) -gt(více), -ge(větší než nebo rovno). Jako argumenty lze použít kladná nebo záporná celá čísla.

Z těchto elementárních podmíněných výrazů můžete vytvářet tak složité, jak chcete, pomocí obvyklých logických operací NEGATION, AND a OR:

    !(výraz)

Booleovský negační operátor.

    výraz1 -a výraz2

Booleovský operátor A(A). True, pokud jsou oba výrazy pravdivé.

    výraz1 -o výraz2

Booleovský operátor NEBO(NEBO). True, pokud je pravdivý jeden z těchto dvou výrazů.

To samé podmíněné výrazy se používají i u operátorů zatímco A , na který se podíváme níže.

5.8.3 Provozovatel věc

Formát operátora věc je:

slovo s velkými písmeny v [ [(] vzor [ | vzor ] ...) seznam ;; ]...esac

Tým věc nejprve vytváří slovní expanzi slovo a pokusí se porovnat výsledek s každým ze vzorků vzor po jednom. Po nalezení první shody se neprovádějí žádné další kontroly, provede se seznam příkazů podle vzoru, se kterým byla nalezena shoda. Hodnota vrácená operátorem je 0, pokud nebyly nalezeny žádné shody se vzorem. Jinak je vrácena hodnota vytvořená posledním příkazem v odpovídajícím seznamu.

Následující příklad použití příkazu case je převzat ze systémového skriptu /etc/rc.d/rc.sysinit.

případ "$UTC" v

ano|pravda)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

ne|nepravda)

CLOCKFLAGS="$CLOCKFLAGS --localtime";

CLOCKDEF="$CLOCKDEF (místní čas)";

esac

Pokud se proměnná vyhodnotí jako ano resp true, pak se provede první pár příkazů, a pokud je jeho hodnota no nebo nepravda, provede se druhý pár.

5.8.4 Provozovatel vybrat

poslední příkaz vybrat umožňuje organizovat interaktivní interakci s uživatelem. Má následující formát:

vybrat jméno [ve slově; ] udělat seznam ; hotovo

Nejprve ze šablony slovo vygeneruje se seznam slov odpovídajících vzoru. Tato sada slov se zobrazí v standardní proud chyby a každé slovo je doplněno sériové číslo. Pokud vzor slovo vynechán, polohové parametry jsou odvozeny stejným způsobem. Poté se zobrazí standardní výzva PS3 a shell čeká na zadání řádku standardní vstup. Pokud zadaný řetězec obsahuje číslo odpovídající jednomu ze zobrazených slov, pak proměnná jméno je přiřazena hodnota rovna tomuto slovu. Pokud je zadán prázdný řádek, čísla a odpovídající slova se zobrazí znovu. Pokud je zadána jakákoli jiná hodnota, proměnná jméno je přiřazena hodnota nula. Řetězec zadaný uživatelem je uložen v proměnné ODPOVĚĎ. Seznam příkazů seznam provedené s vybranou hodnotou proměnné jméno.

Zde je malý skript:

#!/bin/sh

echo "Jaký OS preferujete?"

vyberte var v "Linux" "Gnu Hurd" "Free BSD" "Ostatní"; dělat

přerušení

hotovo

echo "Vybrali byste $var"

Jaký OS preferujete?
1) Linux
2) Gnu Hurd
3) Zdarma BSD
4) Jiné
#?

Stiskněte libovolné ze 4 navrhovaných čísel (1,2,3,4). Pokud zadáte například 1, zobrazí se zpráva:

„Zvolili byste Linux“

5.8.5 Provozovatel pro

poslední příkaz pro funguje trochu jinak než v běžných programovacích jazycích. Namísto toho, aby se hodnota nějaké proměnné zvýšila nebo snížila o jednu pokaždé, když prochází smyčkou, přiřadí proměnné další hodnotu z daného seznamu slov pokaždé, když prochází smyčkou. Obecně platí, že design vypadá asi takto:

pro jméno ve slovech do seznamu hotovo.

Pravidla pro vytváření seznamů příkazů ( seznam) jsou stejné jako v operátoru -li.

Příklad. Následující skript vytvoří soubory foo_1, foo_2 a foo_3:

pro a v 1 2 3; dělat

dotkněte se foo_$a

hotovo

V obecný případ pro vyjádření má formát:

pro jméno [slovem; ] udělat seznam ; hotovo

Nejprve je zjeveno slovo slovo v souladu s pravidly pro zveřejňování výrazů uvedenými výše. Pak proměnná jméno výsledné hodnoty jsou přiřazeny jedna po druhé a pokaždé, když je proveden seznam příkazů ist. Pokud " ve slově" chybí, pak seznam příkazů seznam se provede jednou pro každý zadaný poziční parametr.

Linux má program seq, který vezme dvě čísla jako argumenty a vytvoří posloupnost všech čísel umístěných mezi danými. S tímto příkazem můžete vynutit pro PROTI bash fungují úplně stejně, jako podobný operátor pracuje v konvenčních programovacích jazycích. Chcete-li to provést, stačí napsat cyklus pro následovně:

pro a v $(seq 1 10) ; dělat

cat file_$a

hotovo

Tento příkaz zobrazí obsah 10 souborů: " soubor_1", ..., "soubor_10".

5.8.6 Provozovatelé zatímco A

poslední příkaz zatímco funguje jako -li, pouze provádějící operátory ze seznamu seznam2 opakování pokračuje, dokud je podmínka pravdivá, a přeruší se, pokud podmínka neplatí. Design vypadá takto:

zatímco seznam1 provede seznam2.

while [ -d můjadresář ] ; dělat

ls -l mydirectory >> logfile

echo -- SEPARATOR -- >> soubor protokolu

spát 60

hotovo

Takový program bude zaznamenávat obsah adresáře "mydirectory" každou minutu, dokud adresář existuje.

poslední příkaz podobný operátorovi zatímco:

dokud není seznam1 proveden seznam2.

Rozdíl je v tom, že výsledek se vrátil při provádění seznamu příkazů seznam1, brané s negací: seznam2 provede se, pokud je poslední příkaz v seznamu seznam1 vrátí nenulový výstupní stav.

5.8.7 Funkce

Syntax

Shell bash umožňuje uživateli vytvářet nativní funkce. Funkce se chovají a používají přesně jako běžné příkazy shellu, což znamená, že nové příkazy můžeme vytvářet sami. Funkce jsou konstruovány následovně:

function name() (seznam)

A slovo funkce ne nutně jméno definuje název funkce, pomocí které k ní lze přistupovat, a tělo funkce se skládá ze seznamu příkazů seznam, který se nachází mezi ( a ). Tento seznam příkazů se provede pokaždé, když zadáte jméno jméno zadaný jako název příkazu, který se má vyvolat. Všimněte si, že funkce mohou být definovány rekurzivně, takže je přípustné volat funkci, kterou definujeme uvnitř sebe.

Funkce jsou prováděny v kontextu aktuálního shellu: k interpretaci funkce nový proces nespustí (na rozdíl od spouštění skriptů shellu).

Argumenty

Když je funkce volána k provedení, argumenty funkce se stanou polohové parametry(poziční parametry) po dobu trvání funkce. Jsou označovány jako $ n, Kde n— číslo argumentu, ke kterému chceme získat přístup. Číslování argumentů začíná na 1, takže $1 - to je první argument. Můžeme také získat všechny argumenty najednou $* a počet použitých argumentů $# . Polohový parametr 0 se nemění.

Pokud se v těle funkce vyskytuje vestavěný příkaz návrat, provádění funkce se přeruší a řízení se po volání funkce přenese na příkaz. Když funkce dokončí provádění, poziční parametry a speciální parametr # vrátí se hodnoty, které měly před spuštěním funkce.

Místní proměnné (místní)

Pokud chceme tvořit lokální parametr, lze použít klíčové slovo místní. Syntaxe pro jeho specifikaci je úplně stejná jako u běžných parametrů, pouze definici předchází klíčové slovo místní: místní jméno=hodnota.

Zde je příklad zadání funkce, která implementuje výše uvedený příkaz seq:

seq()

místní I=$1;

zatímco [ $2 != $I ]; dělat

echo -n "$I";

I=$(($I + 1))

hotovo;

echo $2

Poznamenejte si prosím tuto možnost -n operátor echo, zruší přechod na nový řádek. Ačkoli to není podstatné pro účely, které zde máme na mysli, může to být užitečné pro použití funkce pro jiné účely.

Faktorová výpočetní funkce skutečnost

Další příklad:

skutečnost()

if [ $1 = 0]; pak

echo 1;

jiný

echo $(($1 * $(skutečnost $(($1 - 1)))))

Toto je faktoriální funkce, příklad rekurzivní funkce. Všimněte si aritmetické expanze a substituce příkazů.

V. Kostromin (kos at rus-linux dot net) - 5.8. Shell jako programovací jazyk

Jakýkoli univerzální OS si musí hodně pohrát s uživatelem a svými vlastními úkoly. Pouze malá část této činnosti může být naprogramována jednou provždy v jádře. Většinu logiky pro správu úloh a samotného systému musí mít administrátor k dispozici ve formě projektu, jinak prostě nebude schopen pochopit, co se v systému děje, natož ho změnit. Stojí za to se blíže podívat na nástroj používaný v UNIXu k nastavení algoritmu pro mnoho částí systému - příkazový interpret , skořápka . Ukazuje se, že shell funguje dobře nejen v dialogu s uživatelem, ale také v tom, jak scénárista a jak prostředky organizace interakce mezi úkoly v systému.

Začněme tím, že skořápka je plnohodnotná programovací jazyk a jako mnoho interpretů na poměrně vysoké úrovni. Pokud je úloha jednorázová (neexistují požadavky na rychlost, kompatibilitu a přenositelnost) a dosti abstraktní (neexistuje vazba na konkrétní komplexní datovou strukturu), lze ji s největší pravděpodobností vyřešit, s napsáním příkazový skript - shell program.

Na druhou stranu se při řešení problémů v systému nelze omezit na algoritmickou úplnost. Například Turingův stroj [9] je extrémně jednoduchý a algoritmicky úplný, ale málokoho by napadlo organizovat dialog s uživatelem nebo řídit samotný OS na základě jeho modelu. Zde je třeba připomenout, že shell je také vykonavatelem příkazů: snadno komunikuje s UNIXem a utilitami. To znamená, že jeho doplněním o mechanismus pro řízenou interakci příkazů se systémem i mezi sebou získáme dobrý integrátor (neboli shell – což je ve skutečnosti překlad slova skořápka).

Nejlepší na tom je, že takový programovatelný shell nepůjde příliš daleko za rámec Y: pokud jako dědictví interaktivní inkarnace shellu můžeme snadno přejít k řešení dílčího úkolu žádný UNIX utilita, není absolutně potřeba ji v jazyce duplikovat a zůstanou tam pouze algoritmické a koordinační abstrakce.

Scénář

Než se zamyslíte schopnosti shellu Vyřešme tento problém ze dvou úhlů pohledu. Řekněme, že jsme napsali program v jazyce nějakého tlumočníka, například /bin/sh, a zapsali jej do určitého souboru, například /home/george/myscript (pokud je aktuální adresář /home/george, můžete použít kratší cesta: myscript). Jak mohu nyní spustit tento skript? Od muže sh víme, že k tomu můžeme utéct příkazový interpret s parametrem - název souboru:

$ cat myscript echo "Ahoj, Georgi!" $ /bin/sh myscript Ahoj, Georgi!

Lze se obejít bez názvu programu, který skript interpretuje? Obecně řečeno ne: UNIX má mnoho různých interpretů s různou syntaxí, například textový procesor awk, streamování textový editor sed, univerzální programovací jazyky python a perl a mnoho dalšího. Všechny tyto jazyky mají schopnost vkládat do textu skriptu řádkové komentáře, které začínají znakem „#“ a končí na konci řádku. Pokud tedy skript začíná znakem #, kterýkoli z těchto interpretů bude ignorovat celý první řádek jako komentář. Systém vidí "#!" na začátku souboru chápe, že se jedná o skript. Od třetího znaku do konce řádku přečte název programu, kterému tento soubor odešle ke spuštění. To znamená, že pokud je první řádek v /home/george/myscript #!/bin/sh , můžete jej bezpečně nastavit jako spustitelný (nastavit bit use) a spustit:

$ chmod +x myscript $ cat myscript #!/bin/sh echo "Dobrý den, $1!" $ ./myscript George Dobrý den, Georgi!

Přesně řečeno, po "#!" může to být cokoliv, například název programu, který jsme napsali, s některými požadovanými parametry; UNIX jej spustí a předá mu jako možnosti příkazového řádku požadované parametry (pokud existují), pak název skriptu a vše, co následuje (v našem příkladu George ). Pokud po "#!" bude neexistující soubor, systém vydá chybová zpráva:

$ cat myscript #!/bad/sh echo "Ahoj, $1!" $ ./myscript ./myscript: nenalezeno

Upozorňujeme, že tato zpráva údajně znamená, že samotný soubor skriptu nebyl nalezen. Pokud neznáte pozadí jevu, situace se zdá podezřelá. Faktem je, že při spuštění jakéhokoli programu, UNIX Vždy předá mu jeden parametr (který má index 0) - název tohoto programu. Pokud je však skript spuštěn, obslužná rutina obdrží jako parametr null nikoli svůj vlastní název, ale název skriptu. A když systém tento handler nenajde, bude v chybové zprávě uveden pod novým názvem.

Skořápková hnízda

A ještě jedna důležitá poznámka. Nejprve byl v UNIXu pouze jeden příkazový interpret, kterou napsal Stephen Bourne, a říkalo se jí jednoduše „shell“ (tj. shell a název utility je zkráceně sh). Byl to velmi jednoduchý malý program, takhle fungoval perfektně systémový integrátor, ale ve všech ostatních aspektech to bylo dost slabé. A tak tvůrce 3BSD napadlo, že potřebují úplně nový příkazový interpret, pohodlnější při práci na příkazovém řádku, s novými možnostmi programování a novou syntaxí blízkou jazyku C, který již zná každý programátor UNIX. Výsledný shell se jmenoval C shell (pro syntaxi příkazu; název utility je csh), byl mnohem výkonnější než ten starý, zahrnoval práci s historií, doplňování názvů souborů, řízení práce; se objevila pole a mnoho dalšího.




Nahoru