/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