/bin/sh: problem s expanziou premennej

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Květen 4 12:01:32 CEST 2000


On Thu, 4 May 2000, Jozef Hitzinger wrote:

> Zdravim .. mam v skripte for slucku, ktora ma bezat cez niekolko ciest s 
> wildcardom, tak aby sa * rozexpandovala az v tele cyklu, aha takto:
...
> Babrem sa s tym uz pol dna a jedine co som objavil je toto:
> 
>   for i in 'a' 'b' 'c'; do { echo " $i"; } done  dava  a\n b\n c\n
>   hello="'a' 'b' 'c'"; echo $hello               dava  'a' 'b' 'c'
>   for i in $hello; do { echo " $i"; } done       dava  'a'\n 'b'\n 'c'\n

BTW: { } jsou zbytecne
...
> Da sa to urobit bez sed-u? Kde robim chybu ked si myslim ze prvy a treti
> riadok maju dat to iste? Dik ..

Nejprve odpoved na druhou otazku: chybu delate v tom, ze predpokladate, ze
kdyz je nekde napsano $hello, tak se to chova, jako kdyby tam byl doslova
opsany obsah te promenne, ale ono je to tak, ze shell provadi interpretaci
v nekolika fazich, pricemz to, co je vysledkem urcite faze se uz do
predchozich fazi nevraci (a zrovna ten quoting, tj. interpretace ', " a
\, se provadi uplne na zacatku).

Odpoved na druhou otazku: ano, lze to udelat bez sedu. Dokonce je zadouci
to udelat jinak, protoze kdyby bylo hello="'*'" a existoval soubor jmenem
'a' (s apostrofy), tak by se to ve for expandovalo, coz nechcete (tedy
bash 1 to nedela, ale v starem bashi je obecne dost chyb). Dobre reseni je
pomoci poli, ale to je bashismus. Taky lze udelat nasledujici

	set 'a' 'b' 'c' '*'
	for i in "$@"; do echo $i; done

($@ je vlastne takove pole, ktere zna i obycejny shell.)

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux