Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Expanze závorek

Expanze závorek (anglicky brace expansion) je první fází expanzního mechanismu. V základu z výrazu ve složených závorkách vytvoří seznam slov.

> echo {a,b,c}
a b c

Před závorkami i za nimi může být text, který se přidá ke každému vzniklému slovu jako předpona a přípona.

> echo soubor{1,2,3}.txt
soubor1.txt soubor2.txt soubor3.txt
> echo /var/{log,cache,tmp}
/var/log /var/cache /var/tmp

Uvnitř závorek nesmí být neuvozené mezery, jinak shell výraz nechá tak, jak je. Prázdná položka je povolená:

> echo soubor{,.bak}
soubor soubor.bak

Výraz cp soubor{,.bak} se expanduje na cp soubor soubor.bak.

Rozsahy

Druhou formou je rozsah {od..do}, který funguje pro čísla i písmena.

> echo {1..5}
1 2 3 4 5
> echo {a..e}
a b c d e
> echo {5..1}
5 4 3 2 1

Čísla lze doplnit nulami zleva, stačí nulu napsat do meze. Toho využijeme například při generování jmen souborů pevné šířky.

> echo {01..05}
01 02 03 04 05
> echo foo{0001..0003}.txt
foo0001.txt foo0002.txt foo0003.txt

Volitelný třetí člen udává krok.

> echo {0..20..5}
0 5 10 15 20

Vnořování a kombinace

Závorky lze vnořovat a psát za sebe; výsledkem je kombinace všech možností.

> echo {a,b}{1,2}
a1 a2 b1 b2
> echo {zaloha,archiv}-{2023,2024}.tar.gz
zaloha-2023.tar.gz zaloha-2024.tar.gz archiv-2023.tar.gz archiv-2024.tar.gz
> mkdir -p projekt/{src,doc,test/{unit,integration}}

Expanze závorek nebere v úvahu souborový systém

Toto je hlavní rozdíl proti expanzi jmen souborů. Expanze závorek je čistě textová operace, která proběhne bez ohledu na to, jestli vzniklá jména existují. Proto můžeme pomocí závorek soubory vytvářet, kdežto pomocí * můžeme pouze odkazovat na soubory, které už existují.

> touch {a,b,c}.txt      # vytvori tri soubory
> echo *.txt
a.txt b.txt c.txt
> touch *.txt            # NEvytvori nic noveho, jen zaktualizuje casy

Protože je expanze závorek první v pořadí, její výsledek prochází všemi následujícími fázemi. Následující řádek tedy nejdříve vytvoří dva vzory a teprve potom se každý z nich pokusí expandovat na jména souborů.

> echo *.{txt,md}
a.txt b.txt c.txt poznamky.md

Naopak proměnná uvnitř závorek nefunguje tak, jak by se mohlo zdát: expanze proměnných probíhá až po expanzi závorek, takže rozsah se nestihne vytvořit.

> N=5
> echo {1..${N}}
{1..5}

Chceme-li rozsah s proměnnou mezí, musíme použít seq nebo céčkový for (viz Cykly).

for (( i=1; i <= N; i++ ))
do
    echo ${i}
done