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
editovatNahrazení 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í
editovatBourne shell nabízí několik způsobů, jak nahradit proměnnou hodnotou. Jednotlivé případy si nyní rozebereme.
Jednoduché nahrazení
editovatJednoduché 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
editovatProtož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
editovatDalší 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
editovatJedná 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
editovatPoslední 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 ► |