stringbol adat kinyeres

Fórumok

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!

Hozzászólások

alma, korte, lolka minidg szerepel a stringben? Mindig ilyen sorrendben ?
Vagy inkabb egy assocatiativ tombot szeretnel ?


$ 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//&/;}"`

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.

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='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? :)

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.