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
Skripty a proměnné: aritmetika
9. května 2002, 00.00 | Základny práce s proměnnými jsou krajně jednoduché, a už je vlastně z minulých dílů našeho miniseriálu známe. Existuje ovšem předlouhá řada dalších fint a triků, které práci s proměnnými v shellu usnadňují; alespoň několik těch nejšikovnějších a nejdůležitějších si ukážeme.
Základny práce s proměnnými jsou krajně jednoduché, a už je vlastně z minulých dílů našeho miniseriálu známe: obyčejné "=" pro přiřazení hodnoty do proměnné
214 /tmp> xx=foobar
215 /tmp>
a "$" pro získání jejího obsahu
215 /tmp> echo $xx
foobar
216 /tmp>
Existuje ovšem předlouhá řada dalších fint a triků, které práci s proměnnými v shellu usnadňují; alespoň několik těch nejšikovnějších a nejdůležitějších si ukážeme.
Beztypové proměnné
Proměnné shellu jsou beztypové: shell neví a "nezajímá ho", zda proměnná obsahuje číslo nebo třeba textový řetězec. Velmi často je to šikovné a uspoří to spoustu práce, ovšem za tu cenu, že naopak při provádění operací musíme shellu dát na vědomí, jakou operaci přesně chceme.
Zkusme třeba doplnit skript z minulého dílu o počítání argumentů. Chceme-li do příkazu for umístit více příkazů než jeden, prostě je uzavřeme mezi speciální příkazy do a done. Náš první pokus by pak mohl nejspíš vypadat asi nějak takhle:
#!/bin/zsh
# opsat vsechny argumenty na std.vystup
i=0
echo $i: $0
for ii in $*; do
i=$i+1
echo $i: $ii
done
(mezery a tabelátory na začátku řádku se ignorují, takže můžeme skripty formátovat pro pohodlné čtení). Jenže, ouha: skript v takovémhle případě bude interpretovat proměnnou i jako kdyby obsahovala text, a dosadí do ní tedy textový řetězec "<původní obsah i>+1" — asi takhle:
221 /tmp> ./qqq jedna dve tri ctyry
0: ./qqq
0+1: jedna
0+1+1: dve
0+1+1+1: tri
0+1+1+1+1: ctyry
222 /tmp>
Příkaz let
€ešením je speciální příkaz let, který provede svůj argument, ovšem interpretuje přitom hodnoty a proměnné jako čísla:
#!/bin/zsh
# opsat vsechny argumenty na std.vystup
i=0
echo $i: $0
for ii in $*; do
let i=$i+1
echo $i: $ii
done
Tentokrát je výsledek v naprostém pořádku:
223 /tmp> ./qqq jedna dve tri ctyry
0: ./qqq
1: jedna
2: dve
3: tri
4: ctyry
224 /tmp>
V //zsh můžeme alternativně použít dvojité závorky; v některých případech (tento mezi ně nepatří!) může použití dvojitých závorek místo příkazu let usnadnit jak čitelnost skriptu, tak i jeho zápis (protože závorky uzavírají celý aritmetický výraz, takže shell ví, kde začíná i končí, a my nemusíme používat např. uvozovky). Všechny tři následující zápisy jsou tedy ekvivalentní:
let i=$i+1
i=$((i+1))
((i=$i+1))
Mimochodem, zsh rozumí většině standardních operátorů, včetně autoinkrementace a autodekrementace (++, --); chceme-li, můžeme díky tomu skript zkrátit na pouhé dva řádky — zde se nám zápis aritmetických výrazů do dvojitých závorek naopak skvěle hodí:
#!/bin/zsh
# opsat vsechny argumenty na std.vystup
echo $((i=0)): $0
for ii in $*; echo $((++i)): $ii
Příště...
...si něco řekneme o inicializaci proměnných.
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á