Forum: PC-Programmierung Bash Kommando an Variabel übergeben und anzeigen


von Rejocktana M. (rejocktana_m)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin neu in der Skrip-Programmierung in Linux(Raspbian). Ich möchte 
die Ausgabe eines Kommandos (cangen) in eine Variabel speichern und 
spätter in meinem Skript verarbeiten.

Mit dem Befehl "cangen" generiere ich anhand eines virtuellen 
CAN-Bus-Interface CAN-Bus Daten. Diese Daten möchte ich immer in einer 
Variabel speichern. Normalerweise bekomme ich solche Daten, wenn ich den 
Befehl ausführe(Anhang):

Befehl: cangen vcan0 -g 4 -I 7E -L 8 -D r -v
Ausgabe:http:
http://www.bilder-upload.eu/show.php?file=0263db-1470922561.jpg

Nun möchte folgender Skript, die Ausgabe des Befehls in einer Variabel 
speichern:

#!/bin/bash

#We have to generate a virtual CAN bus Interface

sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

candata= `cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
echo $candata

Leider bekomme ich keine Ausgabe. ich bekomme nur die Nachricht:

RTNETLINK answers: File exists

Ich habe nicht sehr viel Erfahrung in Python und die Programmierung mit 
Skript in Linux, deswegen wollte ich mal hier fragen, ob jemand mir 
helfen könnte meine Herausforderung zu lösen.

Danke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Rejocktana M. schrieb:
> Leider bekomme ich keine Ausgabe. ich bekomme nur die Nachricht:
>
> RTNETLINK answers: File exists

Dann stelle fest, welcher Befehl im Script den Fehler produziert.

Starte das Script mit

  sh -x script-name.sh

Dann wird Dir jeder einzelne Befehl darin angezeigt. Ich vermute mal, 
dass es einer der beiden "ip up"-Befehle ist, welcher den Fehler 
produziert.

> candata= `cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
> echo $candata

Wenn ich es richtig sehe, erzeugt cangen mehrzeiligen Output?
Dann solltest Du

   echo "$candata"

verwenden, um Zeilenumbrüche und andere Whitespaces 1:1 zu erhalten. 
Sonst klatscht Dir echo einfach alles hintereinander.

: Bearbeitet durch Moderator
von Gerhard (Gast)


Lesenswert?

Übrigens, es heisst "Variable", nicht "Variabel".

von Rejocktana M. (rejocktana_m)


Lesenswert?

Frank M. schrieb:
> Rejocktana M. schrieb:

> Dann stelle fest, welcher Befehl im Script den Fehler produziert.
>
> Starte das Script mit
>
>   sh -x script-name.sh
>
> Dann wird Dir jeder einzelne Befehl darin angezeigt. Ich vermute mal,
> dass es einer der beiden "ip up"-Befehle ist, welcher den Fehler
> produziert.

Du hattest recht, der Befehl: ip link add dev vcan0 type Vcan ist es.
Ich habe mein Raspberry Pi neugestartet und den Scrip neugestartet, dann 
bekam ich beim ersten Aufruf des Scripts keine Meldung. Die Daten werden 
zwar nicht dargestellt aber es ist schon mal ein Vorschritt für mich, 
danke.

Ich vermute, dass dieser Befehl einmal ausgeführt werden muss, um das 
CAN-Interface zu bilden, dann darf man den Befehl nicht mehr ausführen. 
Es sei denn man startet das System neu.

Irgendwie schaft es die Konsole nicht, die Daten auszugeben...

von Norbert (Gast)


Lesenswert?

Rejocktana M. schrieb:
> candata= `cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
> echo $candata

Ohne Leerzeichen!
1
candata=`cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
oder
1
candata=$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)

Dann sollte es auch funktionieren.

von Daniel A. (daniel-a)


Lesenswert?

Norbert schrieb:
> candata=$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)

Ich würde noch Anfürungszeichen dazu tun:
1
candata="$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)"

von Norbert (Gast)


Lesenswert?

Daniel A. schrieb:
> Norbert schrieb:
>> candata=$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)
>
> Ich würde noch Anfürungszeichen dazu tun:
>
>
1
candata="$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)"

Warum?

Oder genauer, warum bei der Zuweisung?
Alle Daten welche 'cangen' auf stdout schreibt, gehen in die variable 
'candata'.

Bei der Nutzung von 'candata' hinterher sind Anführungszeichen 
sicherlich sinnvoll, da können sonst Blanks u.ä. problematisch sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.