Bash/Fallunterscheidung: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „== Fallunterscheidung == ; case Auch die case-Anweisung ist vergleichbar in vielen anderen Sprachen vorhanden * Sie dient, ähnlich wie die if-Anweisung, zur Fallunterscheidung. Allerdings wird hier nicht nur zwischen zwei Fällen unterschieden (Entweder / Oder), sondern es sind mehrere Fälle möglich * Man kann die case-Anweisung auch durch eine geschachtelte if-Anweisung völlig umgehen, allerdings ist sie ein elegantes Mittel um den Code lesbar zu hal…“ |
Keine Bearbeitungszusammenfassung |
||
Zeile 109: | Zeile 109: | ||
done | done | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Kategorie:Bash/Kontrollstrukturen]] |
Aktuelle Version vom 14. Oktober 2025, 10:34 Uhr
Fallunterscheidung
- case
Auch die case-Anweisung ist vergleichbar in vielen anderen Sprachen vorhanden
- Sie dient, ähnlich wie die if-Anweisung, zur Fallunterscheidung. Allerdings wird hier nicht nur zwischen zwei Fällen unterschieden (Entweder / Oder), sondern es sind mehrere Fälle möglich
- Man kann die case-Anweisung auch durch eine geschachtelte if-Anweisung völlig umgehen, allerdings ist sie ein elegantes Mittel um den Code lesbar zu halten
Die Syntax der case-Anweisung lautet wie folgt
case Wert in
Muster1) Befehle1;;
Muster2) Befehle2;;
..
esac
Wenn der Wert mit dem Muster1 übereinstimmt, wird die entsprechende Befehlsgruppe (Befehle1) ausgeführt, bei Übereinstimmung mit Muster2 werden die Kommandos der zweiten Befehlsgruppe (Befehle2) ausgeführt, und weitere
- Der letzte Befehl in jeder Gruppe muss mit ;; gekennzeichnet werden
- Das bedeutet für die Shell soviel wie springe zum nächsten esac, so dass die anderen Bedingungen nicht mehr überprüft werden
- In den Mustern sind die gleichen Meta-Zeichen erlaubt wie bei der Auswahl von Dateinamen
- Wenn in einer Zeile mehrere Muster angegeben werden sollen, müssen sie durch ein Pipezeichen (|, logisches ODER) getrennt werden
- Beispiele
#!/bin/sh
# Mit dem ersten Argument in der Befehlszeile
# wird die entsprechende Aktion festgelegt
case 1 in # nimmt das erste Argument
Ja|Nein) response=1;;
*) echo "Unbekannte Option"; exit 1;;
esac
#!/bin/sh
# Lies die Zeilen von der Standardeingabe, bis eine
# Zeile mit einem einzelnen Punkt eingegeben wird
while : # Null-Befehl
do
echo -e "Zum Beenden . eingeben ==> \c"
read line # read: Zeile von StdIn einlesen
case "$line" in
.) echo "Ausgefuehrt"
break;;
*) echo "$line" >>./message ;;
esac
done
- case-Anweisung
Diese Anweisung erlaubt eine Mehrfachauswahl. Sie wird auch gerne deshalb verwendet, weil sie Muster mit Jokerzeichen und mehrere Muster für eine Auswahl erlauben case selector in
Muster-1) Kommandofolge 1 ;;
Muster-2) Kommandofolge 2 ;;
...
Muster-n) Kommandofolge n ;;
esac
Die Variable selector (String) wird der Reihe nach mit den Mustern "Muster-1" bis "Muster-n" verglichen. Bei Gleichheit wird die nachfolgende Kommandofolge ausgeführt und dann nach der case-Anweisung (also hinter dem esac) fortgefahren. * In den Mustern sind Metazeichen (*, ?, []) erlaubt, im Selektor dagegen nicht
- Das Muster * deckt sich mit jedem Selektor --> default-Ausgang. muss als letztes Muster in der case-Konstruktion stehen
- Vor der Klammer können mehrere Muster, getrennt durch | stehen
- Das Zeichen | bildet eine Oder-Bedingung
case selector in
Muster1) Kommandofolge1 ;;
Muster2 | Muster3) Kommandofolge2 ;;
*) Kommandofolge3 ;;
esac
- Beispiel 1
Automatische Bearbeitung von Quell- und Objekt-Dateien. Der Aufruf erfolgt mit 'compile Datei'
case1 in
*.s) as1 ;; # Assembler aufrufen
*.c) cc -c1 ;; # C-Compiler aufrufen
*.o) cc1 -o prog ;; # C-Compiler als Linker
*) echo "invalid parameter:1";;
esac
- Beispiel 2
Menü mit interaktiver Eingabe
while : # Endlosschleife
do
tput clear # Schirm löschen und Menütext ausgeben
echo " +---------------------------------+"
echo " | 0 --> Ende |"
echo " | 1 --> Datum und Uhrzeit |"
echo " | 2 --> aktuelles Verzeichnis |"
echo " | 3 --> Inhaltsverzeichnis |"
echo " | 4 --> Mail |"
echo "+----------------------------------+"
echo "Eingabe: \c" # kein Zeilenvorschub
read ANTW
case ANTW in
0) kill -9 0 ;; # und tschuess
1) date ;;
2) pwd ;;
3) ls -CF ;;
4) elm ;;
*) echo "Falsche Eingabe!" ;;
esac
done