Torsten Förtsch schrieb:
Du hast zwar geschrieben, es handle sich um eine Bash, aber nicht, um welche Version. Eine ausreichend aktuelle vorausgesetzt, kann auch die Bash assoziative Arrays:
Speichern wir erstmal Deine Ausgangslage in einer Variablen, so brauche ich keine zusätzliche Datei:
$ IN='name-1 hans'$'\n''name-2 theo'$'\n''produkt-1 auto'$'\n''attribut-3 schoen' $ cat <<<"$IN" name-1 hans name-2 theo produkt-1 auto attribut-3 schoen
Nun lesen wir das in ein assoziatives Array ein:
$ declare -A hash $ while read k v; do hash["$k"]="$v"; done <<<"$IN"
Ein Test, ob name-1 gesetzt ist:
$ echo "${hash[name-1]}" hans
Die Anzahl der Elemente im Array:
$ echo "${#hash[@]}" 4
Die Liste der Schlüssel (Indices):
$ echo "${!hash[@]}" name-2 name-1 attribut-3 produkt-1
Nun Dein case Statement:
$ INH=theo $ case "$INH" in "${hash[name-1]}") echo name-1;; "${hash[name-2]}") echo name-2;; *) echo neither name-1 nor name-2;; esac name-2
Und nochmal mit einem unbekannten Wert:
$ INH=thecs $ case "$INH" in "${hash[name-1]}") echo name-1;; "${hash[name-2]}") echo name-2;; *) echo neither name-1 nor name-2;; esac neither name-1 nor name-2
Ist die Bash zu alt, könntest Du richtige Variablen statt eines Arrays benutzen, die Du mit eval setzt, ungefähr so:
while read k v; do eval "$k"=\'"$v"\'; done
Das funktioniert aber nur, wenn Deine Namen gültige Bash-Variablennamen sind. Deine fallen alle durch, da sie ein Minus enthalten.
Alternativ müsstest Du die Datei halt mehrfach lesen. Dann könntest Du auch grep z.B. zum Filtern einsetzen. Außerdem ist eine named Pipe hilfreich, damit Du nicht aus einer anonymen Pipe lesen musst.
Sowas hier "grep <<<"$IN" ^name-2 | read k v" würde nämlich nicht funktionieren, da der read-Befehl in einer Subshell ausgeführt wird und demzufolge auch die Variablen dort setzt.
$ mkfifo ~/FIFO $ grep <<<"$IN" ^name-1 >~/FIFO & [1] 20528 $ read k v <~/FIFO $ echo $k name-1 [1]+ Done grep ^name-1 <<< "$IN" > ~/FIFO $ echo $v hans
Also, Du kannst in der Bash möglicherweise Dein Problem lösen. Trotzdem würde ich es nur machen, wenn ich relativ gut kontrollieren kann, dass in der Input-Datei nur gutartige Daten stehen.
Torsten Förtsch
Ah, das assoziative Array war genau das was ich gesucht habe, ich hatte das testweise mal mit cat file|while read varname varvalue;do declare $varname=$varvalue; done; versucht. Das funktioniert soweit auch, aber dann hatte ich ja das Problem, dass mir ohne Hilfskonstrukt nicht bekannt war, welche Variablennamen existieren. Danke an die hilfsbereiten Leute, insbesondere Torsten! Kein Dank an die Realnamen Fetischisten, die ohnehin nicht prüfen können ob das nun der richtige Name ist oder nicht. Ich sollte einfach mal irgendeinen trollfreundlichen "Klaus Gerber" oder "Hans Höckel" eintragen damit hier Ruhe herrscht. Stefan -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org