Když si potřebujete uložit někam hodnotu, je tu ideální konstrukt proměnná. Jen je tu několik specialit, na které je dobré si dát pozor.
Typ proměnné
bash nemá typy proměnných, proměnné plníte, pracujete s nimi a všichni včetně interpretu doufají, že se nebudete snažit s řetězcem násobit atp. Když na tom budete trvat, pak můžete typ proměnné nadefinovat nebo omezit pomocí příkazu declare nebo typeset. Ale většina lidstva prožije plnohodnotný život bez těchto příkazů.
Jak se bude jmenovat
Jméno proměnné obsahuje ideálně písmena (pouze anglická, pochopitelně, nenapadla vás jiná, že ne), číslice a podtržítka. Jméno by nemělo začínat číslem. Environment proměnné jsou psané velkými písmeny, uživatelské dle chuti.
Environment proměnné
V originále environment variables, v češtině někdy jako proměnné prostředí, jsou proměnné, které už vám někdo vyplnil. Pro každý proces nabývají svých hodnot, například proměnná PWD ukládá hodnotu aktuálního pracovního adresáře, její hodnota se mění po příkazu cd a ačkoli je několik lidí přihlášených k systému, každý má svou proměnnou pro každou svou session.
Seznam a aktuální hodnoty environment proměnných vytiskne příkaz env (zde zkrácený výpis)
Výpis jsem zkrátila o několik nezajímavých proměnných, s kterými pracovat nebudeme. Povšimněte si, že proměnné jsou všechny psány velkými písmeny.
Proměnná, kterou naplním/změním, je přístupná jenom v rámci jednoho bash procesu – pouze v tom terminálu, který mám spuštěný nebo jenom v rámci běhu jednoho skriptu. Pokud ji chci dostat do podřízených procesů, je potřeba ji exportovat příkazem export. Příklad může být
export a=42
naplní proměnnou a hodnout 42 a exportuje ji. Když si teď vytisknete enviromenální proměnné env, najdete v nich řádek a=42.
Parametry skriptu
Když spustíte skript, jeho jméno se uloží jako proměnná $0. Cokoli napíšu jako parametr skriptu, uloží se jako proměnná $1, $2, atd. Je to jeden z velmi dobrých způsobů, jak předat skriptu nějakou informaci.
K takto uloženým parametrům můžete přistupovat až do proměnné $9. Pro hromadné zpracování se hodí příkaz shift, který z proměnné $1 udělá $0, z proměnné $2 udělá $1, atd.
Jak naplnit svou proměnnou
Operátorem = naplníte proměnnou. V případě, že pracujete s řetězcem, nezapomeňte ošetřit operátorové znaky.
V tomto příklad jsme naplnili proměnnou a hodnotou 42 (jestli je to číslo nebo řetězec je na tom, jak s ní budete zacházet), dále jsme naplnili proměnnou nalada hodnotou vyborna, proměnnou pocasi řetězcem oblacno, misty dest a proměnnou obed řetězcem houby s octem.
Volání proměnné
Hodnotu proměnné mohu volat tak, že před její název dám operátor $
echo $a
b=$a
Tisk proměnné pomocí příkazu echo nebo printf jste už mohli vidět, v druhém řádku příkladu uvádím, že proměnná b nechť je naplněna hodnotou proměnné a.
Načtení proměnné
Může se stát, že potřebujete naplnit proměnnou ze vstupu. Na to se hodí příkaz read
jana@perun:~$ read a
ahoj
jana@perun:~$ echo $a
ahoj
jana@perun:~$
Na druhém řádku je standardní vstup, do kterého jsem napsala "ahoj" a enter. Tím se naplnila proměnná a.
Příkaz read má mnoho užití, umí načítat proudy, soubory, má spoustu zajímavých parametrů a pro klidný večer doporučuji přečíst jeho manuálovou stránku, přinejmenším help read prolétněte zrakem.
Práce s řetězci
Nejprve si naplním dva řetězce, ať mám na čem ukazovat příklady:
Úpravy proměnné budou v následujících příkazech vesměs takové, že uvedete operátor dolaru a do složených závorek specifikujete jakou proměnnou chcete jako zpracovat. Pro délku řetězce je to znak mřížky.
Jediná zrada by mohla nastat, kdybyste chtěli řetězce proložit znaky jako zpětné lomítko nebo dolar, ale ty musíte tak jako tak ošetřit a nic to nemění na principu spojování řetězců.
Zkrácení řetězce $(retezec:o_kolik)
Práce s řetězci je poměrně snadná pokud ze všech shellů používáte zrovna bash. Zde příklady na zkrácení o kolik ze začátku a o kolik od kolikátého znaku.
Pokud toužíte po ještě komplikovanějších výměnách, doporučuji studium regulárních výrazů a příkazu sed.
Počítání
Už bylo řečeno, že si nemusíte dělat hlavu s typy a počítat. To vám umožní rovnou několik příkazů.
Příkaz let
Pro takové drobné počítání ideální příkaz. Jen si dejte pozor, chce jen jeden argument, viz. příklad:
jana@drak:~$ x=5
jana@drak:~$ let y=$x+3
jana@drak:~$ echo $y
8
jana@drak:~$ let y = $x + 13
bash: let: =: syntax error: operand expected (error token is "=")
jana@drak:~$ let "y= $x + 13"
jana@drak:~$ echo $y
18
Umí
sčítat +, odčítat -, násobit \*, celočíselně dělit / a modulo, tedy zbytek po dělení %
inkrementovat o jedničku let i++ nebo o něco jiného let i+=2 (inkrementovala jsem o 2)
dekrementovat o jedničku let i-- nebo o něco jiného let i/=2 (vydělila jsem dvěmi)
Násobení se provádí znakem hvězdička, který má ovšem operátorový význam a ten je mu potřeba vymluvit. Hvězdička uzavřená do uvozovek či ošetřená zpětným lomítkem funguje správně.
Aritmetická expanze
Pokud vám příkaz let nevyhovoval ze syntaktických důvodů, že požaduje pouze jeden parametr, u aritmetické expanze si stěžovat nebudete.
Jednoduchou inkrementaci s aritmetickou expanzí zvládnete také:
jana@drak:~$ x=5 ; ((x++)) ; echo $x
6
Stejně jako u příkazu let nepotřebujete znak dolaru, protože do proměnné rovnou zapisujete.
Příkaz expr
Syntakticky krutý, ale funkčně výborný příkaz expr umožňuje aritmetiku, porovnávání, logické výrazy i práci s řetězci. Stačí, když si zapamatujete: narozdíl od let mu všechny parametry oddělte mezerami, nepoužívejte uvozovky a ošetřete hvězdičku, aby uměla násobit.
Třeba, že existují pole a jak se s nimi pracuje, spoustu triků v práci s řetězci, které bash umí úplně skvěle. Nebo, že jde počítat i v aritmetice s plovoucí čárkou. Na tomto místě se ve skriptech obvykle píše: Tuto látku ponechávám na laskavém čtenáři k dostudování. Až to bude potřebovat.