Kommandozeile Schnellstart – Conditionals

Skripte, die etwas aufwändiger sind, verlangen meist Entscheidungen. Diese Entscheidungen werden auf Grund vordefinierter Bedingungen getroffen. Beispielsweise können wir so eine Datei löschen, wenn sie an einem bestimmten Datum erstellt wurde oder eine bestimmte Größe übersteigt. Kurz gesagt machen Conditionals Skripte erst dynamisch, da durch sie Skripte unterschiedlich ablaufen, wenn sich die Rahmenbedingungen ändern.

Syntax

if [[Bedingung]]
then
<Befehl>
fi

Dieses Konstrukt führt dazu, dass der Befehl ausgeführt wird, wenn die Bedingung wahr ist. Wir wollen uns dazu einige Beispiele ansehen.

Wie in den meisten Programmiersprachen lässt sich die if-Abfrage durch den else-Befehl erweitern:

if [[Bedingung]]
then
<Befehl 1>
else
<Befehl 2>
fi

Hierbei wird Befehl 1 ausgeführt, wenn die Bedingung wahr ist. Befehl 2 wird ausgeführt, wenn die Bedingung nicht wahr ist.

Anmerkung

Es ist nicht zwingend notwendig, doppelte eckige Klammern für die Bedingung zu verwenden. Allerdings erlauben die doppelten Klammern mehr Features wie reguläre Ausdrücke. Mehr dazu unter http://tldp.org/LDP/abs/html/testconstructs.html#EX11

Code-Beispiele

1. Numerische Vergleiche

if [[ 2 -lt 3 ]]
then 
echo "2 ist kleiner als 3"
fi

Dieses Beispiel ist sehr einfach. Wir testen ob zwei kleiner als drei ist. Diese Bedingung ist erfüllt und so wird das echo-Kommando ausgeführt. Der Vergleichsoperator -lt entspricht dabei dem englischen Ausdruck „lesser than“.

Interessanter wird es meist, wenn wir Variablen mit Literalen vergleichen:

var=3

if [[ 3 -eq 3 ]]
then
echo "Die Variable var entspricht dem Wert 3"
fi

Hierbei entspricht der Vergleichsoperator -eq dem englischen Wort „equals“.

Im folgenden sind alle numerischen Vergleichsoperatoren aufgelistet:

  • -eq: equals / ist gleich
  • -ge: greater than or equal / größer gleich
  • -gt: greater than / größer
  • -le: lesser than or equal / kleiner gleich
  • -lt: lesser than / kleiner
  • -ne: not equals / ungleich

2. Alphabetische Vergleiche

Alphabetische und numerische Vergleiche sind grundsätzlich sehr ähnlich. Allerdings verlangt Bash für alphabetische Vergleiche andere Vergleichsoperatoren.

var="Hello World"

if [[var == "Hello World"]]
then
echo "Die Variable var entspricht dem String Hello World"
fi

Im folgenden sind alle alphabetischen Vergleichsoperatoren aufgelistet:

  • == / testet, ob beide Strings gleich sind
  • != / testet, ob beide Strings ungleich sind
  • =~ testet, ob der String dem regulären Ausdruck entspricht
  • > testet, ob der String in alphabetischer Ordnung größer ist
  • < testet, ob der String in alphabetischer Ordnung kleiner ist
  • -z testet, ob der String null entspricht

Der -z Operator ist dabei besonders nützlich, da man bei der Bash-Programmierung oft mit Ergebnissen von Variablenzuweisungen arbeitet. Mittels -z lässt sich dabei überprüfen, ob der Variablen überhaupt ein Wert zugeordnet wurde.

Code-Beispiel:

result=$(find . -name "develop" -maxdepth 1)

if [[-z $result]]
then
echo "Unser find-Befehl hat eine Datei gefunden"
fi

Deine Aufgabe - Jetzt bist du dran:

Wichtig: Tippe dein Bash-Skript in den oberen (weißen Teil) des Editors. In Zeile 1 habe ich dir die dateifinden-Variable bereits definiert.

  1. Erstelle eine If-Then Abfrage (Conditional) ab Zeile 3 im Editor. Hinweis: Schreibe die Bedingung ohne die doppelten eckigen Klammern [[ ]] Die Abfrage soll folgendes machen: Wenn Datei mit dem Namen "geheimnis" gefunden wurde, dann schreibe/drucke folgenden Text mit dem echo Befehl "Ich hab das Geheimnis gefunden"
  2. Denk daran, deine Abfrage mit "fi" zu beenden
  3. Klicke auf "Run", um dein Bash-Skript auszuführen.

[lp_spoiler title="Lösung anzeigen" class="da"]

dateifinden=$(find . -name "geheimnis" -maxdepth 1)

if $dateifinden
then
    echo "Das Geheimnis wurde gefunden"
fi

[/lp_spoiler]

Zusammenfassung

Conditionals machen Skripte dynamisch, indem sie auf Grund von Vergleichen den Ablauf des Programms beeinflussen. Alphabetische und numerische Vergleiche verwenden dabei verschiedene Operatoren.