Login
Newsletter
Werbung

Do, 7. Dezember 2017, 15:00

Shellskripte mit Aha-Effekt: Bash-Arrays

Zwei Praxisbeispiele

Eine Liste der Dateinamen des aktuellen Verzeichnisses bekommen Sie übrigens mit der Zuweisung:

Dateien=(*)

Zum Abschluss eine praktische Nutzanwendung für Arrays. Bei Raspberry Pi (meine derzeit liebste Spielmaschine) müssen die GPIO-Ports für die parallele Ein- und Ausgabe zu Beginn initialisiert werden. Sind es zahlreiche Ports, macht man das am besten in einer Schleife. Nur steckt die Schleife meist in den Tiefen des Skripts und man muss für das Ändern oder Hinzufügen von Ports erst einmal suchen. Viel wartungsfreundlicher ist es, die Portzuordnung am Anfang des Skripts (oder sogar in einer Konfigurationsdatei) vorzunehmen. Das sieht dann beispielsweise folgendermaßen aus:

# Port-Zuordnung zu den LEDs
GPIO=(27 22 19 17 13 6 5)

Die Initialisierung der Ports erfolgt dann in einer Schleife über die Array-Komponenten, was in Zeile 2 geschieht. Nach Expansion durch die Shell lautet die Zeile »for Port in 27 22 19 17 13 6 5«, also eine ganz normale Schleifenanweisung. Die Zeilen 4 bis 11 sorgen für die Initialisierung der GPIO-Ports, der genaue Inhalt ist an dieser Stelle nicht so wichtig, hier ist nur die Anwendung der Laufvariablen Port von Belang.

01: # Ports initialisieren, wenn noch nicht erfolgt
02: for Port in ${GPIO[@]}
03: do
04:   if [ ! -f /sys/class/gpio/gpio${Port}/direction ] ; then
05:     echo "Initialisiere GPIO $Port"
06:     echo "$Port" > /sys/class/gpio/unexport 2> /dev/null
07:     echo "$Port" > /sys/class/gpio/export
08:     echo "out" >/sys/class/gpio/gpio${Port}/direction
09:     echo "0" >/sys/class/gpio/gpio${Port}/value
10:     chmod 666 /sys/class/gpio/gpio${Port}/direction
11:     chmod 666 /sys/class/gpio/gpio${Port}/value
12:   fi
13: done

Übrigens könnten Sie mit dem Befehl PARAM=( $@ ) auch alle Kommandozeilen-Parameter in einem Array speichern und dann wahlfrei darauf zugreifen. Das ist manchmal einfacher als andere Methoden des Zugriffs auf die Parameter. Um das Beispiel oben weiterzuspinnen, soll auf der Kommandozeile beim Aufruf des folgenden Skripts für jede LED »0«oder »1« angegeben werden und diese Parameter der Reihe nach auf den oben definierten GPIP-Ports ausgegeben werden, also der erste Parameter auf Port 27, der zweite auf Port 22 usw. Als Laufvariable dient der Index des Parameterarrays (Zeile 2). In der Schleife wird dann der I-te Parameter auf den I-ten GPIO-Port ausgegeben (Zeile 4).

01: PARAM=( $@ )
02: for I in ${!PARAM[@]}
03: do
04:   echo ${PARAM[$I]} > /sys/class/gpio/gpio${GPIO[$I]}/value
05: done

Pro-Linux
Traut euch!
Neue Nachrichten
Werbung