PředchozíNahoruDalšíObsah

17. Žolíkové znaky

Žolíkové znaky jsou obecně silnou stránkou shellu bash. Jsou to vlastně vzory, podle kterých se porovnávají např. názvy souborů. Při jejich tvorbě se používají operátory *, ? a výrazy v hranatých závorkách [ ]. Příklad výrazu z žolíkovými znaky:

xconsole$ ls /bin/*sh
/bin/ash /bin/bash /bin/bsh /bin/csh /bin/sh /bin/tcsh

Tento program vlastně vypsal všechny shelly dostupné v mém systému, které mám v adresáři /bin. Nejjednodušší zástupné znaky jsou ? a *. Otazník reprezentuje pouze jediný jakýkoliv znak, hvězdička jich reprezentuje libovolné množství (i žádný). Je dobré si uvědomit, že pokud chceme vypsat všechny soubory z adresáře, nemusí se používat *.* jako v dosu, ale protože UNIX je nezávislý na příponách, stačí pouze hvězdička jedna (ls *).

Toto je však dostupné i v dosu. UNIX jde ovšem dál, mnohem dál.

Řekněme například, že chceme vypsat všechny shelly v systému, ale pouze ty, které začínají na a a b. Je to velmi jednoduché:

xconsole$ ls /bin/[a,b]*sh
/bin/ash /bin/bash /bin/bsh

Nebo například shelly, které mají jakýkoliv název, kromě těch, co začínají na c:

xconsole$ ls /bin/[^c]*sh /bin/sh
/bin/ash /bin/bash /bin/bsh /bin/sh /bin/tcsh

Do hranatých závorek se píšou znaky, které můžou být použity při expanzi tohoto výrazu. Pokud se však dá před ten konkrétní znak stříška (^), bere se to jako negace, čili tento znak se v řetězci vyskytnout nesmí. V adresáři by se však mohl vyskytnout soubor, který bude začínat na velké C. Tento soubor by ale vypsán byl. Jak tomu zabránit? Takto:

xconsole$ touch /bin/Csh
xconsole$ ls /bin/[^c^C]*sh /bin/sh
/bin/ash /bin/bash /bin/bsh /bin/sh /bin/tcsh

Nebo například chceme v adresáři všem souborům, které začínají na malé písmeno a jsou v adresáři /usr/bin odebrat právo pro zápis. Pro tento úkol můžeme použít následující skript:

#!/bin/bash

for i in /usr/bin/[a..z]*
do
  chmod -w i
done

Toto byl úvod do tajemství žolíkových znaků. Nakonec bych ještě upozornil na tzv. regulární výrazy, které ovšem jsou žolíkovým znakům pouze podobné. Regulární výrazy se používají většinou v textových editorech na různé složité operace s texty, v programech jako awk, Perl, Tk. Ale také programy, které jdou využít i při našem skriptování v bash, a to programy grep a egrep. Slouží k vyhledávání řetězců v souborech. Více o těchto programech viz manuálové stránky nebo systém nápovědy info. Například chceme-li vypsat všechny programy jazyka C obsahující funkci main, použijeme tento zápis:

xconsole§ grep -l 'int.*main*(' *.c

Program (e)grep používá pro zápis skutečné regulární výrazy, o kterých se můžete dozvědět buď v manuálových stránkách či někde jinde na internetu.

PředchozíNahoruDalšíObsah

17. dubna 2001 18:20