Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Informace
Další triky kolem polí...
13. června 2002, 00.00 | Dnes budeme pokračovat v ukázkách co všechno se dá v zsh dělat s poli.
Dnes budeme pokračovat v ukázkách co všechno se dá v zsh dělat s poli.Získání všech prvků
V zsh máme dvě speciální hodnoty pro "všechny indexy": "*" a "@". Jejich chování se liší v případě, že je získání hodnoty proměnné uzavřeno do uvozovek: "*" prostě vrátí všechny hodnoty (a ty tak zůstanou v uvozovkách jako jeden dlouhý řetězec); "@" však "zauvozovkuje" každou hodnotu samostatně.
Protože příkaz echo uvozovky nevypisuje, použijeme starý známý skript pro zobrazení všech argumentů — ten samozřejmě a b c zobrazí jako tři argumenty na samostatných řádcích, zatímco "a b c" jako jediný argument na jediném řádku:
438 /tmp> ./listargs a b c
1: a
2: b
3: c
439 /tmp> ./listargs "a b c"
1: a b c
440 /tmp> ./listargs "$x[*]"
1: a dvojka c f
441 /tmp> ./listargs "$x[@]"
1: a
2: dvojka
3: c
4: f
442 /tmp>
Stringy jsou pole znaků nebo slov!
Tedy, ve skutečnosti tomu tak samozřejmě není, ale zsh tak s nimi dokáže pracovat. Standardně je textový řetězec v operacích s indexy interpretován jako pole znaků:
443 /tmp> x='Ahojky!'
444 /tmp> echo $x[1,4]
Ahoj
445 /tmp> x[-3,-2]="da"
446 /tmp> echo $x
Ahojda!
447 /tmp>
pomocí přepínače "w", zapsaného před (kterýmkoli) indexem, si můžeme vyžádat indexování po slovech:
479 /tmp> x="Matous Marek Lukas Jan"
480 /tmp> echo $x[2]
a
481 /tmp> echo $x[(w)2]
Marek
482 /tmp> x[(w)-1,(w)-2]=a
483 /tmp> echo $x
Matous Marek Lukas a Jan
484 /tmp>
Indexování obsahem
Shell zsh nám dokonce umožňuje pomocí dalších přepínačů indexovat přímo obsahem. Přepínač i najde index první položky v poli, která odpovídá zadanému vzorci:
484 /tmp> x=(Rosenkrantz Guildenstern Polonius)
485 /tmp> echo $x[(i)*ste*]
2
486 /tmp>
a pokud nás zajímá přímo nalezená hodnota, můžeme přímo použít přepínač r:
486 /tmp> echo $x[(r)*ste*]
Guildenstern
487 /tmp>
Obě přepínače (i i r) lze použít i jako velká písmena; pak se vyhledá poslední výskyt v poli:
487 /tmp> echo $x[(r)*o*] ... $x[(R)*o*]
Rosenkrantz ... Polonius
488 /tmp>
Počet prvků a další přepínače...
Samotný počet prvků pole získáme pomocí znaku "#", vloženého před jméno proměnné:
496 /tmp> x=($x and Hamlet)
497 /tmp> echo $x
Rosenkrantz Guildenstern Polonius and Hamlet
498 /tmp> echo $#x
5
499 /tmp>
Před jméno můžeme zapsat i řadu dalších přepínačů; ty už jsou ale representovány písmeny, a proto musíme použít komplexní zápis se závorkami. Přepínače "o" a "O" například prvky pole setřídí abecedně; navíc můžeme použít přepínač "i", který znamená "třídit nezávisle na velikosti písmen":
499 /tmp> echo ${(o)x}
Guildenstern Hamlet Polonius Rosenkrantz and
500 /tmp> echo ${(oi)x}
and Guildenstern Hamlet Polonius Rosenkrantz
501 /tmp> echo ${(O)x}
and Rosenkrantz Polonius Hamlet Guildenstern
502 /tmp>
Přepínač j, který má řetězcový parametr uzavřený mezi dvojtečky, vytvoří z pole textový řetězec tak, že jeho prvky spojí svým parametrem:
505 /tmp> echo ${(j:, and :)x}
Rosenkrantz, and Guildenstern, and Polonius, and and, and Hamlet
506 /tmp>
Velmi šikovný přepínač je také f, který rozdělí obsah pole podle řádků; k němu se však znovu vrátíme až později, až se budeme zabývat prací se soubory.
Shell toho umí ještě mnohem více...
...my však se pro začátek spokojíme s málem, a další přepínače a argumenty si ukazovat nebudeme (zájemce je všechny nalezne v dokumentaci na www.zsh.org).
Proměnných se však ještě chvíli musíme držet: příště se seznámíme se standardními proměnnými, které spravuje sám shell (jednu z nich už vlastně dávno známe: PATH není nic jiného, než speciální proměnná shellu).
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová