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

◄ 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 ►