staging.inyokaproject.org

Bash Var einlesen

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

fireworker72

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Hallo freunde

Ich hab eine Datei mit folgendem Inhalt (Auszug)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    <GroupAddress Name="Temperatur erweiterungsmodul" Address="0/2/9" DPTs="DPST-9-1" />
      <GroupAddress Name="Licht tv schalten" Address="0/2/10" DPTs="DPT-1" />
      <GroupAddress Name="Licht tv dimmen" Address="0/2/11" DPTs="DPST-3-7" />
      <GroupAddress Name="Licht zimmer schalten" Address="0/2/12" DPTs="DPT-1" />
      <GroupAddress Name="Licht zimmer dimmen" Address="0/2/13" DPTs="DPST-3-7" />
      <GroupAddress Name="Geräte ein aus" Address="0/2/14" DPTs="DPT-1" />
      <GroupAddress Name="Temperatur 3fach Tür Küche" Address="0/2/15" DPTs="DPST-9-1" />
      <GroupAddress Name="Szene Badezimmer aktiv RM" Address="0/2/16" DPTs="DPT-1" />
      <GroupAddress Name="Licht Spiegel Schalten" Address="0/2/17" DPTs="DPT-1" />
      <GroupAddress Name="STellgrösse heizen" Address="0/2/18" />

Ich möchte diese jetzt einlesen so das z.B.:

die Variable 0/2/9 den Wert 9.001 hat oder 0/2/12 den Wert 1.000 oder 0/2/13 den Wert 3.007

Irgendwie weiß ich da jetzt nicht wie ich es angehen soll

Bitte daher um eure Hilfe

LG

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Um XML in der Bash zu verarbeiten gibt es Tools wie xmlstarlet.

Variablennamen in der Bash dürfen nicht mit einer Ziffer beginnen und keine Sonderzeichen (wie Pfadtrenner) enthalten - man könnte sowas wie '0/2/9' höchstens als Key in einem Assoziativen Array speichern - und mir ist noch nicht klar, woher die Werte kommen sollen.

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Servus

Die werte kommen aus einem Programm und stehen fix in der Datei (wird einmal Angelegt)

Ich lese in Bash Werte von einem Bus ein z.B. Ga 0/2/12 "wert" und müsste die dann mit dem hinterlegten Wert aus der Var 0/2/12 vergleichen

if [ 0/2/12 = 1.001 ] then irgendwas

if [ 0/2/12 = 3.007 ] then irgendwas anderes

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Hm, den in deinem Beispiel genannten Wert bei 0/2/12 kann ich gar nicht sehen.

Hast Du vielleicht mal ein "echtes" Beispiel der XML?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mir ist immer noch nicht klar, wie der Algorithmus aussieht, der da umgesetzt werden soll.

Tun wir mal so, als ob es eine Named Pipe gäbe, aus der zeilenweise drei mit Whitespace getrennte Werte purzeln, von denen nur die beiden letzten interessant sind:

1
2
3
4
5
6
7
8
9
declare -A ref
ref['0/2/12']='1.001'
ref['0/2/13']='3.007'

while read -r _ name value;
do
    [ "${ref[$name]}" = "$value" ] && echo "value for $name equals reference value $value"
done < /pfad/zur/named_pipe

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Doc_Symbiosis schrieb:

Hm, den in deinem Beispiel genannten Wert bei 0/2/12 kann ich gar nicht sehen.

Hast Du vielleicht mal ein "echtes" Beispiel der XML?

Hier steht er <GroupAddress Name="Licht zimmer schalten" Address="0/2/12" DPTs="DPT-1" />

Ich weiß auch nicht ob das überhaupt ein richtiges xml ist wird halt vom Programm so gespeichert (siehe Anhang)

LG

Anhang

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Also nochmal zur Sicherheit

Ich lese vom KNX Bus Hex Werte ein die Ich in Adresse und Wert aufteile. in der Var $Ga steht (nach dem umwandeln) die Adresse in form x/x/x und in der Var $state stehen die restlichen Hexwerte die da so kommen. (das funktioniert auch schon alles)

auf der anderen Seite hab Ich eine Datei in der definiert ist welchen DPT Wert die eingelesene Gruppenadresse hat. Und je nachdem welcher DPT Wert da steht muss Ich zur Berechnung des Wertes von $state in irgend ein bestimmtes Case springen

LG

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

seahawk1986 schrieb:

Um XML in der Bash zu verarbeiten gibt es Tools wie xmlstarlet.

Variablennamen in der Bash dürfen nicht mit einer Ziffer beginnen und keine Sonderzeichen (wie Pfadtrenner) enthalten - man könnte sowas wie '0/2/9' höchstens als Key in einem Assoziativen Array speichern - und mir ist noch nicht klar, woher die Werte kommen sollen.

Hmmm ich hab aber genau solche werte 0/0/0 in der Var stehen (die Lese Ich vom KNX-Bus ein)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

fireworker72 schrieb:

Hmmm ich hab aber genau solche werte 0/0/0 in der Var stehen (die Lese Ich vom KNX-Bus ein)

Ja, als Wert einer Variable ist das kein Problem (das darf eine beliebige Byte-Abfolge sein), aber man kann das nicht als Variablenname nehmen.

fireworker72 schrieb:

Ich weiß auch nicht ob das überhaupt ein richtiges xml ist wird halt vom Programm so gespeichert (siehe Anhang)

Das ist richtiges XML, aber mir ist immer noch nicht klar, wie das bei der Zuordnung der Werte helfen soll... - an die Werte der Address-Attribute aus der XML-Datei kommt man z.B. so:

xmlstarlet sel -T -t -v '//_:GroupAddress/@Address' -n peter.xml 

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

seahawk1986 schrieb:

Das ist richtiges XML, aber mir ist immer noch nicht klar, wie das bei der Zuordnung der Werte helfen soll... - an die Werte der Address-Attribute aus der XML-Datei kommt man z.B. so:

xmlstarlet sel -T -t -v '//_:GroupAddress/@Address' -n peter.xml 

ankommend vom Bus ist: DPT5.001 8-Bit Unsigned Value” DPT7.001 2-Octet Unsigned Value” DPT8.001 2-Octet Signed Value” DPT8.001 2-Octet Float Value” usw

und je nachdem muss Ich die Werte nach ieeE 754 berechnen

was müsste Ich da hinzufügen um z.B.: die Adresse 0/1/8 abzufragen?

mit

1
xmlstarlet sel -T -t -v '//_:GroupAddress/@Address' -n peter.xml 

wirft er mir nur alle Adressen aus

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Was willst du denn genau an Werten sehen? So gibt er z.b. das komplette XML-Element mit dem Attribut Address='0/1/8' aus:

$ xmlstarlet sel -t -c "//_:GroupAddress[@Address='0/1/8']" -n peter.xml 
<GroupAddress xmlns="http://knx.org/xml/ga-export/01" Name="Wandleuchte" Address="0/1/8"/> 

Und so nur den Namen:

$ xmlstarlet sel -t -v "//_:GroupAddress[@Address='0/1/8']/@Name"   -n peter.xml 
Wandleuchte 

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

seahawk1986 schrieb:

Was willst du denn genau an Werten sehen? So gibt er z.b. das komplette XML-Element mit dem Attribut Address='0/1/8' aus:

$ xmlstarlet sel -t -c "//_:GroupAddress[@Address='0/1/8']" -n peter.xml 
<GroupAddress xmlns="http://knx.org/xml/ga-export/01" Name="Wandleuchte" Address="0/1/8"/> 

Und so nur den Namen:

$ xmlstarlet sel -t -v "//_:GroupAddress[@Address='0/1/8']/@Name"   -n peter.xml 
Wandleuchte 

von <GroupAddress Name="Temperatur erweiterungsmodul" Address="0/2/9" DPTs="DPST-9-1" /> den Wert DPST-9-1 oder noch besser nur 9-1

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Ich habs xmlstarlet sel -t -v "//_:GroupAddress[@Address='0/2/9']/@DPTs" 😉

Danke für eure Hilfe

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mit sinnvoll gewählten Beispielen wäre das erheblich schneller gegangen.. 😉

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Sorry

aber wie hätt ich es darstellen/Beschreiben sollen?

damit es beim nächsten mal besser ist

Antworten |