On Friday, November 26, 2010 17:20:21 C.M. Burns wrote:
Vorweg die Ausgangslage. Ich habe eine LIste als Textfile vorliegen im Format
name-1 hans name-2 theo produkt-1 auto attribut-3 schoen ...
Jede Zeile kann also unterschiedlich beginnen und das File kann quasi beliebig lang sein.
Ich möchte in einem Bash Skript nun dieses File so einlesen, dass die Variablennamen sich an Spalte eins aus dem Textfile orientieren. Um bei diesem Beispiel zu bleiben sähen die Variablen also wie folgt aus:
name-1="hans" name-2="theo" produkt-1="auto" attribut-3="schoen"
Ferner möchte ich darüber dann ein case statement laufen lassen der Form: case $INHALT in $name-1|$name-2|$produkt-1|$attribut-3) ...
Hat jemand eine Idee wie man das elegant in Bash lösen kann?
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 -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net -- 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