Zum Inhalt springen

Bash/Bedingungen

Aus Foxwiki
Version vom 14. Oktober 2025, 10:14 Uhr von Dirkwagner (Diskussion | Beiträge) (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…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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 {} ";"