Aus Raspberry Pi Geek 06/2017

Shell-Skripte selbst schreiben (Teil 2) (Seite 2)

Listing 7

 

#!/bin/bash
for i in 1 2 3; do
  echo $i
done

Eine Subshell liefert solange Argumente, bis sie abgearbeitet wurde. Sie können auf diese Weise die Ausgaben beliebiger Befehle auswerten, müssen aber penibel auf den Feldtrenner (Standard: Leerzeichen) achten. So versteht die Shell die Zeichenkette Hans Schmidt als zwei Werte. Listing 8 demonstriert eine Suche nach allen Dateien, welche den String log im Namen führen.

Listing 8

 

#!/bin/bash
for i in $(ls *log*); do
  echo $i
done

Die Bash bietet zusätzlich einen Zähler für Schleifen. Damit geben Sie exakt einen numerischen Bereich vor. Der Befehl seq erlaubt es dabei auf einfache Weise, eine solche Reihe zu erstellen. Geben Sie für den Befehl nur den Endwert an, arbeitet er in Einer-Schritten. Geben Sie sowohl Start- als auch Endwert an, erhalten Sie ebenso Einer-Schritte. Nutzen Sie das Kommando in der Form seq StartSchrittweiteEndwert, gestalten Sie die Zählweise noch feiner. Sie finden beide Methoden in Listing 9.

Listing 9

 

#!/bin/bash
echo "Schleife mit Zähler"
for ((i=0; i<5; i++)); do
  echo $i
done
echo "Schleife mit seq"
for i in $(seq 4); do
  echo $i
done

While-Schleife

Eine While-Schleife läuft solange, wie ein Kommando oder ein Block von Anweisungen erfolgreich arbeitet und den Exit-Code 0 liefert. Den Teil mit den Befehlen leiten Sie mit do ein und schließen ihn mit done ab. Steht kein explizites Kommando bereit, nutzen Sie den Befehl true, der stets den Exit-Code 0 ausgibt. Auf diese Weise erzeugen Sie eine Endlosschleife. Die Schleife in Listing 10 läuft, solange der Wert der Variablen $a größer ist als der von $b.

Listing 10

 

#!/bin/sh
a=3
b=0
while [ $a -gt $b ]; do
  echo $b
  b=$(echo $b + 1 | bc)
done

Until-Schleife

Eine Until-Schleife läuft, solange die Bedingung den Exit-Code 1 liefert. Den Anweisungsteil leiten Sie wieder mit do ein und schließen ihn mit done ab. Diese Schleifenvariante der Schleife entstand aus der Notwendigkeit heraus, dass einige Shells keinen negierten test mit vorangestelltem Ausrufezeichen beherrschen.

In der täglichen Praxis mit der Bash kommt die Until-Schleife eher selten zum Einsatz. Setzen Sie kein explizites Kommando ein, übernimmt false diesen Platz. Dieser Befehl liefert stets den Exit-Code 1 zurück, wodurch im Prinzip eine Endlosschleife entsteht. Listing 11 zeigt eine Schleife, die solange läuft, bis der Wert der Variablen $a gleich dem von $b ist.

Listing 11

 

#!/bin/sh
a=3
b=0
until [ $a -eq $b ]; do
  echo $b
  b=$(echo $b + 1 | bc)
done

Tritt innerhalb einer Schleife eine Abbruchbedingung auf, benötigen Sie einen entsprechenden Aufruf für die Reaktion. Hierfür stehen exit, break und continue bereit (siehe Tabelle “Sprunganweisungen”).

Sprunganweisungen

Anweisung

Wirkung

exit

Beendet das laufende Shell-Skript sofort.

break

Beendet die Schleife. Der Befehl ist ab der Stelle seines Erscheinens im Skript wirksam.

continue

Bricht nur den Durchlauf ab, die Schleife läuft weiter.

Fallen stellen

Einem Shell-Skript können Sie wie jedem anderen Prozess Signale übermitteln. Um es anzusprechen, benötigen Sie die Nummer des zugehörigen Prozesses (PID). Die wichtigsten Signale finden Sie in der Tabelle “Signale”. Der Aufruf trap -l zeigt eine Übersicht über alle vorhandenen Signale.

Signale

Signal

Nummer

Aktion

SIGINT

2

Prozess beenden

SIGKILL

9

Prozess sofort beenden

SIGTERM

15

Prozess normal beenden

SIGALM

14

Prozess beenden nach Zeitablauf

SIGSTOP

19

Prozess anhalten

SIGTSTP

20

Prozess anhalten

SIGCONT

18

Prozess fortsetzen

SIGUSR1

10

Benutzerdefiniertes Signal

SIGUSR2

12

Benutzerdefiniertes Signal

Es ist nicht möglich, die Signale 9 und 19 im Skript abzufangen. Bei den anderen Signalen besteht aber die Möglichkeit, sie durch neue Anweisungen für eigene Zwecke zu nutzen.

Um ein Gefühl für diese Technik zu bekommen, starten Sie das Skript aus Listing 12. Das Programm zeigt in einer Endlosschleife den Aufrufnamen des Skripts, dessen Prozess-ID sowie die Prozess-ID des aufrufenden Prozesses an. Von einem anderen Terminal aus senden Sie mittels dem Kill-Befehl nacheinander die Signale 19, 18, 10, 15 und 9. Einige der Signale beenden das Skript. Starten Sie es deshalb wieder, wenn Sie weiter experimentieren wollen.

RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben