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

Uvozování

Uvozování lze shellu říct, že určitou část řádku má brát doslova a neprovádět na ní některé expanze. Po provedení všech expanzí shell uvozovací znaky odstraní — to je poslední fáze, odstranění uvozovek. Odstraní se pouze ty uvozovky, které jsme napsali ve skriptu, nikoliv ty, které vznikly expanzí.

Uvozovacích prostředků je několik a liší se tím, co potlačí.

Zpětné lomítko

Zpětné lomítko potlačí zvláštní význam následujícího znaku.

> echo Cena je 100 $
Cena je 100 $
> echo Cena je 100 \$\{X\}
Cena je 100 ${X}
> touch muj\ soubor.txt

Zpětné lomítko na konci řádku ruší znak nového řádku, což umožňuje rozdělit dlouhý příkaz na více řádků.

grep -r 'vzor' \
     --include='*.txt' \
     /var/log

Apostrofy

Apostrofy potlačí všechny expanze i zvláštní význam všech znaků. Uvnitř apostrofů nelze zapsat apostrof — ani pomocí zpětného lomítka.

> echo '${HOME} a $(date) a *.txt'
${HOME} a $(date) a *.txt

Potřebujeme-li v takovém řetězci apostrof, musíme uvozování přerušit:

> echo 'nelze to'\''udelat jinak'
nelze to'udelat jinak

Uvozovky

Uvozovky potlačí expanzi závorek, vlnovky, dělení slov a expanzi jmen souborů, ale ponechají expanzi parametrů, aritmetickou expanzi a substituci příkazů. Právě proto je to nejčastěji používaná forma.

> echo "domov je ${HOME}, dnes je $(date +%A), soubory: *.txt"
domov je /home/petr, dnes je Wednesday, soubory: *.txt

Uvnitř uvozovek si zvláštní význam zachovávají znaky $, ` a \; ostatní znaky, včetně * a mezery, jsou brány doslova. Zpětné lomítko uvnitř uvozovek funguje pouze před těmito znaky a před uvozovkou:

> echo "cena je \${X}"
cena je ${X}
> echo "zpetne lomitko: \d"
zpetne lomitko: \d

Zápis $'…'

Zápis $'…' se chová jako apostrofy, ale navíc interpretuje sekvence se zpětným lomítkem podobně jako v jazyce C.

sekvenceznak
\nnový řádek
\ttabulátor
\rnávrat vozíku
\\zpětné lomítko
\'apostrof
\nnnznak s osmičkovým kódem nnn
\xHHznak se šestnáctkovým kódem HH
\uHHHHznak Unicode
> echo $'prvni\ndruhy'
prvni
druhy
> IFS=$'\n'

Tuto konstrukci jsme použili v kapitole Cykly při nastavování IFS; jde tedy o běžný zápis, nikoliv o kuriozitu. Expanze proměnných uvnitř $'…' neprobíhá.

Shrnutí

co potlačíme\znak'…'"…"$'…'
expanze závorekanoanoanoano
expanze vlnovkyanoanoanoano
expanze parametrůanoanoneano
aritmetická expanzeanoanoneano
substituce příkazůanoanoneano
dělení slovanoanoanoano
expanze jmen souborůanoanoanoano
interpretace \n, \t—neneano

Praktické pravidlo pro psaní skriptů: expanze proměnných a příkazů píšeme v uvozovkách, pokud výslovně nechceme dělení slov nebo expanzi jmen souborů. Řetězce, ve kterých nemá nic expandovat, píšeme do apostrofů.

# spravne
cp "${zdroj}" "${cil}"
grep -r 'chybova hlaska' "${adresar}"

# spatne: rozpadne se na jmenech s mezerami
cp ${zdroj} ${cil}