Fangen wir mit
an.
BT_MAC ist wie du schon richtig festgestellt hast ein Array, das bei uns aus zwei Elementen besteht
BT_MAC[1] und
BT_MAC[2]. Das
@ in
BT_MAC[@] steht für alle vorhandenen Elemente.
Dann ist da aber noch das Rufzeichen und das besagt, dass wir nicht die eigentlichen Elemente sondern deren Indizes, bei uns 1 und 2 wollen.
${!BT_MAC[@]} bedeutet so wie wir
BT_MAC gesetzt haben. also schlicht "
1 2". Die for-Schleife wird demzufolge mit i=1 und i=2 ausgeführt.
Als nächstes
Code: Alles auswählen
bluetoothctl <<< "info ${BT_MAC[${i}]}" | grep "Connected: yes$" &> /dev/null && bt_count=$((${bt_count}+${i}))
Da haben wir den Befehl mit dem Here String
${BT_MAC[${i}]} ist das i-te Element von
BT_MAC, also etwa
12:51:02:20:0F:E8
Das ganze mit dem here document und here string ist einfach eine Möglichkeit, einen Text (oder einen beliebigen anderen Inhalt) im Skript unterzubringen, den man sonst als eigene Datei zur Verfügung stellen müsste.
Ein eigenes Skript in bluetoothctl zu schreiben wäre für einen einzigen bluetoothctl-Befehl etwas unpraktisch, also übergeben wir den String "
info ${BT_MAC[${i}]}" mit
<<< an
bluetoothctl, ganz so als würden wir beispielsweise „
info 12:51:02:20:0F:E8“ mit der Tastatur eingeben.
Mit dem Pipe-Symbol
| wird die Ausgabe eines Befehls als Eingabe auf den darauffolgenden weitergereicht. Die Ausgabe von
bluetoothctl wird also mit
grep nach einem bestimmten String durchsucht
Das
$ steht für das Zeilenende (das ist nur eine, in diesem Fall nicht notwendige, zusätzliche Bedingung). grep gibt nur Zeilen aus in denen der Suchstring vorhanden ist, aber weil wir an der Ausgabe der Zeile gar nicht interessiert sind, habe ich die Ausgabe ins digitale Nirvana (»
/dev/null«) umgeleitet.
Statt an der Ausgabe orientieren wir uns am exit-Code von
grep. Der ist nur 0, wenn etwas gefunden wurde. Dafür ist dann das
&& da:
Das führt den darauffolgenden Befehl nur aus, wenn der exit-Code des vorigen gleich 0 ist.
Nur wenn grep den Suchstring ("Connected: yes$") findet, addieren wir zur Variablen
bt_count den Wert von i. Daraus folgt dann die Zuordnung
0...kein BT-Gerät
0+1=1...BT-Gerät Nummer eins
0+2=2...BT-Gerät Nummer zwei
0+1+2=3...beide BT-Geräte
Das letzte mit dem Funktionsergebnis sieht so aus:
In der Bash liefern Funktionen eigentlich kein Ergebnis. Man kann, wie vorhin grep, einen Wert als exit-Status sozusagen übergeben, dann hätten wir am Ende
schreiben müssen. Der exit-Code muss allerdings 0 oder eine natürliche Zahl bis maximal 255 sein.
Stattdessen geben wir mit echo ganz normal den Wert von
bt_count aus. Im Terminal ausgeführt würde der Wert von
bt_count einfach am Bildschirm ausgegeben.
Wir rufen die Funktion aber folgendermaßen auf
Dabei wird
check_device aufgerufen und die Ausgabe von
check_device in der Variablen connected gespeichert.