Expanze neboli rozšiřování
Tato označení mohou vyvolat mylnou představu o pravé podstatě funkcí, které se pod nimi skrývají. Nejde ani o snahu Bashe množit se a expandovat svévolně do našeho nebo i cizích počítačových systémů. Nejde ani o rozšíření o zásuvné moduly (tzv. plug-ins).
Expanze v podání Bashe znamená soubor operací, které provede s obsahem příkazové řádky zadané uživatelem před tím, než začne vykonávat příkazy z ní vyplývající. Může jít např. o nahrazení zápisu /home/bohdan/*txt seznamem všech souborů v mém adresáři, jejichž jméno končí na txt. No a protože taková náhrada vede nejčastěji ke zvětšení zadaného zápisu (v našem případě dokonce z jednoho slova na několik), říká se jí expanze (česky rozšíření). Bash rozeznává sedm druhů rozšíření:
Rozšíření složených závorek (Brace Expansion)
Pokud si vzpomenete na hranaté závorky (viz 15. díl), tak ty složené fungují podobně. Pomocí hranatých jsme v řetězci na určitém místě mohli zadat více variant pro určitý znak, takže /home/m[ai]rek znamená /home/mirek /home/marek. Složené závorky nabízejí možnost na určitém místě zadat více variant celé skupiny znaků.
Například výsledkem příkazu echo {ba,tc,z,a}sh budou jména čtyř příkazových interpretrů: bash tcsh zsh ash. Tento mechanismus se často hodí při práci s adresáři, kde nám třeba zápis /usr/X11R6/lib/X11/x{dm,edit,init,kb,server} ušetří hodně psaní.
Vlnovková rozšíření (Tilde Expansion)
Je vcelku známá věc, že místo vlnovky (~) doplňuje Bash cestu k domácímu adresáři právě přihlášeného uživatele, tedy totéž co proměnná $HOME. V mém případě tak ~/bin znamená /home/milarb/bin. Již méně se ví o konstrukcích s plus (~+) a mínus (~-). První z nich představuje aktuální pracovní cestu ($PWD), druhá pak předchozí pracovní cestu ($OLDPWD).
Rozšíření parametrů a proměnných (Parameter Expansion)
Zřejmě nejzajímavější oblast rozšíření. Dovoluje mimo jiné v řetězcích nahrazovat, vypisovat podřetězce apod. Toto téma si zaslouží vlastní díl a my mu věnujeme hned ten následující.
Nahrazení příkazů (Command Substitution)
Toto je také velmi užitečný nástroj. Umožňuje nám do příkazového řádku vložit řetězec, který je výsledkem provedení nějakého příkazu. Toho lze využít v případech, kdy potřebujeme výstup jednoho příkazu použít v rámci příkazu jiného, ale z nějakého důvodu to není možné provést přesměrováním či rourou.
Typickým příkladem je situace, kdy potřebujete vědět, ze kterého RPM balíčku pochází určitý spustitelný soubor, např. ls. Nejprve musíme zjistit, kde binárka ls leží (which ls) a výsledek (/bin/ls) použít v dotazu rpm -qf /bin/ls. Pomocí nahrazení příkazů si však můžeme práci zjednodušit zápisem rpm -qf $(which ls). Lze se setkat i se starším zápisem s pomocí obrácených apostrofů - rpm -qf `which ls`. Malý tip - místo $(cat soubor) je lepší použít $(< soubor).
Aritmetická rozšíření (Arithmetic Expansion)
Ano, Bash umí počítat. Standardně zvládá sice jen celá čísla, ale to pro většinu případů postačuje. Komu ne, může si Bash buď překompilovat s podporou desetinné čárky nebo využít externích nástrojů (bc, awk apod.). Podobně jako v případě expanze proměnných i toto je téma na samostatný díl. Proto jen jednoduchý důkaz: echo $((1 + 1)).
Dělení na slova (Word Splitting)
Ve 14. díle jsme si představili proměnnou IFS, která uchovává tzv. oddělovače (většinou mezery, tabulátory apod.), s jejichž pomocí se dělí text na jednotlivá slova. Přesně to provádí Bash po dokončení rozšíření. Zkuste si třeba IFS=":" ; echo $(< /etc/passwd).
Rozšíření cest (Pathname Expansion)
Klasické doplňování jmen souborů, kde otazník (?) nahrazuje právě jeden znak a hvězdička (*) libovolný nezáporný (tj. i nulový) počet znaků. Nahrazuje se i tečka, takže * znamená všechny soubory v daném adresáři, kdežto *.* pouze takové, které ve jméně mají alespoň jednu tečku. Ve jménech souborů lze použít i výčet znaků v hranatých závorkách (viz 15. díl).