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