sziasztok,
bashben szeretnem az alabbi stringbol kinyerni az infokat es atvenni oket mint valtozo:
"alma=foo&korte=bar&lolka=bolka&..."
=>
alma=foo
korte=bar
lolka=bolka
persze a string allhat 1000 ilyenbol is, ez csak pelda. remelem ertheto voltam. :)
barmi segitseget elore is koszonok!
- 1181 megtekintés
Hozzászólások
Miben?
--
the tide is turning
- A hozzászóláshoz be kell jelentkezni
alma, korte, lolka minidg szerepel a stringben? Mindig ilyen sorrendben ?
Vagy inkabb egy assocatiativ tombot szeretnel ?
- A hozzászóláshoz be kell jelentkezni
$ echo $a
alma=foo&korte=bar&lolka=bolka
$ eval `echo "$a" | sed -e 's/&/;/g'`
$ set | tail -4
a='alma=foo&korte=bar&lolka=bolka'
alma=foo
korte=bar
lolka=bolka
Az és jel cseréjét pontosvesszőre amúgy megoldhatod tr-rel is, de asszem itt a sebességigény nem kritikus. De ha jó egy *csak* bash-ban működő megoldás is, akkor még tovább egyszerűsítheted a helyettesítést:
$ eval `echo "${a//&/;}"`
- A hozzászóláshoz be kell jelentkezni
szerintem azt szeretné, ha névvel hivatkozhatna az almára mint változóra és annak az értéke lenne foo. Mondjuk tehát echo $alma esetén kidobná, hogy foo.
Szerintem itten inkább egy tömböt/hash-t kellene csinálni a változókból és értékeikből, hogy lehessen hivatkozni mondjuk úgy ahogy a PHP-ben $params['alma'] viszaadná a foo-t. Nem nagyon vagyok otthon bash tömbökben, de valami olyasmire gondoltam, hogy ${params['alma']}-val lehetne megkapni a foo-t.
Persze lehet, hogy tényleg csak annyi kellett, hogy szétválassza a paramétereket, de akkor meg awk bőven elég.
- A hozzászóláshoz be kell jelentkezni
El is olvastad amire válaszoltál? Ugyanis a fent leírt eval sor pontosan azt csinálja, hogy az eredetileg meglevő változó mellé létrehozta azokat, amik az eredetiben benne voltak. Tehát $alma ezek után foo -t fog visszaadni - pont ahogy kérte (és te magad is írtad).
Tömbváltozó elleni érv: bash-ban ugyan nem, de jó pár egyéb shell-ben a tömbindex 1023 -ig mehet.
Asszociatív tömb-öt meg nem kezelnék shellben (tudtommal bash nem is tud: "Arrays are indexed using integers and are zero-based." - a man bash-ból)
(Kieg:)
"A szétválasztáshoz meg az awk is elég" - szerintem a sed-nek és a tr-nek sokkal kisebb az erőforrásigénye, mint az awk-nak, ráadásul ha nem eval-lal csinálod, akkor az eredeti shellben egykönnyen nem éred el a szétválasztott változókat.
- A hozzászóláshoz be kell jelentkezni
igazad van, de meg kell mondjam, hogy a legutolsó sorodat figyelmen kívül hagytam, azt gondolván, hogy az az aláírásod. :)
okés nagyon hülye vagyok, :)
- A hozzászóláshoz be kell jelentkezni
>> Mondjuk tehát echo $alma esetén kidobná, hogy foo.
és nem azt csinálja?
- A hozzászóláshoz be kell jelentkezni
és láss csodát, valóban :)
a="alma=foo&korte=pii" ; eval `echo "${a//&/;}"` ; echo -e $korte"\n"$alma
pii
foo
- A hozzászóláshoz be kell jelentkezni
ez mennyiben szemléletesebb, mint a fenti set|tail? :)
- A hozzászóláshoz be kell jelentkezni
a='alma=foo&korte=bar;rm -rf /&lolka=bolka'
Hmmmm, a körte értéke az kéne hogy legyen, hogy bar pontosvessző err emm szóköz mínusz err eff szóköz per. NE próbáld ki, hogy a szkript valóban helyesen adja-e értékül ezt a korte nevű változónak.
Az eval iszonyatosan veszélyes, mmmkay? :)
- A hozzászóláshoz be kell jelentkezni
Ezt ugye nem nekem mondtad? En *tudom*, viszont a feltett kerdesre ez a valasz. De a korrektseghez persze ez a kiegeszites is hozzatartozik, igazad van.
Hozzatennem, h akinek a webszervere barmi mashoz hozzafer, mint amihez feltetlenul szukseges, ott barmi elofordulhat.
- A hozzászóláshoz be kell jelentkezni
koszi szepen! basszus tudtam, hogy bash tud ilyet, de az istennek nem jutott eszembe az eval...
- A hozzászóláshoz be kell jelentkezni
Hint: CGI-s progi, shell-ben megírva -- javaslom helyette a Perl-lel való ismerkedést, a CGI.pm modul pont erre (is) való. Azzal a "foo=bar%3brm%20-rf%20baz&moo=goo" is helyesen kerül kiértékelésre.
- A hozzászóláshoz be kell jelentkezni