(gelöst) Shell(Bash?)-Fehler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

(gelöst) Shell(Bash?)-Fehler

Beitrag von fischig » 20.04.2020 13:51:52

Code: Alles auswählen

test=$(./btctl-info | grep Connected)
funktioniert,wie ich mit echo $test feststelle.
In diesem cript:

Code: Alles auswählen

#!/bin/sh
mplOpt=leer
test=$(./btctl-info | grep Connected)
if [ "$test" = "Connected: yes" ]; then
  mplOpt="-ao alsa:device=GO2_SOFTVOL"
fi
echo $mplOpt
echo $test
kommt als Ausgabe:

Code: Alles auswählen

leer
Connected: yes
Was ist falsch beim IF?
Zuletzt geändert von fischig am 20.04.2020 18:59:55, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von heisenberg » 20.04.2020 13:53:32

Zeig mal die Ausgabe von btctl-info bei Dir.

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von fischig » 20.04.2020 13:56:54

Moment bitte! (ich dachte es wäre entbehrlich.)

#!/bin/sh zeigt hier auf /bin/dash Schon wieder reingefallen! :evil:

Hier die Ausgabe:

Code: Alles auswählen

[NEW] Controller 00:1A:7D:DA:71:13 BlueZ 5.43 [default]
[NEW] Device 30:C0:1B:72:63:8E JBL GO 2
[JBL GO 2]#   info 30:C0:1B:72:63:8E
Device 30:C0:1B:72:63:8E
	Name: JBL GO 2
	Alias: JBL GO 2
	Class: 0x200414
	Icon: audio-card
	Paired: yes
	Trusted: yes
	Blocked: no
	Connected: yes
	LegacyPairing: no
	UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
	UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
	UUID: Advanced Audio Distribu.. (0000110d-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
	UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
[JBL GO 2]#   exit
[DEL] Controller 00:1A:7D:DA:71:13 BlueZ 5.43 [default]
Ich benötige lediglich die Ausgabe der „Connected“-Zeile in einer Variablen.
bash verhält sich genauso wie dash.

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von whisper » 20.04.2020 14:09:34

In deiner Konstruktion müsstest du auf " Connected: yes"

Code: Alles auswählen

	Connected: yes
testen, denn die tabs? sind ja durch dein erstes Grep mit drin
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von whisper » 20.04.2020 14:14:49

Oder gleich so:

Code: Alles auswählen

test=$(./btctl-info | grep -c '	Connected: yes')
test ist dann 1, wenn String gefunden
Übrigens ist test ein shell built in, ganz schlechte Idee, das als Variable zu nehmen :-)

Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von fischig » 20.04.2020 14:36:52

In deiner Konstruktion müsstest du auf " Connected: yes"
...
testen, denn die tabs? sind ja durch dein erstes Grep mit drin
Ich vermute damit meinst du, dass die Einrückungen in der Ausgabe von btctl-info durch Tabulatoren erzeugt wurden, die dann auch in die Variable test übernommen wurden.
In der echo-Ausgabe von test sieht man das leider nicht.
Ein Leerzeichen zwischen den führenden Anführungszeichen und Connected (so verstehe ich deinen Tipp) bewirkt leider keine Änderung.

Wenn dem so ist: führende Leerzeichen/Tabulatoren stecken noch in test: Wie kann ich die vor dem IF eliminieren?
Übrigens ist test ein shell built in, ganz schlechte Idee, das als Variable zu nehmen :-)
Ich weiß. Und ich finde das war auch eine ganz schlechte Idee von den Shell-Buildern. :wink:

Nichts destotrotz, In der Endfassung kommt dieser Bezeichner auch raus. Aber es ist immer der erste, zu dem ich beim Testen greife, auch wenn mich jedesmal eine stille Wut überkommt, dass ich damit möglicherweise eine überflüssige Fehlerquelle produziere.

Ich werd's mal mit deiner Fassung versuchen. Ist für die Weiterarbeit ziemlich wurscht, ob eine Zahl oder der String in der Variablen steht.

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von whisper » 20.04.2020 14:55:05

Ein grep -c 'Connected: yes'
reicht allerdings auch... :facepalm:
Zu schnell getippt und wieder nicht richtig nachgedaht
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von fischig » 20.04.2020 15:06:20

Erklär mir bitte die Option -c. in der manpage zu grep habe ich sie nicht entdeckt.

edit
Jetzt habe ich die Option gefunden
Hmm, das ist irgendwie unschön. Dieses grep -c zählt lediglich die Anzahl der Zeilen, in denen der gesuchte Ausdruck vorkommt. Das ist fehleranfällig. Lieber wäre mir dann doch, ich steckte tatsächlich den gefundenen Ausdruck in die Variable. Um darin enthaltene führende Leerzeichen/Tabulatoren zu entfernen bleibt im shellscript wohl nur sed - richtig?
Zuletzt geändert von fischig am 20.04.2020 15:45:06, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von heisenberg » 20.04.2020 15:36:27

Code: Alles auswählen

man grep 
...
       -c, --count
              Statt die passenden Zeilen direkt anzuzeigen, wird lediglich ihre Anzahl pro 
              Eingabedatei ausgegeben. Ist zusätzlich die Option -v, --invert-match (siehe 
              unten) angegeben, zählt grep die Zeilen ohne Treffer.
...
Man kann in der Manpage auch suchen mit /suchbegriff (vorwärtssuche) oder ?suchbegriff (rückwärtssuche).

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: Shell(bash?)-Fehler

Beitrag von SubOptimal » 20.04.2020 16:09:10

Hi @fischic,

da Du weder an der kompletten Zeile, noch an der Anzahl der Vorkommen interessiert bis, kann die Suche nach dem ersten Treffer ohne Ausgabe abgebrochen werden.

Code: Alles auswählen

      -q, --quiet, --silent
              Quiet; do not write anything to standard output.  Exit immediately with zero status if any match is found, even if
              an error was detected. Also see the -s or --no-messages option.
wenn das Ergebnis der Suche lediglich für das IF-Statement benötigt wird, dann könnte Dein Skript z.B. so aussehen.

Code: Alles auswählen

mplOpt=leer
if ./btctl-info | grep -q "Connected: yes".
then
  mplOpt="-ao alsa:device=GO2_SOFTVOL"
fi
echo $mplOpt
mit Gruß
SubOptimal

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von Meillo » 20.04.2020 16:55:16

SubOptimals Variante finde ich mehr als suboptimal. ;-)

Ansonsten hilft in diesem Fall moeglicherweise:

Code: Alles auswählen

fgrep -o "Connected: yes"
Use ed once in a while!

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von fischig » 20.04.2020 17:48:01

Wie kriege ich die Variable mplOpt raus aus dem script? Ich möchte sie anschließend im Terminal zur Verfügung haben.

Code: Alles auswählen

export mplOpt
im script hat das nicht bewirkt.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von Meillo » 20.04.2020 17:54:52

fischic hat geschrieben: ↑ zum Beitrag ↑
20.04.2020 17:48:01
Wie kriege ich die Variable mplOpt raus aus dem script? Ich möchte sie anschließend im Terminal zur Verfügung haben.

Code: Alles auswählen

export mplOpt
im script hat das nicht bewirkt.
`export' stellt die Variable nur Kindprozessen zur Verfuegung. Von einem Kindprozess zum Elternprozess kann man in Unix keine Variablen durchreichen.

Entweder du schreibst den Wert in eine Datei, die der Elternprozess dann liest. Oder dein Script gibt den Wert aus und der Elternprozess liest die Ausgabe deines Scriptes ein. Das waeren die ueblichsten Ansaetze.

Vielleicht kannst du auch nochmal genauer beschreiben was du tun willst.
Use ed once in a while!

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von fischig » 20.04.2020 18:06:55

Oder dein Script gibt den Wert aus
In eine Datei zu schreiben kriegte ich wohl hin, aber ich denke, das Zitierte ist das, was ich suche/mir lieber wäre. Mit dem Begriff "Elternprozess" vermag ich hier nichts anzufangen. Ich denke, es gibt keinen. Ich will den Inhalt/Wert von mplOpt in ein Mplayer-Kommando einbauen. Hintergrund findest du u.a. hier (ist aber eine längere Geschichte).

Benutzeravatar
MSfree
Beiträge: 11610
Registriert: 25.09.2007 19:59:30

Re: Shell(bash?)-Fehler

Beitrag von MSfree » 20.04.2020 18:20:42

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.04.2020 17:54:52
`export' stellt die Variable nur Kindprozessen zur Verfuegung. Von einem Kindprozess zum Elternprozess kann man in Unix keine Variablen durchreichen.
Man kann aber Variablen per Skript für die aktuelle Shell setzen. Mit:

Code: Alles auswählen

. Skriptname
werden die Befehle im Skript von der aktuellen Shell ausgeführt und nicht von einem Childprozeß.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von Meillo » 20.04.2020 18:21:09

fischic hat geschrieben: ↑ zum Beitrag ↑
20.04.2020 18:06:55
Mit dem Begriff "Elternprozess" vermag ich hier nichts anzufangen.
Der Elternprozess ist das Programm, das dein Script aufruft. In deinem Fall evtl. eine interaktive Shell oder ein anderes Script.

Ich will den Inhalt/Wert von mplOpt in ein Mplayer-Kommando einbauen.
Dann evtl. in der ARt:

Dein derzeitiges Script:

Code: Alles auswählen

# ... allerlei Code ...
# am Ende:
echo "$mplOpt"
Das umgebende Script:

Code: Alles auswählen

mplOpt="$(obigescript)"
mplayer $mplOpt "$@"

So wie du in deinem Script die Ausgabe von `btctl-info|grep' eingelesen hast, so kannst du das auch mit der Ausgabe von deinem eigenen Script tun. (Das ist gerade das Schoene an Unix: Eigene Scripte verhalten sich genauso wie Systemprogramme. Du kannst das System mit eigenen Scripten erweitern ... fugenlos! :-) )
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von Meillo » 20.04.2020 18:34:44

MSfree hat geschrieben: ↑ zum Beitrag ↑
20.04.2020 18:20:42
Meillo hat geschrieben: ↑ zum Beitrag ↑
20.04.2020 17:54:52
`export' stellt die Variable nur Kindprozessen zur Verfuegung. Von einem Kindprozess zum Elternprozess kann man in Unix keine Variablen durchreichen.
Man kann aber Variablen per Skript für die aktuelle Shell setzen. Mit:

Code: Alles auswählen

. Skriptname
werden die Befehle im Skript von der aktuellen Shell ausgeführt und nicht von einem Childprozeß.
Du hast recht, so kann man das Problem umgehen.

Das Source-Kommando (.) ruft kein Script auf, es wird auch kein Script ausgefuehrt. Sondern, was passiert ist, dass der Inhalt der angegebenen Datei einfach an die Stelle kopiert wird. Ich bin ja gerne ein bisschen pedantisch: Beim Source-Kommando ist ueberhaupt kein Script beteiligt, sondern nur eine beliebige Datei. Natuerlich muss sie Shell-Befehle enthalten (und somit koennte man sie als Script bezeichnen), aber die Datei ist in solchen Faellen normalerweise keine separat aufrufbare Datei (was ich als Script ansehen wuerde), sondern eine Include-Datei, die nur fuer diesen Zweck da ist.

Man kann das schon so machen, sollte es aber nur in Ausnahmefaellen tun. Das Verfahren skaliert nicht so schoen wie wenn man Programm-/Script-Aufrufe verwendet (siehe vorigen Post von mir). AFAIR wird $PATH nicht beruecksichtigt. Die Datenfluesse sind undurchsichtig; man muss beide Scripte als Gesamtheit betrachten, damit nicht unvorhergesehene Dinge passieren. `exit' bricht auch das umgebende Script ab. Usw.

Dir, @MSfree, muss ich das alles nicht erzaehlen, Neulinge sollten sich aber gleich die strukturell schoenen Varianten aneignen, darum die vielen Worte.
Use ed once in a while!

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell(bash?)-Fehler

Beitrag von fischig » 20.04.2020 18:42:09

@Meillo
Dunnerlüttchen! 8O Funktioniert einwandfrei! :THX: :THX: :THX:

Das war leider zu einfach für mein umständliches Denken. :mrgreen:

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell(bash?)-Fehler

Beitrag von Meillo » 20.04.2020 18:54:37

fischic hat geschrieben: ↑ zum Beitrag ↑
20.04.2020 18:42:09
Das war leider zu einfach für mein umständliches Denken. :mrgreen:
Darum hat Dennis Ritchie auch gesagt: ``Unix is very simple, it just needs a genius to understand its simplicity.'' ;-)

Schoen, dass es funktioniert.
Use ed once in a while!

Antworten