Zástupné a speciální znaky

Pokud byste měli soubor s názvem nejaky text.txt, chtěli ho zobrazit pomocí programu less a zapsali následující příkaz, došlo by k něčemu neočekávanému:

  less nejaky text.txt
  nejaky: není souborem ani adresářem
  text.txt: není souborem ani adresářem

Problém je ve speciálním znaku, kterým je v tomto případě mezera. Mezera slouží jako oddělovač parametrů, takže program less interpretoval příslušný soubor jako dva soubory, z nichž ani jeden neexistuje, a less tedy ohlásil chybu.

Mezi speciální znaky patří kromě mezery křížek # (označuje komentář), zástupné znaky (hvězdička *, otazník ?, hranaté závorky [], tilda ~), vykřičník ! (negátor výrazu, ale pouze uvnitř hranatých závorek, jinak má úplně jinou funkci), zpětné lomítko \ (neutralizuje zvláštní význam jednoho bezprostředně následujícího speciálního znaku), uvozovky a ' (neutralizují speciální znaky v textu mezi uvozovkami), středník ; (odděluje více příkazů na jednom řádku), lomítko / (oddělovač prvků cesty), špičaté {} (složené) závorky (oddělují blok příkazů a jsou prostředkem expanze), kulaté závorky () (oddělují skupinu příkazů), většítko > a menšítko < (přesměrování výstupu a vstupu), roura |, paragraf & (spustí příkaz na pozadí, znak dolaru $ (uvozuje proměnnou) a některé další.

Zpět k situaci výše. V tomto případě máte dvě možnosti. Buď neutralizujete význam speciálního znaku (mezery) pomocí zpětného lomítka, nebo jméno souboru uzavřete do uvozovek. Obojí bude fungovat:

  less nejaky\ text.txt
  less "nejaky text.txt"

Pokud byste měli v názvu souboru samotné uvozovky, mohli byste jejich vliv neutralizovat buď pomocí zpětného lomítka, nebo pomocí druhých uvozovek, takto:

 less 'soubor s "textem".txt'
 less soubor\ s\ \"textem\".txt

Pokud bychom měli soubor se zpětným lomítkem v názvu, zapsali bychom dvě zpětná lomítka za sebou, což by Bash interpretoval jako jedno normální zpětné lomítko bez speciálního významu.

Zástupné znaky

Pokud chcete nějakému příkazu předat více než jeden soubor, můžete použít zástupné znaky, abyste je všechny nemuseli explicitně specifikovat. Řekněme, že chcete prolistovat všechny soubory začínající na ukol a končící na txt. V tom případě můžete použít speciální znak v podobě hvězdičky, která zastupuje libovolný počet znaků. Výsledný příkaz tedy bude vypadat takto:

  less ukol*txt

Dalším zástupným znakem je otazník, který zastupuje právě jeden libovolný znak. Pokud tedy chcete prolistovat všechny soubory, které začínají jedním libovolným znakem a pokračují _ukol.txt, proveďte následující příkaz:

  less ?_ukol.txt

Pomocí hranatých závorek můžete specifikovat, které znaky se smí na daném místě použít. Následující příkaz tedy zobrazí soubory a_ukol.txt a b_ukol.txt, pokud existují:

  ls [ab]_ukol.txt

Můžete samozřejmě specifikovat i rozsahy znaků a dokonce daný výraz negovat. Zkusíme tedy zobrazit všechny soubory začínající jedním velkým písmenem nebo jedním číslem:

  ls [A-Z0-9]*

Nyní zobrazíme všechny soubory, které nezačínají číslem:

  ls [!0-9]*

Měli bychom si ještě ozřejmit jednu důležitou věc. Pokud použijete jakýkoliv speciální znak jako parametr nějakého příkazu, Bash interpretuje jeho význam a příkazu předá výsledek. Ujasněme si to na příkladu. Mějme adresář s následujícími soubory:

  abc_ukol.txt
  a_ukol.txt
  b_ukol.txt
  c_ukol.txt
  5_ukol.txt

Nyní chcete zobrazit obsah všech souborů začínající na a, takže použijete příkaz:

  ls a*

Bash nejprve vyřeší speciální znaky ve výrazu a programu ls předá výsledek. Program ls tedy obdrží seznam souborů v aktuálním adresáři, které začínají na a. Je to úplně stejné, jako kdybyste zapsali:

  ls abc_ukol.txt a_ukol.txt

Speciální znaky a jejich význam si můžete otestovat pomocí „ozvěny“ v podobě programu echo. Ten vypíše na obrazovku všechno, co mu předáte jako parametry. Takže pokud byste v tomto adresáři zapsali:

  echo a*

Pak byste obdrželi:

  abc_ukol.txt a_ukol.txt

Program echo má ještě jeden zajímavý parametr, a tím je -n. Použití tohoto parametru způsobí, že echo neukončí výpis znakem konce řádku. To se vám bude hodit zejména v shellových skriptech.

Jiným zajímavým zástupným znakem je tilda ~, která supluje cestu k vašemu domovskému adresáři. Pokud se nacházíte někde úplně mimo, můžete se do svého domovského adresáře snadno navrátit příkazem:

  cd ~

Dlužno dodat, že návrat do domovského adresáře lze provést ještě jednodušeji:

  cd

Bash si pamatuje, kde jste byli naposled a není problém se vrátit do předchozího adresáře:

  cd -

Tím bychom mohli probírání zástupných znaků ukončit.

Kam dál

pokrocili/komandlajna/specialni_znaky.txt · Poslední úprava: 2009/11/11 09:32 autor: Michal Dočekal
CC Attribution-Share Alike 3.0
www.chimeric.de Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 PDF Export