|
|
Tento tahák sumarizuje důležité znalosti ze skriptování v shellu Bash. Nezabývá se však základními principy tohoto skriptování a ani se nejedná o úplný výčet možností Bashe. Možná spíše hledáte základní příkazy pro práci v terminálu.
Celková charakteristika jazyka
Bash (jako programovací jazyk) je interpretovaný, neobjektový, imperativní, turingovsky kompletní jazyk s dynamickým slabým typováním proměnných určený především pro administraci a automatizaci *nix operačních systémů. Syntaxe Bashe je dlouhodobě ustálená a jednotlivé verze shellu jsou dobře kompatibilní. Skripty obvykle většinu požadované činnosti vykonávají voláním systémových utilit (umístěné převážně v adresáři /bin) a pracují s textovými řetězci. Samotný Bash obsahuje základní funkcionalitu pro ladění skriptů, které se obvykle vytvářejí v textových editorech jako například Vim, Emacs, gEdit. Podpora syntaxe Bashe je u textových editorů obvyklá. Bash je nainstalován prakticky na každém desktopovém Linuxu a na mnoha dalších *nix systémech.
Základy
| #komentar | komentář |
| #!/bin/bash | označení interpreta skriptu |
| odřádkování | oddělovač |
| “retezec” | řetězec znaků |
| ‘obsah’ | obsah bere jako celek |
| : | nulový příkaz |
| . skript | spustí skript v aktuálním shellu |
| eval | vyhodnocení |
| exec | spuštěný proces nahradí aktuální shell |
| expr | zpracuje argument jako výraz |
| $(obsah) | vyhodnocení obsahu |
| ${promenna:-neco} | parametrická expanze |
| exit 0 | skončí s uvedenou návratovou hodnotou |
| return 0 | ukončení funkce se zadanou návratovou hodnotou |
Podrobnosti o možnostech spouštění příkazů (např. &,“, ; ,|) najdete v Ovládání Bashe. Uvedený příklad parametrické expanze vrátí hodnotu proměnné promenna (pokud je nastavena) nebo neco (pokud promenna není nastavena). Parametrických expanzí existuje více.
Proměnné
| promenna | jméno proměnné |
| $promenna | hodnota proměnné |
| promenna=0 | inicializace proměnné |
| set | založení proměnné |
| unset | zrušení proměnné |
| export | exportování |
| $0, $1, $2 | předané parametry |
| $0 | jméno skriptu |
| $# | počet předaných parametrů |
| $*, $@ | výpis jmen proměnných |
| $? | návratová hodnota posledního příkazu |
| $$ | identifikační číslo procesu (PID) |
| $PS1 | běžný prompt (např. petr@workstation:~$) |
| $PS2 | zadávací prompt (obvykle >) |
| $IFS | oddělovač |
| $RANDOM | náhodná hodnota |
Vstup a výstup
| echo | výpis na standardní výstup |
| read promenna | čtení ze vstupu |
| trap | zachycení signálů |
| printf | podobný funkci printf v jazyce C |
| set -v | vhodné pro debuggování |
| gdialog, dialog | různé funkce pro grafický výstup (záleží na distribuci) |
Podrobnosti o možnostech práce se soubory (např. |, <, <2, <<) najdete opět v Ovládání Bashe. Bash nabízí několik nastavení pro debuggování. Tato nastavení se určují atributem při spouštění shellu nebo pomocí příkazu set (např. zmiňovanné set -v). Speciální debuggery (např. Bashdb) se používají jen zřídka. Příkaz exec (viz tabulka Základy) má i druhý význam související s deskriptory souborů; jde však o prakticky neznámou raritu.
Regulární výrazy
Regulární výrazy označují třídy řetězců s určitou vlastností. Například regulární výraz ^a splňují všechny řetězce začínající podřetězcem “a”. Regulární výrazy usnadňují automatickou manipulaci s řetězci a často je využívají i jiné programovací jazyky (např. PHP) nebo lepší textové editory (např. Vim).
| ^ | začátek řetězce |
| $ | konec řetězce |
| [01] | 0 anebo 1 |
| ., *, ?, {n}, {n,}, {n,m} | různé požadavky na počet opakování |
| [:upper:] | předdefinované možnosti (zde velká písmena) |
Vedle [:upper:] existuje velmi mnoho takto předdefinovaných speciálních množin.
Splňování výroků
| test | vyhodnocení výroku |
| [podminka] | vyhodnocení výroku |
| (()) | vyhodnocení výroku |
| [[]] | vyhodnocení výroku z více podmínek (atomických výroků) |
| ! | negace |
| =, -eq, -ge, -gt | různá porovnání číselných hodnot |
| -f | soubor je soubor |
| -d | soubor je adresář |
| -e | soubor existuje |
| -r | skript má právo ke čtení souboru |
Volba pojmenování relací (např. -le pro neostře menší) vychází ze zkratek anglických označení relací (např. less or equal). Neuváděné aritmetické operátory se značně podobají konvencím z jiných jazyků. Testů vlastností souborů existuje velké množství.
Řídící struktury
Řídící struktury se často ukončují klíčovým slovem “pozpátku” (např. if fi, case esac).
Podmínky (klasické if, case a ternární výraz) :
if podminka
then
prikaz
else
jiny_prikaz
fi
case promenna in
vzor00 | vzor01 | vzor02 ) prikaz;;
vzor10 | vzor11 | vzor12 ) prikaz;;
vzor20 | vzor21 | vzor22 ) prikaz;;
esac
podminka ? prikaz0 : prikaz1
Cykly :
for promenna in hodnota0 hodnota1 hodnota2
do
prikaz
done
while podminka do
prikaz
done
Bash podporuje předčasné ukončení cyklu “příkazem” break;.
Funkce (definice, volání, výstup funkce) :
jmeno_funkce(){
neco
}
jmeno_funkce
(jmeno_funkce)
Štítky: Přehledy
Nemělo by se psát spíš v Bashi?
re 1 : V komentáři k článku Ovládání Bashe mě na to rovněž upozorňovali. Jste si jistý, že se jedná o chybu? Nechce se mi to moc přepisovat; z jiného webu vím, že lidé hledají relativně často ve vyhledávačích tvar “bashy”…
Jestli nehledaji spis totok: http://en.wikipedia.org/wiki/Bashy
v pripade Bourne Again SHellu bych se ale priklanel ke scriptovani v Bashi :-).
Apropo:
“-neq” ? Jak interni bashove porovnani, tak externi “[" a "test" maji pouze -gt, -ge, -eq, -le, -lt a -ne (alespon jsem o tom by do dneska presvedcen :-)).
"[0,1]” je v regexpu “0″, “,” nebo “1″ - melo byt tam byt spise “[01]” pokud ma jit o vycet znaku “0″ a “1″. Ono obecne jsou regexpy dost velka kapitola na to aby byly samostatne, ne jako soucast jineho “tahaku”.
Polozku ‘obsah’ pravdpodobne poskodil mistni redakcni system, hadam ze by tam mely byt spise zpetne apostrofy. Mozna by stalo doplnit tahak o $(obsah) + vysvetleni rozdilu mezi nimi.
ta hrubka bije do očí ![]()
re 4 : Díky za upozrnění. (-neq je špatná práce s více verzemi a ctrl+c ctrl+v, [0,1] překlep)
U ‘obsah’ jsem nemyslel zpětný (grave) apostrof. Ale situaci, kdy běžné apostrofy brání normální činnosti syntaktického parseru. Příklad:
a=0
echo “$a” ‘$a’ $a
echo `$a`
(výsledek :
0 $a 0
command not found
)
Konstrukci $(obsah) jsem zapoměl
Aha, tak to jsem byl mimo. Mne z toho popisu nedoslo ze ma jit o retezec bez expandovani promennych.
Coz nutne nemusi jit o chybu v popisu. Dost casto mam zdroj informaci pouze v anglictine a protoze ji zase tak uplne nevladnu, tak si tomu nekdy priradim nejaky vlastni oznaceni ktery po par letech pouzivani pak beru jako uplne normalni :-).
BashY je urcite spatne. Jednak jsem to nikdy nevidel, ale hlavne by me zajimal jiny priklad slova, kde je v sestem padu koncovka ‘y’.
Bash bez Bashe - muž bez muže? Bashi-muži?
Dobře, změnil jsem formulace a vyhnul se tvaru Bashy/Bashi.
re 8 : Mě by na druhou stranu zajímal příklad slova končícího na písmeno “h”, které při skloňování získává koncovku “i”.
[10] Bash neni puvodni ceske slovo a ta koncovka je ekvivalentem ceskeho “š”, tedy mekke souhlasky. Napriklad anglicke slovo cache se taky nekdy v cestine pise jako “kes” a tam by asi nebylo moc pekne, ze mam data v “kesy” a pochybuju, ze by nekdo byl schopen napsat “v cachy”. Urcite by to stalo na dotaz na ustav pro jazyk cesky. Dost mozna reknou, ze je mozne psat oboji, ale me proste “bashy” trha oci.
#10: Příklad zrovna vymyslet nemůžu, ale řekl bych, že se bude skloňovat podle Stroj: Bash, Bashe, Bashi, Bash, Bashi, Bashi, Bashem ![]()
z jiného webu vím, že lidé hledají relativně často ve vyhledávačích tvar “bashy”…
Linux zblízka využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články
a komentáře
Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN