Bash/Bedingungen: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „== Bedingungen == === Bedingungen testen === siehe test === if - then - else === Als Bedingung kann nicht nur der test-Befehl, sondern eine beliebige Folge von Kommandos verwendet werden * Jedes Kommando liefert einen Errorcode zurück, der bei erfolgreicher Ausführung gleich Null (true) und bei einem Fehler oder Abbruch ungleich Null (false) ist ; Testen einer Bedingung mit der if-Anweisung Jede Anweisung muss entweder in einer eigenen Zeile stehe…“ |
Keine Bearbeitungszusammenfassung |
||
Zeile 195: | Zeile 195: | ||
fi | fi | ||
find / -group1 -exec chgrp2 {} ";"</syntaxhighlight> | find / -group1 -exec chgrp2 {} ";"</syntaxhighlight> | ||
[[Kategorie:Bash/Kontrollstrukturen]] |
Aktuelle Version vom 14. Oktober 2025, 10:34 Uhr
Bedingungen
Bedingungen testen
siehe test
if - then - else
Als Bedingung kann nicht nur der test-Befehl, sondern eine beliebige Folge von Kommandos verwendet werden
- Jedes Kommando liefert einen Errorcode zurück, der bei erfolgreicher Ausführung gleich Null (true) und bei einem Fehler oder Abbruch ungleich Null (false) ist
- Testen einer Bedingung mit der if-Anweisung
Jede Anweisung muss entweder in einer eigenen Zeile stehen oder durch einen Strichpunkt von den anderen Anweisungen getrennt werden
- Trotzdem verhält sich eine bedingte Anweisung - oder die Schleifenkonstrukte, die weiter unten behandelt werden - wie eine einzige Anweisung
- Man kann dies ausprobieren, indem man eine if- oder while-Anweisung interaktiv eingibt. Solange nicht 'fi' bzw. 'done' eingetippt wurde, erhält man den PS2-Prompt ('>')
Die if-Anweisung in der Shell-Programmierung macht das gleiche wie in allen anderen Programmiersprachen, sie testet eine Bedingung auf Wahrheit und macht davon den weiteren Ablauf des Programms abhängig
- Syntax
if Bedingung1
then Befehle1
[ elif Bedingung2
then Befehle2 ]
..
[ else Befehle3 ]
fi
- Wenn die Bedingung1 erfüllt ist, werden die Befehle1 ausgeführt
- andernfalls, wenn die Bedingung2 erfüllt ist, werden die Befehle2 ausgeführt
- Trifft keine Bedingung zu, sollen die Befehle3 ausgeführt werden
- Bedingungen werden normalerweise mit dem Befehl test formuliert
- Es kann aber auch der Rückgabewert jedes anderen Kommandos ausgewertet werden
- Für Bedingungen, die auf jeden Fall zutreffen sollen steht der Null-Befehl (:) zur Verfügung
- Beispiele
Man achte auf die Positionierung der Semikoli
#!/bin/sh
# Füge eine 0 vor Zahlen kleiner 10 ein
counter=0
if [counter -lt 10 ]; then
number=0$counter; else number=$counter; fi
#!/bin/bash
# Erstelle ein Verzeichnis, wenn es noch nicht existiert
dir=daten
if [ ! -edir ]; then
mkdirdir; fi # mkdir: Verzeichnis erstellen
einseitiges if
if kommandoliste
then
kommandos
fi
zweiseitiges if
if kommandoliste
then
kommandos
else
kommandos
fi
Mehrstufiges if
if kommandoliste1
then
kommandos
elif kommandoliste2
then
kommandos
elif ..
..
fi
Beispiele
Es soll eine Meldung ausgegeben werden, falls mehr als 5 Benutzer eingeloggt sind
USERS=`who | wc -l` # Zeilen der who-Ausgabe zählen
if test USERS -gt 5
then
echo "Mehr als 5 Benutzer am Geraet"
fi
Kürzere Variante
if [(who | wc -l) -gt 5 ] ; then
echo "Mehr als 5 Benutzer am Geraet"
fi
Man sollte bei der Entwicklung von Skripts aber ruhig mit der Langfassung beginnen und sich erst der Kurzfassung zuwenden, wenn man mehr Übung hat und die Langfassungen auf Anhieb funktionieren
Ein weiteres Beispiel zeigt eine Fehlerprüfung
if test # -eq 0
then
echo "usage: sortiere filename" >&2
else
sort +1 -21 | lp
fi
- Beispiel
Zeigt eine mehr oder weniger intelligente Anzeige für Dateien und Verzeichnisse.
'show' zeigt bei Dateien den Inhalt mit 'less' an und Verzeichnisse werden mit 'ls' präsentiert
- Fehlt der Parameter, wird interaktiv nachgefragt
if [# -eq 0 ] # falls keine Angabe
then # interaktiv erfragen
echo -n "Bitte Namen eingeben: "
read DATEI
else
DATEI=$1
fi
if [ -f DATEI ] # wenn normale Datei
then # dann ausgeben
lessDATEI
elif [ -d DATEI ] # wenn aber Verzeichnis
then # dann Dateien zeigen
ls -CF DATEI
else # sonst Fehlermeldung
echo "cannot showDATEI"
fi
- Beispiel
Hängt eine Datei an eine andere Datei an; vorher erfolgt eine Prüfung der Zugriffsberechtigungen
append Datei1 Datei2
if [ -r $1 -a -w $2 ]
then
cat $1 >> $2
else
echo "cannot append"
fi
Beim Vergleich von Zeichenketten sollten möglichst die Anführungszeichen (" ... ") verwendet werden, da sonst bei der Ersetzung durch die Shell unvollständige Test-Kommandos entstehen können
- Beispiel
if [ ! -n $1 ] ; then
echo "Kein Parameter"
fi
Ist 1 wirklich nicht angegeben, wird das Kommando reduziert zu
if [ ! -n ] ; then ...
Es ist also unvollständig und es erfolgt eine Fehlermeldung. Dagegen liefert
if [ ! -n "$1" ] ; then
echo "Kein Parameter"
fi
bei fehlendem Parameter den korrekten Befehl
if [ ! -n "" ]
Bei fehlenden Anführungszeichen werden auch führende Leerzeichen der Variablenwerte oder Parameter eliminiert
- Weiteres Beispiel
Es kommt vor, dass eine Userid wechselt oder die Gruppenzugehörigkeit von Dateien geändert werden muss. In solchen Fällen helfen die beiden folgenden Skripte
#!/bin/sh
# Change user-id
#
if [# -ne 2 ] ; then
echo "usage `basename0` <old id> <new id>"
exit
fi
find ~ -user1 -exec chown2 {} ";"
#!/bin/sh
# Change group-id
#
if [# -ne 2 ] ; then
echo "usage `basename0` <old id> <new id>"
exit
fi
find / -group1 -exec chgrp2 {} ";"