Skripty a proměnné: aritmetika - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Odkud pochází fotografka Anne Erhard?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

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):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: