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 | editovat zdroj]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 | editovat zdroj]Bourne shell nabízí několik způsobů, jak nahradit proměnnou hodnotou. Jednotlivé případy si nyní rozebereme.
Jednoduché nahrazení
[editovat | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 ► |