přejít na obsah přejít na navigaci

Linux E X P R E S, Bash 21: Práce s textovými řetězci

Bash 21: Práce s textovými řetězci

Minule jsme si udělali přehled o zajímavé oblasti zvané rozšiřování neboli expanze. Jedním z typů expanzí bylo rozšíření parametrů a proměnných. To mimo jiné umožňuje práci s textovými řetězci přímo na úrovni Bashe. Této problematice se dnes budeme věnovat podrobněji.


Expanze parametrů a proměnných

Základním principem je nahradit jména parametrů (tímto termínem zde budeme označovat proměnné a poziční i speciální parametry) jejich hodnotou. Bash to udělá vždy, když před jméno parametru uvedeme znak dolar, např. $PATH, $1. Jak jsme si ale ukázali už dříve, je vhodné jména parametrů balit do složených závorek, aby nedošlo k jejich splynutí s okolním textem. Třeba místo echo $cestabin/skript se jistě hodí spíše echo ${cesta}bin/skript.

Vedle prostého nahrazení jména parametru jeho hodnotou má však Bash v rukávu (či spíše ve složených závorkách) ještě tyto užitečné funkce:

${parametr:-slovo} - za normálních okolností vypíše prostě hodnotu parametru (proměnné), ale pokud je tento prázdný, vypíše místo toho slovo (řetězec) uvedený za dvojtečkou a pomlčkou. Např. můžeme zadat echo "Desktop: "${DESKTOP:-žádný} a Bash vypíše jméno pracovní plochy uživatele nebo slovo "žádný", pokud uživatel pracuje mimo grafiku.

${parametr:=slovo} - funguje velmi podobně jako varianta s mínusem, takže také vypíše hodnotu parametru a, pokud je tento nulový (nenastavený), zobrazí místo něj zadaný řetězec (slovo). Přitom ale zároveň změní hodnotu parametru tak, že do něj dané slovo vloží.

${parametr:?slovo} - další obdoba první varianty s tím, že slovo se vypíše v případě nulové hodnoty parametru, ne však jako běžný, nýbrž chybový výstup. Pokud to nastane v neinteraktivním shellu (např. při provádění skriptu), bude shell (i skript) ukončen.

${parametr:+slovo} - a do čtvrtice zde máme opak mínusu. Pokud je parametr nulový nebo nenastavený, nic se nestane. Pokud však nějakou hodnotu obsahuje, zobrazí se slovo.

${parametr:offset} - velké překvapení mne čekalo, když jsem za jméno proměnné zadal dvojtečku a nějaké malé číslo. Bash v takovém případě uřízne zadaný počet znaků ze začátku vypisovaného řetězce. Např. echo ${SHELL} vypíše /bin/bash, zatímco echo ${SHELL:5} jen bash, protože prvních 5 znaků ubral.

${parametr:offset:delka} - pokud vám nestačí řezat pouze od začátku, můžete přidat další dvojtečku a za ni počet znaků, které chcete od offsetem zadaného místa zobrazit (nikoli uřezat zezadu). echo ${SHELL:5:2} potom ukáže jen "ba", tedy šestý a sedmý znak hodnoty $SHELL.



${!prefix*} - zobrazí seznam jmen proměnných, která začínají na zadaný prefix. Chceme-li zjistit, jak egocentrický je Bash, pomůže nám v tom echo ${!BASH*}, vypisuje všechny proměnné se jménem začínajícím slovem BASH. Stejnou funkci plní ${!prefix@}.

${!jmeno[*]} - vypíše seznam položek pole (viz 5. díl seriálu). Zdůrazňuji seznam jmen položek, nikoli hodnot (to by udělalo echo ${jmeno[*]}). Jména položek (tj. označení v hranaté závorce) nemusí nabývat jen číselných hodnot, takže můžeme mít třeba pole pc[lin]=10, pc[bsd]=3, pc[win]=0.

${#parametr} - udává délku parametru ve znacích, takže echo ${#SHELL} nám dá 9. ${#*} a ${#@} ale zobrazí počet pozičních parametrů. Obdobně ${#jmeno[*]} udává počet položek zadaného pole (echo ${#pc[*]} z předchozího bodu by vrátilo 3).

${parametr#slovo} a ${parametr##slovo} - slouží k uřezávání začátku hodnoty parametru, ne však podle délky (jako u offsetu), ale přímo zadaným řetězcem. Tento řetězec může navíc obsahovat zástupné znaky (*, ? apod.) Jedna mřížka značí co nejkratší řezání, dvě mřížky naopak co nejdelší. Kupř. echo ${PATH#*:} uřízne všechno od počátku řetězce až po první dvojtečku (včetně). Naopak echo ${PATH##*:} vezme vše až po poslední výskyt dvojtečky v seznamu cest.

${parametr%slovo} a ${parametr%%slovo} - obdoba předchozího, ale řeže se od konce. Abychom si to ukázali opět prakticky, použijeme speciální parametr $0, což by měla být cesta k aktuálnímu shellu (např. /bin/bash). echo ${0%b*} ukáže /bin/, protože celé slovo bash smazalo. Varianta echo ${0%%b*} vypíše jen /, protože smazala vše od prvního výskytu b.

${parametr/vyraz/retezec} - a to nejlepší nakonec. Bash umí v řetězcích nahrazovat určený výraz zadaným řetězcem. Řekněme, že chceme při zobrazení zvýraznit všechny výskyty bin v proměnné PATH velkými písmeny. Pak zadáme echo ${PATH/bin/BIN}. Chyba? Že se vám zvýraznil jen první výskyt? Máte pravdu. Pro náhradu všech musíme první lomítko zdvojit (echo ${PATH//bin/BIN}). Vyraz přitom nemusí být jen text, ale může obsahovat zástupné znaky (*,?,[] apod.)

A to je k expanzi proměnných asi tak všechno. Je to mocná zbraň. Může vám ušetřit mnoho volání externích aplikací typu cut, sed nebo awk. A mocnější je ještě více, když si uvědomíme, že za výrazy a slova nemusíme dosazovat jen konkrétní řetězce, ale proměnné (např. echo ${PATH:$odstup:$delka}). Příště nám čeká mimo jiné počítání, tak si raději za domácí úkol zopakujte malou násobilku.

Nahoru

Odkazy

Příspěvky

Re: Bash, 21. díl
8. 04. 2007, 17:46:21
Odpovědět  Odkaz 
Ako sa dá v skripte zadať, aby sa pred vykonaním príkazu zobrazil dialog, ktorý si vyžiada rootovské heslo? (Potom by sa ten prikaz mal už spustiť s root-právamy.)
Vlastimil Ott Re: Bash, 21. díl
Vlastimil Ott 8. 04. 2007, 20:08:02
Odpovědět  Odkaz 
To je snadné:

1) v KDE použijte kdesu
2) v GNOME zenity

Oba programy mají bohaté možnosti nastavení - pomocí parametru --help se je dozvíte.
Re: Bash, 21. díl
8. 04. 2007, 22:33:42
Odpovědět  Odkaz 
Diky, funguje to.
Re: Bash, 21. díl
23. 04. 2007, 14:37:33
Odpovědět  Odkaz 
Paráda. Netušil jsem co všechno bash umí. Díky.
Re: Bash, 21. díl
27. 04. 2007, 09:21:50
Odpovědět  Odkaz 
Dá sa nejako zariadit aby sa tam to rootovske heslo
ani nemuselo stále znova písat ?

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz

Bohdan Milar

(*1976) vystudoval Vysokou školu ekonomickou v Praze. Pracuje v obecně prospěšné společnosti Brailcom. Unixové systémy používá od roku 1997. Má rád Bash, FreeMiNT a LaTeX.




Public Relations

Každý den se do práce těším, říká Viktor ze Siemens Advanta

Viktor ŽaludViktor Žalud je hardwarový vývojář a v Siemens Advanta se zaměřuje na vývoj zařízení pro průmyslovou automatizaci. „Každé zařízení musím navrhnout, nechat vyrobit, otestovat jeho funkcionalitu a zajistit, aby splňovalo všechny předpisy a normy,“ popisuje svou práci. „Práce mě baví i proto, že každý půlrok vymýšlím řešení pro jiný výrobek a všechny jsou unikátní,“ vysvětluje.

Pokračování ...



Public Relations

On-line konference VMworld 2021: stovky přednášek a tutoriálů zdarma

VMworld 2021Základem úspěchu každého byznysu je v dnešní době schopnost inovovat a přizpůsobovat se požadavkům trhu, a to rychle. Dle výzkumu Forrester 88 % zástupců firem potvrzuje, že spokojenost zákazníků je přímo závislá na zlepšování a inovacích jejich aplikací.

Pokračování ...


Redakční blog

Pavel Fric

Pavel Fric, 10. April

Zapojte se do tvorby distribuce Mageia

Podílejte se na vytváření balíčků pro Mageiu, dělejte, co je potřeba, staňte se baličem


Pavel Fric

Pavel Fric, 13. March

Lollypop

Lollypop je hudební přehrávač navržený, jak ukazuje jeho podoba, aby výborně zapadl do pracovního...


Pavel Fric

Pavel Fric, 26. February

QElectroTech

Kreslení elektrotechnických i jiných výkresů


Všechny blogy »


Public Relations

Jak si vybrat spolehlivé online kasino?

CasinoVýběr poctivé herny je otázka, která se týká nejen začínajících hráčů, ale i hráčů se zkušenostmi. Poctivé casino je skutečnou šancí nejen si užít proces, ale také vyhrát. Online zábavní portál je specializovaná služba, která uživatelům umožňuje hrát o peníze. Online herní průmysl se neustále vyvíjí a online kasina úspěšně konkurují kamenným provozovnám.

Pokračování ...