HOWTO · Bash

Zeichenfolgenvergleichsoperator in Bash

Dieser Artikel erklärt den Zeichenfolgenvergleich in Bash mithilfe einer if-Anweisung.

Auf dieser Seite

Mit einer if-Anweisung und Bashs Befehl [ prüfst du, ob zwei Zeichenfolgen in Anführungszeichen denselben Wert haben. In [ "$first" = "$second" ] ist [ der Befehlsname; die Werte in Anführungszeichen, = und die schließende ] sind separate Argumente. Lass Leerzeichen dazwischen, damit Bash jedes Argument einzeln übergibt.

Zeichenfolgen in Bash mit if vergleichen

Dieses vollständige Beispiel vergleicht zwei Zeichenfolgenvariablen und gibt eine Meldung aus, wenn sie übereinstimmen. Ändere einen der Werte, um einen anderen Text zu vergleichen.

first="Hello"
second="Hello"
if [ "$first" = "$second" ]; then
    echo "Strings are equal"
else
    echo "Strings are different"
fi

Das Beispiel wurde ausgeführt; die Standardausgabe lautete:

Strings are equal

Der Vergleich wird mit Bashs Befehl [ durchgeführt; if führt den ersten Zweig aus, wenn dieser Befehl erfolgreich ist, andernfalls den else-Zweig. Wenn du jede Variablenexpansion in Anführungszeichen setzt, bleibt jeder Wert ein einzelnes Testargument – auch wenn er Leerzeichen enthält oder nicht gesetzt ist. Die oben gezeigte aufgezeichnete Standardausgabe lautet Strings are equal; diese Beschriftung bleibt im unveränderten Beispiel auf Englisch.

Setze die Variablen vor der Bedingung, wenn die Werte aus vorherigen Schritten eines Skripts stammen. Bei einer Zuweisung stehen keine Leerzeichen um =, etwa in first="Hello there"; die Leerzeichen um den Vergleichsoperator gehören dagegen in den Test. Anführungszeichen fassen jede Expansion zu einem Argument zusammen, gehören aber nicht zum verglichenen Wert. Verglichen wird die ganze Zeichenfolge einschließlich Groß- und Kleinschreibung sowie führender und nachgestellter Leerzeichen. Daher sind Hello und hello unterschiedliche Werte.

Mit = und == Zeichenfolgen auf Gleichheit prüfen

Verwende innerhalb von [ ... ] den Operator =, um zu prüfen, ob zwei Zeichenfolgen gleich sind. Bash akzeptiert in diesem Befehl auch == für den Zeichenfolgenvergleich; [ "$first" == "$second" ] ist also eine alternative Bedingung. Diese Operatoren vergleichen die Werte links und rechts von ihnen. Der Zuweisungsoperator in first="Hello" speichert dagegen einen Wert in einer Variablen.

Lass die Leerzeichen um den Operator stehen. In [ "$first" = "$second" ] ist [ der Befehlsname; jeder Wert in Anführungszeichen, der Operator und die schließende ] sind separate Argumente. Die Leerzeichen sind nötig, damit die Shell erkennt, wo ein Argument endet und das nächste beginnt. Ohne sie übergibt beispielsweise [ "$first"="$second" ] eine einzelne nicht leere Zeichenfolge zum Testen statt zweier Werte und eines Gleichheitsoperators. Der beabsichtigte Vergleich findet damit nicht statt.

Für einen gewöhnlichen Zeichenfolgenvergleich in diesem Bash-Test ist = die klarste Wahl; == wird ebenfalls akzeptiert. Entscheide dich für eine Form und verwende sie im Skript durchgängig. Verwechsle keinen der Vergleichsoperatoren mit dem =, mit dem du einer Variablen einen Wert zuweist. Die Bedingung ist nur dann wahr, wenn beide Werte exakt übereinstimmen. Soll dein Programm Groß- und Kleinschreibung ignorieren oder umgebende Leerzeichen entfernen, verändere die Werte zuerst und vergleiche dann die resultierenden Zeichenfolgen. Der Gleichheitstest selbst normalisiert sie nicht.

Ungleiche Zeichenfolgen mit != testen

Verwende != an derselben Stelle, um zu prüfen, ob sich die Werte unterscheiden. Dieses eigenständige Beispiel gibt für die beiden Werte den passenden Zweig aus:

first="Hello"
second="World"
if [ "$first" != "$second" ]; then
    echo "Strings are different"
else
    echo "Strings are equal"
fi
Strings are different

Der then-Zweig wird ausgeführt, wenn sich die Zeichenfolgen unterscheiden; andernfalls führt Bash else aus. Setze beide Werte in Anführungszeichen und lass die Leerzeichen um != wie bei = stehen. Um das Muster auf Benutzereingaben oder Befehlsausgaben anzuwenden, weise jeden Wert zuerst einer Variablen zu und vergleiche die Variablen dann mit dem Operator, der zur gewünschten Bedingung passt.

Verwende diese Form, wenn der nächste Schritt davon abhängt, eine Änderung zu erkennen – etwa um zu melden, dass zwei Namen oder Konfigurationswerte nicht übereinstimmen. Der else-Zweig behandelt den umgekehrten Fall und macht im Skript sichtbar, was bei beiden Ergebnissen geschieht. Wie beim Gleichheitstest sorgt das Setzen in Anführungszeichen dafür, dass ein Wert mit Leerzeichen ein einzelnes Testargument bleibt. Setze den Operator zwischen die beiden Werte in Anführungszeichen und lass vor der abschließenden ] ein Leerzeichen. So bleibt die von Bash erwartete Argumentstruktur erhalten.