Shell příkazové jazyky shellu (sh, bash, ksh a další). Příkazový shell

Skořápky sh a bash jistě znají téměř všichni čtenáři Habr. Většina z nás také slyšela něco o zsh a tcsh. Tím však výčet existujících skořápek nekončí. Lze je zhruba rozdělit do tří skupin:

  • Bourne shell klony (bash, zsh)
  • C shell (csh, tcsh)
  • Na základě populárních programovacích jazyků (psh, ipython, scsh)
  • Exotické, specifické a všechny ostatní
O nejzajímavějších z nich bude řeč.

Účelem psaní tohoto článku nebylo revidovat nebo klasifikovat všechny existující příkazové shelly. Chci jen mluvit o některých zajímavých produktech v této oblasti a rozšířit čtenářům obzory. Budu rád. Pokud to někoho povzbudí k podrobnějšímu studiu tématu nebo dokonce k přechodu na jiné téma.
Nejprve krátce o tom, co to je. Příkazový shell nebo interpret příkazů je aplikace, která poskytuje uživateli rozhraní příkazového řádku, ve kterém uživatel buď zadává příkazy jednotlivě, nebo spouští skripty sestávající ze seznamu příkazů. Ústně a v neoficiálních textech se často nazývá „shell“, z anglického shell - shell.

Nejpoužívanější shelly kompatibilní s POSIX pocházejí z Bourne shellu, takže s tím začneme

Bourne shell a jeho klony

Bourne shell, spustitelný soubor: sh. Příkazový shell pojmenovaný po svém tvůrci Stephenu Bourneovi. Většina operátorů byla vypůjčena z jazyka ALGOL 68. Byl vydán v 7. vydání operačního systému UNIX, kde byl výchozím shellem. Dodnes má drtivá většina unixových systémů /bin/sh - symbolický nebo pevný odkaz na shell kompatibilní s sh.

Bourne shell znovu, spustitelný soubor: bash. Název lze přeložit jako „Reborn Walk of Bourne“. S největší pravděpodobností dnes nejoblíbenější shell. De facto standard pro Linux. Nebudu se tím zabývat, protože... Na internetu je spousta dobrých článků o bash. Například zde a zde.

Z shell, spustitelný soubor: zsh. Bezplatný moderní shell kompatibilní s SH. Oproti bash má řadu výhod, které se týkají především práce v interaktivním režimu. Psali o tom na Habré a
Kromě toho do této skupiny spadá několik mušlí: Korn shell (ksh) a Almquist shell (ash) atd., ale nebudeme se jim podrobně věnovat.

C shell

C shell, spustitelný soubor: csh Příkazový shell vyvinutý autorem vi Billem Joyem. Základem pro skriptovací jazyk csh byl, jak název napovídá, jazyk C. v té době, v roce 1978, to byl nejoblíbenější programovací jazyk mezi vývojáři a uživateli BSD UNIX. V současné době je populárnější bezplatná implementace csh tcsh.

TENEX C Shell, spustitelný soubor: tcsh. V tcsh se poprvé objevilo automatické dokončování. Toto je výchozí shell na FreeBSD. Můžete si o tom přečíst více.
Abych jasně ukázal rozdíl v syntaxi, uvedu několik příkladů skriptů, které dělají totéž pro csh a interpret příkazů kompatibilní s sh.

Podmíněná konstrukce:

Smyčka, která vypočítá prvních 10 mocnin dvou:

#!/bin/sh i=2 j=1 while [ $j -le 10 ]; do echo "2 **" $j = $i i=`expr $i "*" 2` j=`expr $j + 1` hotovo #!/bin/csh sada i = 2 sada j = 1 while ($j<= 10) echo "2 **" $j = $i @ i *= 2 @ j++ end

Seznam funkcí podporovaných nejnovějšími verzemi bash, zsh a tcsh je však velmi podobný a výběr konkrétního shellu je většinou otázkou vkusu. U méně běžných mušlí je situace jiná. Zde jsou rozdíly výraznější.

Příkazové shelly založené na populárních programovacích jazycích.

Perl Shell, spustitelný soubor: psh. Shell, který kombinuje vlastnosti výše uvedených shellů a sílu jazyka Perl. Protože psh je napsán v perlu a může dokonce běžet na Windows. Některé příklady použití psh:
ls | s/y/k/ # Náhrada pomocí regulárních výrazů ls | ( tisk ++$i, ": $_"; )q # Rychlý filtr. Uvnitř složených závorek je výraz v Perlu, kde $_ obsahuje jeden řádek výstupu. netstat | ( $_>2; )g # filtry grep. Vytisknou se pouze ty řádky, pro které výraz v závorkách vrátí hodnotu true, příkaz >[=FOO] # Přesměrování na otevřený příkaz deskriptoru souboru > soubor # Ekvivalent příkazu 2> soubor v bash. Přesměruje výstupní a chybový proud do souboru grep foo lib/**/*.pm # Use **, což znamená aktuální adresář a všechny podadresáře

ssh, spustitelný soubor scsh. Překladač příkazů s otevřeným zdrojovým kódem, který jako skriptovací jazyk používá schéma 48. Nepodporuje funkce standardní pro jiné shelly (historie příkazů, úpravy textu na příkazovém řádku, cesta/přidání příkazu). Skriptování se doporučuje, ale ne pro interaktivní práci. Může oslovit fanoušky funkčního programování. Níže je uveden příklad skriptu, který zobrazuje názvy všech spustitelných souborů umístěných v adresářích z proměnné prostředí PATH
#!/usr/local/bin/scsh -s !# (definovat (spustitelné soubory) (with-cwd dir (filtrovat spustitelný soubor? (adresář-soubory #t)))) (definovat (writeln x) (zobrazit x) (nový řádek)) (pro každý zápisln (spustitelné soubory append-map ((infix-splitter ":") (getenv "PATH")))))

IPython. Jedná se o interaktivní shell pro programovací jazyk Python, který má řadu dalších funkcí. IPython má speciální profil pro běh jako systémový shell. Způsob spuštění tohoto režimu závisí, jak tomu rozumím, na verzi, ale na mém počítači to vypadá takto:
ipython3 --profile=pysh

O IPythonu již bylo napsáno poměrně dost, a to i v ruštině (odkazy na konci článku). Pokusím se vyjmenovat jeho hlavní vlastnosti z hlediska použití jako příkazového shellu:

  • Víceplatformní. Existuje dokonce verze pro Windows
  • Python verze 2.x nebo 3.x jako skriptovací jazyk, vylepšené schopnosti introspekce
  • Automatické doplňování kódu Python, stejně jako názvy souborů a systémové příkazy.
  • Historie příkazů a na ní založená makra
  • Mechanismus, který urychluje navigaci v katalozích, záložkách a mnoho dalšího
Jak vidíte, z hlediska svých interaktivních schopností je IPython přinejmenším stejně dobrý jako bash. Pokud jde o skripty, IPython bude vhodný pro ty, kteří znají python lépe než bash. Ve skutečnosti se budou skripty IPythonu od čistého Pythonu lišit pouze ve zjednodušeném volání systémových příkazů. Zde je několik příkladů integrace pythonu a systémových příkazů:
# Řekněme, že jsme chtěli vypočítat celkovou velikost souborů protokolu dpkg: In : cd /var/log/ /var/log In : log_files = !ls -l dpkg.log* In : log_files Out: "-rw-r- -r-- 1 root root 1824 Nov 3 16:41 dpkg.log" In : pro řádek v log_files: ....: size += int(line.split()) ....: In : size Out: 1330009 # ...nebo postupně ping na deset hostitelů In : for i v rozsahu(100,110): ....: !ping -c 1 192.168.0.$i ....:
Odpočinek
Toto samozřejmě není úplný seznam ani populárních mušlí. Kromě výše uvedených kategorií existují i ​​takové, které používají vlastní syntaxi, která není kompatibilní s sh a nekopíruje existující jazyk. Příkladem může být přátelská interaktivní skořápka (ryba). Ale nakonec bych rád nemluvil o tom, ale o konkrétnějším spaní.

Sleep Dummy Shell, spustitelný soubor: spací skořápka. Přísně vzato, sleepshell nelze nazvat příkazovým procesorem, protože neumí zpracovávat příkazy. A obecně nemůže dělat nic jiného než periodicky zapisovat hvězdičky „*“ na standardní výstup. Používá se však přesně jako příkazový shell a z tohoto důvodu: Řekněme, že chceme někomu dát příležitost vytvořit ssh tunely přes náš server s Linuxem nebo Unixem. Přečtěte si více o tunelování ssh. Ale nepotřebujeme, aby měl někdo přístup k příkazovému řádku a souborovému systému našeho serveru. Sleepshell je pro takový případ určen. Vytvoříme účet na serveru jako shell a nainstalujeme pro něj sleepshell. Vlastník účtu bude moci připojovat a předávat porty, ale nebude moci provádět příkazy.

To je vše. Doufám, že to bylo zajímavé. Budu rád za jakékoli připomínky a rady k textu článku.

Související odkazy
www.faqs.org/faqs/unix-faq/shell/shell-differences - souhrnná tabulka rozdílů a podobností shellů
www.mariovaldez.net/software/sleepshell - Uspávací figurína
ipython.org/ipython-doc/dev/interactive/shell.html – IPython jako systémový shell
www.opennet.ru/base/dev/ipython_sysadmin.txt.html – IPython shell jako nástroj správce systému

    přání (UNIX shell)- Tento termín má jiné významy, viz Přání. wish (Windowing Shell) je jednoduchý skriptovatelný nebo interaktivní příkazový shell UNIX pro X Window System a Mac OS X. Poskytuje uživatelům kontrolu nad komponentami... ... Wikipedia

    Příkazový shell- Shell operačního systému (z anglického shell shell) je interpret příkazů operačního systému (OS), poskytující rozhraní pro interakci uživatele se systémovými funkcemi. Obecně existují shelly se dvěma typy rozhraní pro ... Wikipedia

    UNIX shell

    Unixový shell- UNIX command shell (anglicky Unix shell, často jen „shell“ nebo „sh“), příkazový interpret používaný v operačních systémech rodiny kompatibilních shellů POSIX, pocházející z Bourne shellu, který se objevil v Unixu verze 7. Obsah 1 ... ... Wikipedie

    Unix Shell- UNIX command shell (anglicky Unix shell, často jen „shell“ nebo „sh“), příkazový interpret používaný v operačních systémech rodiny kompatibilních shellů POSIX, pocházející z Bourne shellu, který se objevil v Unixu verze 7. Obsah 1 ... ... Wikipedie

    Příkazový řádek- Požadavek tlumočníka příkazového řádku je přesměrován sem. Je potřeba samostatný článek na téma „Interpret příkazového řádku“. Vzhled skořápky (anglicky Co ... Wikipedia

    UNIXový systém V- Mnoho potomků Systému V... Wikipedie

    Unixový systém V- Mnoho potomků System V AT T UNIX System V je jednou z verzí operačního systému v roce 1989. Byly vydány 4 hlavní verze, Release 1, 2, 3 a 4. System V Release 4 (SVR4) byl nejúspěšnější a populární a sloužil jako zdroj pro ... ... Wikipedii

    UNIX- Rodokmen UNIXových systémů UNIX (čti UNIX) je rodina přenosných, multitaskingových a víceuživatelských ... Wikipedia

    Unix- Rodokmen UNIXových systémů UNIX (čti Unix) je skupina přenosných, multitaskingových a víceuživatelských operačních systémů. První UNIXový systém byl vyvinut v roce 1969 divizí Bell Labs společnosti AT T. Od té doby byl vytvořen ... Wikipedia

knihy

  • Shell skripty. Linux, OS X a Unix. Průvodce, Taylor Dave. Shell skripty pomohly systémovým administrátorům a programátorům automatizovat rutinní úlohy od úsvitu počítačů. Od vydání prvního... Koupit za 1217 UAH (pouze Ukrajina)
  • Shell skripty. Linux, OS X a Unix, Taylor Dave, Perry Brandon. Shell skripty pomohly systémovým administrátorům a programátorům automatizovat rutinní úlohy od úsvitu počítačů. Od vydání prvního...

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, až do, 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).

Operátor -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 provedené sekvence.

Ú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, aby byla zahrnuta uzavírací závorka). 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ší 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í. Namísto == může být použito = .

    ř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

Tady OP- uh pak jedna z aritmetických porovnávacích operací: -ekv(rovná se), -ne(není stejné), -lt(méně než), -le(menší nebo stejné), -gt(více), -ge(více nebo stejně). 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ý operátor negace.

    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ů.

V operátorech se používají stejné podmíněné výrazy zatímco A až do, na který se podíváme níže.

5.8.3 Provozovatel pouzdro

Formát operátora pouzdro je:

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

tým pouzdro nejprve vytváří slovní expanzi slovo a pokusí se porovnat výsledek s každým ze vzorků vzor jeden za druhým. Po nalezení první shody se již 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

Operátor 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 je odeslána do standardního chybového proudu, přičemž každé slovo je doprovázeno pořadovým číslem. 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 na standardním vstupu. Pokud zadaný řetězec obsahuje číslo odpovídající jednomu ze zobrazených slov, pak proměnná název 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á název 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é název.

Zde je malý skript:

#!/bin/sh

echo "Jaký OS preferujete?"

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

přestávka

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

Operátor pro funguje trochu jinak než v běžných programovacích jazycích. Namísto zvýšení nebo snížení hodnoty některé proměnné o jednu pokaždé, když prochází smyčkou, přiřazuje 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

Obecně má příkaz for 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á název výsledné hodnoty jsou přiřazeny jedna po druhé a pokaždé se provede 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ásledujícím způsobem:

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 Operátoři zatímco A až do

Operátor zatímco funguje jako -li, pouze provádějící operátory ze seznamu seznam2 smyčka 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.

Operátor až do 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 proveden, 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 vlastní 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 není nezbytné, název 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 název 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 se spouštějí v kontextu aktuálního shellu: nespustí se nový proces k interpretaci funkce (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 vrátit se, provádění funkce se přeruší a řízení se po volání funkce přenese na příkaz. Když je funkce dokončena, 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 vytvořit lokální parametr, můžeme 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ší 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

Ještě jeden 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

Příkazový shell v UNIXu je rozhraní příkazového řádku v operačních systémech podobných Unixu, to znamená, že spouští příkazy zadané uživatelem nebo které se načítají ze souborů. Takové soubory s příkazy shellu se nazývají shell skripty (skripty, programy). Tyto skripty nejsou kompilovány, ale spíše interpretovány shellem. To znamená, že shell čte skript od začátku do konce, řádek po řádku, hledá tam zadané příkazy a provádí je; Oproti tomuto přístupu překladač převede celý program do podoby vhodné pro strojové spuštění – soubor s tímto kódem pak lze použít v shell skriptu. Charakteristickým rysem jazyka shellu je, že mnoho operací, které jsou zabudovány v tradičních programovacích jazycích, se provádí voláním externích programů.

Jedním z účelů shellu je poskytnout uživatelské prostředí, které lze přizpůsobit pomocí konfiguračních souborů.

Druhy mušlí

UNIX poskytuje na výběr několik různých shellů:

sh nebo Bourne shell ( Bourne Shell) jeden z prvních shellů používaných v prostředích podobných UNIXu. Toto je základní shell, malý a s malou sadou schopností. Je to de facto standardní shell a je přítomen na každém systému UNIX. V Linuxu může být /bin/sh symbolickým odkazem na bash. To se provádí pro zajištění kompatibility s aplikacemi UNIX. bash nebo nový Bourne shell ( Bourne znovu Shell) standardní prostředí Linuxu. Většina uživatelů Linuxu má nainstalovaný výchozí shell bash. Svým způsobem bash- toto je doplněk k sh, sadu doplňků a doplňkových modulů. Nový Bourne shell je tedy kompatibilní s běžným Bourne shell: spuštěné příkazy sh, bude pracovat v bash, ale ne nutně naopak. csh, nebo C-orientovaný shell ( C Shell) syntaxe tohoto shellu je podobná programovacímu jazyku C. Tento shell obvykle používají programátoři. tcsh nebo vylepšený obal orientovaný na C ( Turbo C Shell) nadstavba přes csh. ksh nebo Korn shell ( Korn Shell) Byla napsána na počátku 80. let a obdržela nejlepší vlastnosti tehdejšího Bourne shellu a csh. Je to doplněk pro Bourne shell a zaručuje provádění skriptů napsaných pro Bourne shell. Standard POSIX je Korn shell s omezenými schopnostmi.

Soubor /etc/shells obsahuje informace o shellech přítomných v systému:

Mia: ~> cat /etc/shells /Bin/bash /Bin/sh /Bin/tcsh /Bin/csh

Uživatelský shell je nainstalován v souboru /etc/passwd. Například uživatelský řetězec mia který má nainstalovaný shell bash :

Mia: L2NOfqdlPrHwE: 504:504: Mia Maya:/home/mia:/bin/bash

Přepínání mezi mušlemi

Uživatel může kdykoli spustit další shell. Například pokud ve výchozím nastavení funguje pod ovládacími prvky bash, ale je pro něj pohodlnější provádět některé akce pod skořápkou csh, spustí tento shell

Mia:~>csh

Pro návrat k ovládání bash musíte zadat exit.

Příkazový jazyk shell (v překladu shell, shell) je ve skutečnosti programovací jazyk na velmi vysoké úrovni. V tomto jazyce uživatel ovládá počítač. Obvykle po přihlášení začnete pracovat s příkazovým shellem. Známkou, že je shell připraven přijímat příkazy, je výzva, kterou zobrazuje na obrazovce. V nejjednodušším případě je to jeden dolar („$“). Shell není nutný a jediný příkazový jazyk (i když je to ten, který je standardizován v rámci POSIX, standardu mobilních systémů). Poměrně populární je například jazyk cshell, existují také kshell, bashell a další. Navíc si každý uživatel může vytvořit svůj vlastní příkazový jazyk. Může současně pracovat s různými příkazovými jazyky na jedné instanci operačního systému. shell je jedním z mnoha UNIXových příkazů. To znamená, že sada příkazů „shell“ obsahuje příkaz „sh“ - volání interpretu „shell“. První "shell" je volán automaticky, když se přihlásíte a zobrazí programátor. Poté můžete zavolat jakékoli příkazy k provedení, včetně samotného „shell“, který vám vytvoří nový shell uvnitř toho starého. Pokud tedy například připravíte soubor "file_1" v editoru:

Echo Ahoj!

pak to bude běžný textový soubor obsahující příkaz „echo“, který po provedení zobrazí na obrazovce vše napsané vpravo od něj. Soubor "file_1" můžete nastavit jako spustitelný pomocí příkazu "chmod 755 file_1". Ale lze to provést explicitním voláním příkazu "sh" ("shell"):

Sh soubor_1

Sh< file1

Soubor lze také spustit v aktuální instanci shellu. Pro toto "." existuje specifický příkaz. (tečka), tzn.

Soubor_1

Protože UNIX je víceuživatelský systém, můžete dokonce pracovat na osobním počítači paralelně na, řekněme, 12 obrazovkách (změna z obrazovky na obrazovku ALT/funkční klávesa), přičemž na každé obrazovce je nový (nebo stejný) uživatel s jeho vlastní příkazový shell. V grafickém režimu X-Window můžete také otevřít velké množství oken a každé okno může mít svého uživatele s vlastním příkazovým shellem... Základním prvkem jazyka shellu je příkaz.

Struktury příkazů:

Příkazy v shellu mají obvykle následující formát:

<имя команды> <флаги> <аргумент(ы)>

Například:

Ls -ls /usr/bin

Kde ls je název příkazu pro výstup obsahu adresáře, -ls jsou příznaky ("-" je znak příznaků, l je dlouhý formát, s je objem souborů v blocích), /usr/ bin je adresář, pro který je příkaz spuštěn. Tento příkaz zobrazí obsah adresáře /usr/bin v dlouhém formátu a přidá informace o velikosti každého souboru v blocích. Bohužel tato struktura příkazu není vždy dodržena . Před příznakem není vždy znaménko mínus a před příznakem není vždy jedno slovo. Ano, rozmanitost v prezentaci argumentů. Příkazy s exotickými formáty zahrnují takové „spuštěné“ příkazy jako cc – volání kompilátoru jazyka C, tar – pracovní s archivy, dd - zkopírování souboru s konverzí, find - vyhledání souborů a řada dalších Zpravidla shell vnímá první slovo jako příkaz, proto na příkazovém řádku

první slovo bude dešifrováno shellem jako příkaz (zřetězení), který zobrazí soubor s názvem "cat" (druhé slovo) umístěný v aktuálním adresáři. Přesměrování příkazů Standardní vstup (vstup) - "stdin" v OS UNIX se provádí z klávesnice terminálu a standardní výstup (výstup) - "stdout" je směrován na obrazovku terminálu. Existuje také standardní soubor diagnostických zpráv - „stderr“, o kterém bude řeč o něco později. Příkaz, který může pracovat na standardním vstupu a výstupu, se nazývá FILTER. Uživatel má pohodlné prostředky pro přesměrování vstupu a výstupu na jiné soubory (zařízení). Symboly ">" a ">>" označují přesměrování výstupu. ls >soubor_1 Příkaz "ls" vygeneruje seznam souborů v aktuálním adresáři a umístí jej do souboru "soubor_1" (místo tisku na obrazovku). Pokud soubor "file_1" dříve existoval, bude přepsán novým.

Pwd >>soubor_1

příkaz pwd vytvoří celý název aktuálního adresáře a umístí jej na konec souboru "soubor_1", tzn. ">>" se připojí k souboru, pokud není prázdný. symboly"<" и "<<" обозначают перенаправление ввода.

WC -l

spočítá a zobrazí počet řádků v souboru file_1.

Ed soubor_2<

vytvoří soubor "file_2" pomocí editoru přímo z terminálu. Konec vstupu je určen znakem vpravo "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

WC -l soubor_4

Wc -l >soubor_4

se provádějí stejným způsobem: spočítá se počet řádků v souboru "soubor_3" a výsledek se uloží do souboru "soubor_4". Prostředek, který kombinuje standardní výstup jednoho příkazu se standardním vstupem jiného příkazu, se nazývá POTRUBÍ a je označen svislým pruhem "|".

ls | wc -l

na vstup příkazu "wc" se odešle seznam souborů v aktuálním adresáři, který zobrazí počet řádků v adresáři. Potrubí může také kombinovat více než dva příkazy, když všechny, možná kromě prvního a posledního, jsou filtry:

Kočičí soubor_1 | grep -h výsledek | seřadit | cat -b > soubor_2

Tento kanál ze souboru "file_1" ("cat") vybere všechny řádky obsahující slovo "result" ("grep"), seřadí ("sort") výsledné řádky a poté očísluje ("cat -b") a vytiskněte výsledek do souboru "file_2". Protože zařízení UNIX jsou reprezentována speciálními soubory, lze je použít v přesměrování. Speciální soubory jsou umístěny v adresáři "/dev". Například "lp" - tisk; "console" - konzole; "ttyi" - i-tý terminál; "null" je fiktivní (prázdný) soubor (zařízení). Pak např.

Ls > /dev/lp

vytiskne obsah aktuálního adresáře a soubor_1< /dev/null обнулит файл "file_1".

Seřadit soubor_1 | tričko /dev/lp | ocas -20

V tomto případě bude soubor "file_1" setříděn a vytištěn a na obrazovce bude vytištěno také posledních 20 řádků. Vraťme se k přesměrování výstupu. Standardní soubory jsou číslovány:

0 - stdin, 1 - stdout 2 - stderr. Pokud nechcete, aby se na obrazovce zobrazovala chybová zpráva, můžete ji přesměrovat z obrazovky do vámi určeného souboru (nebo ji zcela zahodit přesměrováním do souboru „prázdného zařízení“ - /dev/null). Například při provádění příkazu

Kočičí soubor_1 soubor_2

který by měl na obrazovce postupně zobrazovat obsah souborů „file_1“ a „file_2“, dá vám to např.

111111 222222 cat: f2: Žádný takový soubor nebo adresář

kde 111111 222222 je obsah souboru "file_1" a soubor "file_2" chybí, což příkaz "cat" standardně nahlásil do standardního diagnostického souboru, stejně jako standardní výstup reprezentovaný obrazovkou. Pokud takovou zprávu na obrazovce nechcete, můžete ji přesměrovat do souboru, který určíte:

Kočičí soubor_1 soubor_2 2>f-err

chybové zprávy budou odeslány (jak je indikováno přesměrováním "2>") do souboru "f-err". Mimochodem, všechny informace můžete odeslat do jednoho souboru „ff“, v tomto případě pomocí konstrukce

Cat soubor_1 soubor_2 >>ff 2>ff

Můžete určit nejen, na který standardní soubor se má přesměrovat, ale také na který standardní soubor se má přesměrovat.

Kočičí soubor_1 soubor_2 2>>ff 1>&2

Zde je nejprve "stderr" přesměrován (v režimu připojení) do souboru "ff" a poté je standardní výstup přesměrován na "stderr", což je v tomto okamžiku soubor "ff". To znamená, že výsledek bude podobný předchozímu. Konstrukce "1>&2" znamená, že kromě čísla standardního souboru, na který se má přesměrovat, musíte vložit "&" před; celá struktura je psána bez mezer.<- закрывает стандартный ввод. >- zavře standardní výstup. Soubory příkazů. Existuje několik možností, jak povolit použití textového souboru jako příkazu. Pomocí editoru vytvoříme soubor s názvem "cmd" obsahující jeden řádek, jako je tento:

Datum; pwd; ls

Shell můžete zavolat jako příkaz, označený „sh“, a předat mu soubor „cmd“ jako argument nebo jako přesměrovaný vstup, tzn.

$ sh cmd

$sh

Výsledkem provedení kteréhokoli z těchto příkazů bude datum, poté název aktuálního adresáře a poté obsah adresáře. Zajímavější a pohodlnější možností pro práci s dávkovým souborem je přeměnit jej na spustitelný, tzn. stačí z toho udělat příkaz, kterého se dosáhne změnou bezpečnostního kódu. Chcete-li to provést, musíte povolit spuštění tohoto souboru. Například,

Chmod 711 cmd

vytvoří bezpečnostní kód "rwx__x__x". Pak jednoduchý hovor

provede stejné tři příkazy. Výsledek bude stejný, pokud soubor s obsahem

Datum; pwd; ls

je reprezentován ve tvaru: date pwd ls od přechodu na jiný řádek je také oddělovač v posloupnosti příkazů. Spustitelné soubory tedy mohou být nejen soubory získané kompilací a sestavením, ale také soubory napsané v jazyce shellu. Provádějí se v interpretačním režimu pomocí interpretu shellu

Ladění dávkových souborů

SHELL používá dva mechanismy pro ladění dávkových souborů. První z nich je: set -v vytiskne řádky příkazového souboru při jejich čtení. Tento režim se používá při hledání syntaktických chyb. Chcete-li jej použít, nemusíte upravovat soubor příkazu, například: sh -v proc... zde proc je název souboru příkazu. Přepínač -v lze použít ve spojení s přepínačem -n, který zabraňuje provádění následných příkazů (příkaz set -n blokuje terminál, dokud není zadán příznak EOF). Příkaz set -x zobrazuje příkazy tak, jak jsou prováděny, a programové řádky jsou odesílány na terminál a jejich hodnoty jsou nahrazeny místo proměnných. Chcete-li zrušit přepínače -x a -v, můžete použít příkaz set - a pro instalaci přiřadit odpovídající hodnotu proměnné makra. PROSTŘEDÍ SHELL (PROMĚNNÉ A PARAMETRY) V jazyce shellu můžete psát dávkové soubory a pomocí příkazu "chmod" je učinit spustitelnými. Poté se neliší od ostatních příkazů OS UNIX.

Proměnné shellu

Název proměnné shellu je posloupnost písmen, čísel a podtržítek začínající písmenem. Hodnota proměnné shellu je řetězec znaků. Skutečnost, že v shellu jsou pouze dva typy dat: řetězec znaků a textový soubor na jedné straně usnadňuje zapojení koncových uživatelů do programování, kteří nikdy předtím neprogramovali, a na straně druhé, vyvolává určitý vnitřní protest u mnoha programátorů, kteří jsou zvyklí na výrazně větší rozmanitost a větší flexibilitu jazykových prostředků. Je však zajímavé sledovat, jak vysoce kvalifikovaní programátoři, kteří se seznámili s „pravidly hry“ shellu, v něm píší programy mnohokrát rychleji než v C, ale co je obzvláště zajímavé, v některých případech tyto programy běží ještě rychleji než ty implementované v C. Název proměnné je podobný tradiční myšlence identifikátoru, tj. jméno může být posloupnost písmen, čísel a podtržítek, začínající písmenem nebo podtržítky. Operátor přiřazení "=" lze použít k přiřazení hodnot proměnným.

Var_1=13 - "13" není číslo, ale řetězec dvou číslic. var_2="UNIX OS" - Dvojité uvozovky (" ") jsou zde povinné, protože v řetězci je mezera.

Jiné způsoby přiřazování hodnot proměnným shellu jsou také možné. Například záznam

DAT=`datum`

způsobí, že příkaz "date" bude proveden jako první (zaškrtnutí označují, že přiložený příkaz musí být proveden jako první) a výsledek jeho provedení, namísto výstupu na standardní výstup, je přiřazen jako hodnota proměnné v tento případ "DAT". Hodnotu proměnné můžete také přiřadit pomocí příkazu "read", který zajistí, že hodnota proměnné bude přijata z displeje (klávesnice) v dialogovém režimu. Obvykle před příkazem "číst" v dávkovém souboru předchází příkaz "echo", který umožňuje předem zobrazit nějakou zprávu na obrazovce. Například:

Echo -n "Zadejte třímístné číslo:" přečte x

Při provádění této části souboru příkazu po zobrazení zprávy

Zadejte třímístné číslo:

překladač se zastaví a počká na zadání hodnoty z klávesnice. Pokud jste zadali, řekněme, "753", stane se to hodnotou proměnné "x". Jeden příkaz "read" může číst (přiřadit) hodnoty několika proměnným najednou. Pokud je ve "čtení" více proměnných, než je zadáno (odděleno mezerami), zbývajícím se přiřadí prázdný řetězec. Pokud je v příkazu „read“ více přenášených hodnot než proměnných, pak jsou ty nadbytečné ignorovány. Při přístupu k proměnné shellu musíte před jménem uvést symbol "$". Na obrazovce se tedy zobrazí příkazy echo $var_2 echo var_2

UNIX OS var_2 Escape

Pojďme se blíže podívat na únikové techniky používané v shellu. Dvojité uvozovky (" "), jednoduché uvozovky (" ") a zpětná lomítka (\) se používají jako úniková zařízení. Jejich činnost je zřejmá z příkladů: Můžete napsat několik úkolů na jeden řádek.

X=22 y=33 z=$x A="$x" B="$x" C=\$x D="$x + $y + $z" E="$x + $y + $z " F=$x\ +\ $y\ +\ $z

(přiřazení G=$x+$y by selhalo kvůli mezerám) Potom

Echo A = $A B = $B C = $C echo D = $D E = $E F = $F eval echo hodnoceno A = $A eval echo hodnoceno B = $B eval echo hodnoceno C = $C

Zobrazí se na obrazovce

A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 hodnoceno A = 22 hodnoceno B = 22 hodnoceno C = 22

Uveďme několik dalších příkladů souvisejících s únikem řádků. Nechte proměnnou "string" přiřadit hodnotu "pole" 2x3: abc def Všimněte si, že abyste se vyhnuli přiřazení dalších mezer, druhý řádek pole začíná od první pozice následujícího řádku: string="abc def" Potom existují tři možnosti zápisu proměnné do příkazu "echo" echo $string echo "$string" echo "$string" dá tři různé výsledky: abc def $string abc def a sekvenci příkazů echo "str_1 str_2" > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 poskytne sekvenčně identické soubory file_1 a file_2: str_1 str_2 str_1 str_2 Všimněte si také, že zpětné lomítko (\) nejenže uniká znaku, který za ním následuje, což umožňuje jednoduché použití speciálních znaků jako znaky reprezentující samy sebe (může také uniknout sám sobě - ​​\\), ale v příkazovém souboru vám zpětné lomítko umožňuje zřetězit řádky do jednoho (ukončit konec řádku). Například výše uvedený příklad příkazového řádku:

Kočičí soubor_1 | grep -h výsledek | seřadit | cat -b > soubor_2

lze zapsat do dávkového souboru, řekněme jako

Kočičí soubor_1 | grep -h\výsledek | seřadit | cat -b > soubor_2

Mimochodem, symbol dopravníku také poskytuje efekt pokračování příkazového řádku. V tomto případě by to mohlo dát hezčí výsledek, jako je tento:

Kočičí soubor_1 | grep -h výsledek | seřadit | cat -b > soubor_2

Manipulace s proměnnými shellu Přestože jsou proměnné shellu obecně vnímány jako řetězce, tedy „35“ není číslo, ale řetězec dvou znaků „3“ a „5“, lze je v řadě případů interpretovat různě, například jako celá čísla. Příkaz "expr" má různé možnosti. Pojďme si některé ilustrovat na příkladech: Spuštění dávkového souboru:

X=7 y=2 a=`výraz $x + $y` ; echo a=$a a=`expr $a + 1` ; echo a=$a b=`expr $y - $x` ; echo b=$b c=`výraz $x "*" $y` ; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; echo e=$e

se zobrazí na obrazovce

A=9 a=10 b=-5 c=14 d=3 e=1

Operace násobení ("*") musí být escapována, protože v shellu je tato ikona vnímána jako speciální znak, což znamená, že na tomto místě lze nahradit jakoukoli sekvenci znaků. S příkazem "expr" jsou možné nejen (celočíselné) aritmetické operace, ale také operace s řetězci:

A=`expr "koktejl" : "kohout"` ; echo $A B=`expr "koktejl" : "ocas"` ; echo $B C=`expr "koktejl" : "vařit"` ; echo $C D=`expr "kohout" : "koktejl"` ; echo $D

Na obrazovce se zobrazí čísla zobrazující počet odpovídajících znaků v řetězcích (od začátku). Druhý řádek nemůže být delší než první:

4 0 0 0

Export proměnných OS UNIX má koncept procesu. Proces nastane, když je proveden příkaz. Například při psaní „p“ na klávesnici Vytvoří se „proces „p“. Na druhé straně „p“ může plodit další procesy. Předpokládejme, že „p“ volá „p1“ a „p2“, které postupně vytvářejí odpovídající procesy. Každý proces má své vlastní prostředí – a sada proměnných, které má k dispozici Například před spuštěním „p" již existovalo prostředí, ve kterém již byly některé proměnné definovány. Spuštěním „p" se vytvoří nové prostředí, v němž již budou vygenerovány „p1“ a „p2“. Proměnné jsou lokální pro proces, ve kterém byly deklarovány, tedy kde jsou jim přiřazeny hodnoty. Aby byly dostupné dalším spawnovaným procesům, musí být explicitně předány. K tomu použijte vestavěný příkaz "export".

Možnosti

Parametry lze předávat do příkazového souboru. Shell používá poziční parametry (tj. důležité je pořadí, ve kterém se objevují). V příkazovém souboru začínají proměnné odpovídající parametrům (podobně jako proměnné shellu) symbolem "$", za kterým následuje jedno z čísel od 0 do 9: Nechť se "examp-1" volá s parametry "cock" a „ocas“. Tyto parametry jdou do nového prostředí pod standardními názvy "1" a "2". (Standardní) proměnná s názvem "0" bude ukládat název volaného výpočtu. Při přístupu k parametrům je číslu předřazen symbol dolaru "$" (jako při přístupu k proměnným): $0 odpovídá názvu tohoto příkazového souboru; $1 je první parametr v pořadí; $2 sekundový parametr atd. Vzhledem k tomu, že počet proměnných, kterým lze parametry předávat, je omezen na jednu číslici, tzn. 9. („0“, jak již bylo uvedeno, má zvláštní význam), pak se pro přenos většího počtu parametrů používá speciální příkaz „shift“. Příkaz "set" poskytuje jedinečný přístup k parametrům. Například fragment

Nastavte a b s ozvěnou první=$1 sekunda=$2 třetí=$3

se zobrazí na obrazovce

První=a druhý=b třetí=c

těch. Příkaz "set" nastavuje hodnoty parametrů. To může být velmi pohodlné. Například příkaz "date" zobrazí aktuální datum, řekněme "Mon May 01 12:15:10 2000", skládající se z pěti slov, pak

Nastavit odezvu `date` $1 $3 $5

se zobrazí na obrazovce

Po 01 2000

Příkaz "set" také umožňuje řídit provádění programu, například: řádky set -v se vypisují na terminál, čte je shell. set +v zruší předchozí režim. set -x vypíše příkazy do terminálu před provedením. set +x zruší předchozí režim. Příkaz "set" bez parametrů zobrazí terminálu stav softwarového prostředí.

Náhrady shellu

Před přímou interpretací a prováděním příkazů obsažených v příkazových souborech shell provádí různé typy substitucí: 1. NÁHRADA VÝSLEDKŮ. Všechny příkazy uzavřené v uvozovkách se provedou a na jejich místo se nahradí výsledek. 2. NÁHRADA HODNOT PARAMETRŮ A PROMĚNNÝCH. To znamená, že slova začínající na "$" jsou nahrazena odpovídajícími hodnotami proměnných a parametrů. 3. INTERPRETACE MEZER. Uniklé mezery jsou ignorovány. 4. GENEROVÁNÍ NÁZVŮ SOUBORŮ. Slova se kontrolují na přítomnost speciálních znaků ("*", "?",") a provádějí se odpovídající generace. Softwarové prostředí Každý proces má své prostředí, ve kterém běží. Shell používá řadu těchto proměnných prostředí. Pokud zadáte příkaz „set“ bez parametrů, na obrazovce se zobrazí informace o řadě standardních proměnných vytvořených při přihlášení (a následně předávaných všem vašim novým procesům „zděděných“) a také o proměnných vytvořených a exportovaných vašimi procesy . Konkrétní typ a obsah informačního výstupu závisí do značné míry na tom, jaká verze UNIXu je použita a jak je systém nainstalován.

Výsledek provedení příkazu set bez parametrů (není úplný):

HOME=/root PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/ sae/STUDY/SHELL PS1=$(PWD):" " PS2=> SHELL=/bin/bash

Pojďme se vyjádřit k hodnotám proměnných. HOME=/root je název domovského adresáře, kam uživatel skončí po přihlášení. To znamená, že po správném zadání jména a hesla se ocitnu v adresáři „/root“. PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 – tato proměnná určuje sekvenci souborů, které shell hledá při hledání příkazu. Názvy souborů jsou zde odděleny dvojtečkami. Pořadí zobrazení odpovídá pořadí jmen ve stezce. Ale zpočátku se vyhledávání vyskytuje mezi takzvanými vestavěnými příkazy. Mezi vestavěné příkazy patří nejčastěji používané příkazy, jako je "echo", "cd", "pwd", "date". Poté se systém podívá do adresáře „/bin“, který může obsahovat příkazy „sh“, „cp“, „mv“, „ls“ atd. Dále adresář "/usr/bin" s příkazy "cat", "ss", "expr", "nroff", "man" a mnoha dalšími. Dále probíhá hledání v aktuálním adresáři (."", nebo jiném označení "prázdný", tedy ""), kde se s největší pravděpodobností nacházejí vámi napsané příkazy. Po zadání příkazového řádku a stisknutí "shell" (po provedení nezbytných substitucí) rozpozná název odpovídající příkazu a vyhledá jej v adresářích uvedených v PATH. Pokud je příkaz umístěn mimo tyto adresáře, nebude nalezen. Pokud existuje několik příkazů se stejným názvem, bude vyvolán ten, který se nachází v adresáři zobrazeném jako první. PATH, stejně jako ostatní proměnné, lze snadno změnit přidáním, přeskupením nebo odstraněním adresářů. IFS= (Internal Field Separator) uvádí znaky, které slouží k oddělení slov (polí). Jsou to „mezera“, „tabulátor“ a „odřádkování“, takže zde vlevo od zadání není nic vidět a dva řádky jsou obsazené. LOGNAME=root - přihlašovací jméno (“jméno uživatele”). MAIL=/var/spool/mail/root - název souboru, do kterého je přijímána (e-mailová) pošta. PWD=/root - název aktuálního adresáře PS1=$(PWD): " " - typ adresáře. V tomto případě výzva zobrazí název aktuálního adresáře následovaný dvojtečkou a mezerou. To znamená, že tam bude "/root:". PS2=> - tato výzva (zde ">") se používá jako výzva k pokračování v zadávání (na dalším řádku) nedokončeného příkazu. Zadejte například otevírací závorku "(" a po stisknutí na dalším řádku uvidíte tuto výzvu. Pokud nevíte, jak dál, zadejte uzavírací závorku ")" a zmizí. SHELL=/bin/sh – Tato proměnná určuje shell, který uživatel používá. V tomto případě se používá standardní shell („sh“). Počáteční prostředí se nainstaluje automaticky po přihlášení pomocí souborů jako "/etc/rc" a "/etc/.profile". Jedním ze způsobů, jak jednoduše změnit prostředí (například cestu pro vyhledávání příkazů, typ programu, typ prostředí, barvu obrazovky atd.), je umístění těchto informací do vašeho domovského adresáře ve specializovaném souboru „.profile“ ($(HOME)/ . profile), přiřazení požadovaných hodnot proměnným prostředí. To znamená, zavolejte tento soubor do editoru a napište, co chcete). Poté se při každém přihlášení automaticky spustí tento soubor a nainstaluje nové prostředí. Tento soubor MUSÍ být umístěn ve vašem HOME adresáři (přihlašovací adresář). Je třeba mít na paměti, že názvy souborů začínající tečkou mají obecně zvláštní status. Nezobrazují se tedy na obrazovce pomocí jednoduchého příkazu "ls" - tento příkaz musíte zavolat s příznakem "-a". Mimochodem, nejsou ničeny bez rozdílu příkazem „rm *“. Samotný interpret shellu automaticky přiřazuje hodnoty následujícím proměnným (parametrům): ? hodnota vrácená posledním příkazem; $ číslo procesu; ! číslo procesu na pozadí;

  1. počet pozičních parametrů předávaných do shellu;
  • seznam parametrů jako jeden řádek;

@ seznam parametrů jako sada slov; - vlajky předány do pláště. Při přístupu k těmto proměnným (to znamená, když je používáte v příkazovém souboru - shell program), byste měli dát "$" dopředu. Důležitou roli při vytváření jedinečných souborů hraje speciální proměnná „$$“, jejíž hodnota odpovídá číslu procesu provádějícího tento výpočet. Každý nový výpočet provedený počítačem zahájí jeden nebo více procesů, které automaticky přijímají čísla v pořadí. Pokud tedy použijete jako název souboru číslo procesu, můžete si být jisti, že každý nový soubor bude mít nové jméno (nebude zapsáno místo existujícího). Výhodou je i hlavní nevýhoda tohoto způsobu pojmenování souborů. Není známo, jaká jména budou souborům přiřazena. A pokud v rámci tohoto procesu najdete soubor „bez hledání“, tedy přístupem pomocí $$, lze takové soubory snadno ztratit. To vytváří další problémy při ladění programů. Volání tlumočníka Po registraci uživatele do systému (příkazem login) je volán tlumočník jazyka SHELL. Pokud registrační adresář uživatele obsahuje soubor .profile, pak před přijetím alespoň jednoho příkazu z terminálu provede interpret tento soubor (předpokládá se, že soubor .profile obsahuje příkazy). Při volání lze zadat následující klíče: -c řetězec Příkazy se čtou z daného řetězce. -s Příkazy se čtou ze standardního vstupu. Zprávy tlumočníka se zapisují do standardního diagnostického souboru. -i Interaktivní provozní režim. Pokud je prvním znakem parametru "0" znak -, pak se příkazy čtou ze souboru .profile.

STRUKTURY PROGRAMU===

Jako v každém programovacím jazyce může text shellu obsahovat komentáře. K tomu slouží symbol „#“. Vše, co je na řádku (v příkazovém souboru) nalevo od tohoto znaku, vnímá interpret jako komentář. Například,

# Toto je komentář.

Jako každý procedurální programovací jazyk má i jazyk shell operátory. Řada operátorů umožňuje řídit sekvenci provádění příkazů. U takových operátorů je často nutné zkontrolovat podmínku, která určuje směr, kterým výpočty pokračují.

Příkaz Test("")

Příkaz test kontroluje, zda je splněna určitá podmínka. Pomocí tohoto (vestavěného) příkazu se generují příkazy pro výběr a smyčku jazyka shellu. Dva možné formáty příkazů:

Zkušební stav

[podmínka]

použijeme druhou možnost, tzn. Místo toho, abychom před podmínku psali slovo „test“, uzavřeme podmínku do závorek, což je pro programátory běžnější. Shell tento příkaz ve skutečnosti rozpozná podle otevírací závorky "[" jako slova odpovídající příkazu "test". Mezi závorkami a podmínkou, kterou obsahují, musí být mezery. Mezi hodnotami a symbolem porovnání nebo operace musí být také mezery.Shell používá podmínky různých "typů". PODMÍNKY KONTROLY SOUBORU: -f soubor soubor "soubor" je běžný soubor; -d soubor soubor "soubor" - adresář; -с soubor soubor "soubor" je speciální soubor; -r soubor má oprávnění číst soubor "soubor"; -w soubor má oprávnění zapisovat do souboru "soubor"; -s soubor soubor "soubor" není prázdný.

PODMÍNKY PRO TESTOVÁNÍ ŘETĚZCŮ: str1 = str2 řetězce "str1" a "str2" se shodují; str1 != str2 řetězce "str1" a "str2" nejsou stejné; -n str1 řetězec "str1" existuje (není prázdný); -z str1 řetězec "str1" neexistuje (prázdný). Příklady.

X="kdo je kdo"; export x; [ "kdo je kdo" = "$x" ]; echo $? 0 x=abc; export x ; [ abc = "$x" ] ; echo $? 0 x=abc; export x ; [ -n "$x" ] ; echo $? 0 x="" ; export x ; [ -n "$x" ] ; echo $? 1

Kromě toho existují dvě standardní hodnoty podmínky, které lze použít místo podmínky (k tomu nejsou potřeba žádné závorky). PODMÍNKY PRO POROVNÁNÍ CELÝCH ČÍSEL: x -eq y "x" se rovná "y", x -ne y "x" se nerovná "y", x -gt y "x" je větší než "y", x - ge y "x" je větší nebo rovno "y", x -lt y "x" menší než "y", x -le y "x" menší nebo rovno "y". KOMPLEXNÍ PODMÍNKY: Implementováno pomocí standardních logických operací: ! (ne)obrátí hodnotu výstupního kódu. -o (nebo) odpovídá logickému "OR". -a (a) odpovídá logickému "AND".

Podmíněné prohlášení "pokud"

Obecně platí, že příkaz "if" má strukturu

Pokud podmínka, pak seznam

Zde „elif“ lze použít zkrácenou verzi „else if“ spolu s plnou verzí, tj. vnoření libovolného počtu příkazů "if" (i jiných příkazů) je povoleno. Samozřejmě, že „seznam“ musí být v každém případě smysluplný a přijatelný v daném kontextu. Nejvíce zkrácená struktura tohoto operátoru

Pokud podmínka, pak seznam fi

pokud je podmínka splněna (obvykle je to místo, kde je přijat kód dokončení "0"), pak se "seznam" provede, jinak je přeskočen. Příklady: Nechť se zapíše "if-1"

Pokud [ $ 1 -gt $ 2 ]

pak pwd else echo $0: Dobrý den!

Potom zavolání if-1 12 11 vytvoří /home/sae/STUDY/SHELL a if-1 12 13 vytvoří if-1: Ahoj!

Volat operátorovi ("případ")

Operátor výběru "case" má strukturu:

Řetězec pouzdra dovnitř

šablona) seznam příkazů; šablona) seznam příkazů; ... šablona) seznam příkazů;;

Zde jsou „case“, „in“ a „esac“ funkčními slovy. "Řetězec" (může to být jeden znak) je porovnán se "vzorem". Poté se provede "seznam příkazů" vybraného řádku. ";;" na konci výběrových řádků vypadá neobvykle, ale zde napište ";". byla by to chyba. Pro každou alternativu lze provést více příkazů. Pokud jsou tyto příkazy napsány na jednom řádku, pak symbol ";" bude použit jako oddělovač příkazů. Poslední řádek výběru má obvykle vzor "*", což ve struktuře "případ" znamená "libovolnou hodnotu". Tento řádek je vybrán, pokud hodnota proměnné (zde $z) neodpovídá žádnému z dříve zapsaných vzorů oddělených závorkou ")". Hodnoty jsou zobrazeny v pořadí, v jakém byly zapsány.

Operátor výčtové smyčky ("for")

Operátor smyčky "for" má strukturu:

Pro jméno

do seznam provedených příkazů, kde "for" je pomocné slovo, které definuje typ smyčky, "do" a "done" jsou pomocná slova, která zvýrazňují tělo smyčky. Nechte příkaz "lsort" reprezentovat dávkový soubor

Pro i v soubor_1 soubor_2 soubor_3 proveďte proc_sort $i hotovo

V tomto příkladu název "i" funguje jako parametr smyčky. Tento název lze považovat za proměnnou shellu, ke které jsou postupně přiřazeny uvedené hodnoty (i=soubor_1, i=soubor_2, i=soubor_3) a příkaz „proc_sort“ se provádí ve smyčce. Často se používá tvar „pro i v *“, což znamená „pro všechny soubory v aktuálním adresáři“. Nechť "proc_sort" je reprezentován dávkovým souborem

Kočka 1 $ | seřadit | tee /dev/lp > $(1)_sorted

těch. určené soubory jsou seřazeny postupně, výsledky třídění jsou vytištěny ("/dev/lp") a odeslány do souborů file_1_sorted file_2_sorted a file_3_sorted

Příkaz smyčky s pravdivou podmínkou ("while")

Struktura „while“, která také provádí výpočty, je vhodnější, když přesný seznam hodnot parametrů není předem znám nebo je tento seznam nutné získat jako výsledek výpočtů ve smyčce. Příkaz cyklu "while" má strukturu:

Zatímco podmínka

do seznam provedených příkazů, kde "while" je pomocné slovo, které určuje typ smyčky s pravdivou podmínkou. Seznam příkazů v těle smyčky (mezi „do“ a „done“) se opakuje, dokud podmínka nezůstane pravdivá (tj. kód dokončení posledního příkazu v těle smyčky je „0“) nebo dokud se smyčka nepřeruší zevnitř pomocí speciálních příkazů ("break", "continue" nebo "exit"). Když poprvé vstoupíte do smyčky, podmínka musí být pravdivá. Příkaz "break [n]" umožňuje vymanit se ze smyčky. Pokud "n" chybí, pak je ekvivalentní "break 1". "n" označuje počet vnořených smyček, ze kterých se má opustit, například "přerušení 3" - výstup ze tří vnořených smyček. Na rozdíl od příkazu "break" příkaz "continue [n]" pouze zastaví provádění aktuální smyčky a vrátí se na ZAČÁTEK smyčky. Může být i s parametrem. Například "pokračovat 2" znamená výstup na začátek druhé (počítáno z hloubky) vnořené smyčky. Příkaz "exit [n]" umožňuje ukončit proceduru společně s návratovým kódem "0" nebo "n" (pokud je zadán parametr "n"). Tento příkaz lze použít ve více než jen smyčkách. I v lineární sekvenci příkazů může být užitečné při ladění zastavit (aktuální) výpočet v daném bodě.

Příkaz smyčky s nepravdivou podmínkou ("až")

Operátor smyčky "až" má strukturu:

Až do stavu

do seznam provedených příkazů, kde "až" je pomocné slovo, které určuje typ smyčky s chybnou podmínkou. Seznam příkazů v těle smyčky (mezi "do" a "done") se opakuje, dokud podmínka nezůstane nepravdivá nebo dokud není smyčka přerušena zevnitř speciálními příkazy ("break", "continue" nebo "exit" ). Při prvním vstupu do smyčky by podmínka neměla být pravdivá. Rozdíl oproti operátoru "while" spočívá v tom, že podmínka smyčky je kontrolována na nepravdivost (pro nenulový výstupní kód posledního příkazu těla smyčky) a je kontrolována PO každém (včetně prvního!) provedení příkazů v tělo smyčky. Příklad.

Dokud to neudělají falešní

read x if [ $x = 5 ] then echo dost ; break else echo some more fi

Zde program čeká v nekonečné smyčce na zadaná slova (opakováním fráze „nějaké další“ na obrazovce), dokud nezadáte „5“. Poté se vydá "dost" a příkaz "break" zastaví provádění smyčky.

Prázdný operátor

Prázdný příkaz má formát

:

Nicnedělání. Vrátí hodnotu "0".

Funkce v shellu

Funkce umožňuje připravit seznam příkazů shellu pro následné provedení. Popis funkce vypadá takto:

Name() (seznam příkazů)

po kterém je funkce volána jménem. Po provedení funkce se nevytvoří žádný nový proces. Běží v prostředí odpovídajícího procesu. Argumenty funkce se stanou jejími pozičními parametry; název funkce je její nulový parametr. Provádění funkce můžete přerušit pomocí operátoru "return [n]", kde (volitelné) "n" je návratový kód.

Manipulace s přerušením ("past")

Může být nutné chránit provádění programu před přerušením. Nejčastěji se setkáváte s následujícími přerušeními odpovídajícími signálům: 0 odchod z tlumočníka, 1 zavěšení (odpojení vzdáleného účastníka), 2 přerušení od , 9 zničení (nezadrženo), 15 konec exekuce. Pro ochranu před přerušeními existuje příkaz "trap", který má formát:

Zachyťte signály "seznamu příkazů".

Pokud se v systému vyskytnou přerušení, jejichž signály jsou uvedeny oddělené mezerou v „signálech“, provede se „seznam příkazů“, po kterém (pokud nebyl v seznamu příkazů proveden příkaz „exit“) bude řízení vraťte se do bodu přerušení a provádění příkazového souboru bude pokračovat. Pokud je například před přerušením provádění příkazového souboru nutné smazat soubory v „/tmp“, lze to provést příkazem „trap“:

Trap "rm /tmp/* ; exit 1" 1 2 15

který předchází ostatním příkazům v souboru. Zde se po smazání souborů příkazový soubor ukončí.




Horní