Skriptování v Bournově shellu/Expanze proměnných

Z Wikiknih
Skočit na navigaci Skočit na vyhledávání
◄ Skriptování v Bournově shellu/Prostředí Expanze proměnných Skriptování v Bournově shellu/Řízení běhu ►

V kapitole věnované prostředí jsme zmínili proměnné prostředí jako způsob uchování malých objemů dat. V této kapitole se podíváme podrobně na jejich využívání, na „nahrazení hodnotou“, „substituci parametrů“ a „expanzi proměnných“.

Nahrazení hodnotou[editovat]

Nahrazení hodnotou je nejběžnější variantou použití proměnné. Spočívá v tom, že shell před provedením příkazu nahradí všechny odkazy na proměnnou hodnotou proměnné a výsledný příkaz provede. Nejjednodušší způsob odkázání na proměnnou jsme si už převedli, jedná se o připojení znaku „$“ na začátek jména proměnné. Ukázat si to můžeme na následujícím příkladu, kde je v druhém příkaze nejdříve nahrazeno „$uzivatel“ hodnotou „PepaZDepa“ a výsledek pustí shell jako příkaz.

$ UZIVATEL=PepaZDepa
$ echo $uzivatel
PepaZDepa

Už tato základní podoba nahrazování umožňuje různé triky, například spojování řetězců. Řekněme, že chceme nastavit do proměnné „LOGDIR“ cestu k logovacím souborům na adresář „log“ v domovském adresáři. Využijeme toho, že cesta k domovskému adresáři je v proměnné „$HOME" a nastavíme

$ LOGDIR=$HOME/log

Způsoby nahrazování[editovat]

Bourne shell nabízí několik způsobů, jak nahradit proměnnou hodnotou. Jednotlivé případy si nyní rozebereme.

Jednoduché nahrazení[editovat]

Jednoduché nahrazení jsme si vlastně už předvedli několikrát. Ale ještě jsme si o něm neřekli vše. Zkusme následující příklad:

$ ZVIRE=slon
$ echo Jeden $ZVIRE, dva $ZVIREi
Jeden slon, dva

Kde bychom mohli čekat výpis „Jeden slon, dva sloni“. Ovšem ve skutečnosti „Jeden slon, dva“. V čem je problém? Je to způsobeno tím, že malé písmenko „i“ patří mezi znaky, které mohou být součástí jména proměnné, a tak shell zkusil nahradit proměnnou $ZVIREi, která ovšem není definovaná, tedy výsledkem nahrazení byl prázdný řetězec. To je rozdíl oproti dříve použitému lomítku, které jsme mohli k proměnné přilepit a nahrazování dále fungovalo.

Řešením je použít složené závorky pro ohraničení jména proměnné:

$ ZVIRE=slon
$ echo Jeden $ZVIRE, dva ${ZVIRE}i
Jeden slon, dva sloni

Takto to už bude fungovat.

Nahrazení s přednastavenou hodnotou[editovat]

Protože při programování často dochází k tomu, že uživatel nějaký parametr nenastaví, tedy se použije nějaká přednastavená hodnota, nabízí syntaxe shellu pohodlný způsob, jak v případě nedefinované proměnné použít záložní přednastavenou hodnotu. Slouží k tomu již známé složené závorky a spojovník. Přesněji řečeno má syntaxe podobu:

${jméno[:]-hodnota}

kde umístění dvojtečky do hranatých závorek znamená, že dvojtečka je v zápise nepovinná.

Ukážeme si použití na příkladu:

$ NASTAVENA=Ahoj
$ echo $NASTAVENA ${NENASTAVENA:-lidi}
Ahoj lidi

Když příklad pozměníme:

$ NASTAVENA=Ahoj
$ NENASTAVENA=Pepo
$ echo $NASTAVENA ${NENASTAVENA:-lidi}
Ahoj Pepo

přednastavená hodnota nebude použita.

Nahrazení s přednastaveným dosazením[editovat]

Další variantou nahrazení je syntaxe, která u nedefinované hodnoty kromě vypsání přednastavené hodnoty rovnou tuto hodnotu dosadí do proměnné. Má podobu:

${jmeno[:]=hodnota}

Například

$ echo Hodnota: $PROMENNA
Hodnota:
$ echo Hodnota: ${PROMENNA:=48}
Hodnota: 48
$ echo Hodnota: $PROMENNA
Hodnota: 48

Nahrazení s novou hodnotou[editovat]

Jedná se svým způsobem o protiklad nahrazení s přednastavenou hodnotou. Pokud je proměnná definována, použije se pro výstup nová dodaná hodnota, pokud proměnná definována není, je výstup prázdný. Syntaxe je:

${jmeno[:]+hodnota}

Například:

$ echo Hodnota: ${NEDEFINOVANA:+novahodnota}
Hodnota: 
$ NEDEFINOVANA=starahodnota
$ echo Hodnota: ${NEDEFINOVANA:+novahodnota}
Hodnota: nova hodnota

Tento způsob se dá využít pro jednoduché ověření, zda je proměnná nastavena (nezajímá nás, jak).

Nahrazení s kontrolou hodnoty[editovat]

Poslední způsob nahrazení je vlastně takovou ladicí kontrolou, která ověřuje, zda je proměnná nastavena. Syntaxe je

${jmeno[:]?zprava}

a funguje tak, že pokud proměnná není definována, je vypsána zadaná hláška a program je ukončen (s nenulovou návratovou hodnotou).

◄ Skriptování v Bournově shellu/Prostředí Expanze proměnných Skriptování v Bournově shellu/Řízení běhu ►