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