Kedves Fórumozók!
Adott egy fejtörő, amit képtelen vagyok megoldani, pedig biztos, hogy pofon egyszerű.
Adott a következő parancs:
> test=`ps -ef`
Ezt követően megpróbálom kiiratni a változó tartalmát:
> echo $test
A parancs kimenete meg is jelenik, de ömlesztve (enterek nélkül), ami nekem nem túl szerencsés, mivel több dolgot ki kéne szűrnöm a kimenetből. Van valakinek ötlet arra nézve, hogy hogyan lehetne ugyan azt a kimentet kapni az echo hatására, mint ha simán adnám ki a parancsot. Ha a tabok nem is kerülnek vissza, de a sortörések ugyan úgy legyenek.Próbáltam már echo -e, próbáltam a \n-eket cserélni mindenre, de nem jártam sikerrel.
Fontos megemlítenem, hogy a ps -ef csak egy példa volt, ettől lényegesen erőforrás igényesebb feladatot végeztetek el, aminek a kimenetét több szempont szerint kell feldolgoznom. Tehát csak egyszer lehet futtatni. Továbbá a fájlba irkálást is szeretném elkerülni, mert IO kímélően kéne megoldni, mivel a művelet sokszor, sok példányba fut majd.
A segítséget előre is köszönöm!
Üdv:
NoMan
- 2460 megtekintés
Hozzászólások
szerk.: csakugyan, az echo -e a jobb megoldás
ha tobb sort kell kiiratnod, akkor pl:
cat << __ENDOFDATA
$test
__ENDOFDATA
-szobi.
- A hozzászóláshoz be kell jelentkezni
ha nem túl bonyolult a cucc végső megoldásként változó helyett, használj egy temp fájlt.
- A hozzászóláshoz be kell jelentkezni
Majdnem jó helyen jártál, csak lemaradt az idézőjel:
echo -e "$test"
- A hozzászóláshoz be kell jelentkezni
És ez a tökéletes megoldás... Bár mentségemre szóljon nem látom, hogy ezt hol írják
Köszönöm szépen.
- A hozzászóláshoz be kell jelentkezni
majdnem, csak az -e nem kell bele:
$ touch a\\nb
$ echo "`ls a*b`"
a\nb
$ echo -e "`ls a*b`"
a
b
- A hozzászóláshoz be kell jelentkezni
A szőrözés nagymestere vagy (mert ps-nél nem fordul elő \n a kiírásban), de igazad van :-)
- A hozzászóláshoz be kell jelentkezni
Szívesen. Ha jól tippelek ott a különbség, hogy ha nem használsz idézőjeleket, akkor csak az első sorvégéig eszi meg a parancs, a többit meg mintha a copy-paste odahányta volna pluszban.
Idézőjelekkel meg egyben tartod a feldolgozandó blokkot.
- A hozzászóláshoz be kell jelentkezni
Ennyire nem misztikus.
Azt kell mindig szem előtt tartani, hogy parancsvégrehajtáskor előbb megtörténik a feloldás (pl., mint itt, változófeloldás) és szavakra tördelés az IFS változó alapján, aztán a kívül lévő idézőjelek levágása, végül maga a parancsvégrehajtás.
Vagyis az echo $test (a test eredetileg többsoros adatot tartalmaz!), mivel az IFS alapértelmezett értéke miatt a test soremelései szóközre változnak, lényegében azt jelenti, hogy
echo elso sor masodik sor harmadik sor
mindez EGY sorban!
Az idézőjelek megmentik a test változó tartalmát a szavakra tördelés mellékhatásaitól, vagyis
echo "$test " esetén
echo 'elso sor
masodik sor
harmadik sor'
fog végrehajtódni.
- A hozzászóláshoz be kell jelentkezni