Aus Raspberry Pi Geek 06/2017

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

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.

Listing 12

 

#!/bin/sh
while true; do
  echo $0 $$ $PPID
  sleep 30
done

Die Trap-Anweisung zum Abfangen von Signalen hat die Form trap ErsatzkommandoSignal. Geben Sie kein Kommando als Ersatz an, ignoriert das Skript das Signal lediglich. Listing 13 demonstriert das Abfangen eines Signals per trap in der Praxis. Senden Sie das Signal 10 oder SIGUSR1 an das Programm, zeigt es die Belegung der Massenspeicher im Rechner an.

Listing 13

 

#!/bin/sh
# Signale ignorieren
trap '' 2 20
# Auf Signal 10 reagieren
trap 'df -h' 10
while true; do
  echo "$$: $a"
  sleep 3
done

Verzweigungen und Schleifen

Das Skript aus Listing 14 bildet ein Auswahlmenü mitsamt eines Untermenüs ab. Es setzt die folgenden Anforderungen um:

  • Komfortable Eingabe über die Tastatur mit je einem Tastendruck.
  • Auswerten der Eingabe, sodass fehlerhafte Eingaben nicht auf dem Bildschirm erscheinen.
  • Für jede Auswahl gibt es genau eine Eingabemöglichkeit.

Listing 14

 

#!/bin/bash
while true; do
  # Bildschirm löschen
  clear
  # Hauptmenü
  echo "(1) Punkt 1"
  echo "(2) zum Untermenü"
  echo "(9) Beenden"
  # Auswahl einlesen, einstellig
  read -n1 -p "Aufgabe: " auf
  # Auswertung. Zahlenwerte als String
  # verhindern Fehleranzeigen, falls
  # Buchstaben gedrückt werden
  if [ "$auf" = "1" ]; then
    echo "Punkt 1"
    sleep 5
  elif [ "$auf" = "2" ]; then
    # neue Schleife
    while true; do
      # Bildschirm löschen
      clear
      # Untermenü
      echo "(a) Punkt a "
      echo "(b) Punkt b "
      echo "(z) zurück"
      read -n1 -p "Aufgabe: " umenu
      if [ "$umenu" = "a" ]; then
        echo "Punkt a"
        sleep 5
      elif [ "$umenu" = "b" ]; then
        echo "Punkt b"
        sleep 5
      elif [ "$umenu" = "z" ]; then
        # Zurück zum Hauptmenü
        break
      fi
    done
  elif [ "$auf" = "9" ]; then
    # Skriptende
    break
  fi
done
clear
echo "Skriptende"

Um das Beispiel einfach zu gestalten, besteht jede Funktion nur aus der Zeile echo "Punkt N", deren Ausgabe für jeweils fünf Sekunden auf dem Bildschirm verbleibt. Für das Hauptmenü stehen drei Möglichkeiten bereit, von denen eine das Skript beendet und eine weitere das Untermenü startet. Beim Beenden zeigt das Skript eine abschließende Nachricht an. Das Untermenü enthält wieder drei Punkte, wobei einer zum Rücksprung ins Hauptmenü dient. Zum Löschen des Bildschirms kommt clear zum Einsatz.

Einige der bereits im vorigen Teil des Workshops angesprochenen Techniken finden sich in diesem Programm wieder. Zum Einlesen der Eingabe steht bei read eine Länge der Zeichenkette von 1; der Anwender braucht also nicht mehr [Eingabe] zu drücken.

Um Fehlermeldungen aufgrund nicht numerischer Zeichen bei test zu vermeiden, vergleichen Sie einfach Zeichenketten anstelle numerischer Werte. Drückt der Benutzer eine Taste, die einem Buchstaben zugeordnet ist, erzeugt das keine Fehlermeldung.

Für das Untermenü starten Sie eine zweite While-Schleife, die das Programm ausschließlich über break wieder verlassen kann. Die Nachricht beim Beenden des Skripts schreiben Sie ans Dateiende, wo das Skript bei einem Abbruch der Schleife via break landet. Alternativ wäre es möglich, die Nachricht vor ein exit innerhalb des If-Konstrukts zu setzen.

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