Proměnné shellu, "dědění" hodnot - 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

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

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

Seriály

Více seriálů



Software

Proměnné shellu, "dědění" hodnot

16. května 2002, 00.00 | Ještě chvilku si budeme hrát s příkladem, ve kterém vypisujeme seznam argumentů příkazové řádky, a ukážeme si na jeho základě další důležitý rys práce s proměnnými: jak je to s jejich inicializací?

Ještě chvilku si budeme hrát s příkladem, ve kterém vypisujeme seznam argumentů příkazové řádky, a ukážeme si na jeho základě další důležitý rys práce s proměnnými: jak je to s jejich inicializací?

Neznámé proměnné jsou prázdné...

Neznámé proměnné mají pro shell hodnotu "" (resp. 0, pokud je použijeme v aritmetických výrazech), takže bychom se v podstatně mohli obejít bez inicializace proměnné i na nulu:

 247 /tmp> cat qqq
 #!/bin/zsh
 # opsat vsechny argumenty na std.vystup
 echo $((i)): $0
 for ii in $*; echo $((++i)): $ii
 248 /tmp> ./qqq jedna dve tri ctyry
 0: ./qqq
 1: jedna
 2: dve
 3: tri
 4: ctyry
 249 /tmp> 

(Mimochodem, pročpak jsme nechali kolem i v příkazu echo $((i)): $0 dvojité závorky? Kdo to ví, odpoví; kdo to neví, dočte se to příště!)

Za normálních okolností má skript "vlastní" sadu proměnných, takže i ve skriptu nemá nic společného s kdekoli jinde, a vše funguje jak má:

 249 /tmp> i=5      
 250 /tmp> ./qqq    
 0: ./qqq
 251 /tmp> i=100
 252 /tmp> ./qqq
 0: ./qqq
 253 /tmp> echo $i
 100
 254 /tmp> 

...ale ne vždy!

Obsah proměnných se ale může dědit, jestliže si to volající shell (nebo skript) vyžádá příkazem export:

 255 /tmp> export i=100
 256 /tmp> ./qqq jedna dve tri ctyry                                         
 100: ./qqq
 101: jedna
 102: dve
 103: tri
 104: ctyry
 257 /tmp>

Proto je vhodné vždy obsah proměnných inicializovat — samozřejmě vyjma případů, kdy v exportované proměnné úmyslně předáváme nějaké informace do skriptu.

Naopak to samozřejmě nejde!

I když použijeme příkaz export, hodnoty odpovídajících proměnných se jen předají dovnitř skriptu; samy proměnné volajícího shellu (nebo skriptu) zůstanou beze změny:

 257 /tmp> echo $i
 100
 258 /tmp> 

Nejšikovnější způsob, jak uložit nějakou hodnotu, vygenerovanou skriptem, je zapsat ji na standardní výstup, a použít obrácené apostrofy:

 #!/bin/zsh
 # soucet vsech argumentu skriptu
 s=0
 for i in $*; let s+=$i
 echo $s

Takový skript můžeme pohodlně používat jak přímo

 303 /tmp> ./sum 1 2 3 4 5
 15
 304 /tmp>

tak i pro dosazování do proměnných a pro další výpočty:

 304 /tmp> soucet=`./sum 2 4 6 8`
 305 /tmp> echo $soucet
 20
 306 /tmp> echo prumer: $((soucet/4))
 prumer: 5
 307 /tmp> 

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: