So meistern Sie Bash If…Else-Anweisungen mit [[ ]], Elif und logischen Operatoren

Manchmal können Bash-Skripte eine echte Qual sein, wenn Bedingungen fehlschlagen oder sich unerwartet verhalten. Es sind nicht immer Syntaxfehler – oft sind es Kleinigkeiten wie das Vergessen korrekter Anführungszeichen, das Verwechseln von Operatoren oder die Verwendung der falschen Testsyntax für Ihre Anforderungen. Diese winzigen Fehler können dazu führen, dass Skripte den falschen Zweig ausführen, wichtige Prüfungen überspringen oder einfach ohne klare Hinweise abbrechen. Es ist zwar etwas seltsam, aber wenn man die häufigsten Fallstricke kennt, wird das Schreiben zuverlässiger Bedingungen viel einfacher. Außerdem funktionieren in manchen Setups Skripte, die beim ersten Versuch fehlschlagen, möglicherweise nach einem Neustart oder einem Shell-Neustart – Windows und Linux vertragen sich mit solchen Dingen nicht immer gut.

Diese Anleitung beschreibt bewährte Methoden zum Schreiben einfacherer Bash-Bedingungen. Sie lernen, wie Sie moderne Syntax wie verwenden [[ ]], Arithmetik mit (( ))für sauberere Berechnungen durchführen, mit POSIX portabel bleiben [ ]und sogar Logik mit konsolidieren case. Wenn Sie dies richtig machen, laufen Ihre Skripte grundsätzlich reibungslos und ohne Überraschungen. Besser noch: Es vermeidet frustrierende Momente, in denen Sie sich nicht sicher sind, ob es an Ihrem Code liegt oder nur an Shell-Problemen.

So beheben Sie Bash-Bedingungen, die einfach nicht richtig funktionieren

Methode 1: Schreiben if...elsemit Bash[[ ]]

Die [[ ]]Syntax ist eine Art verbesserte Version der alten [ ]. Sie ist fehlerverzeihender, verhindert versehentliche Worttrennung und Platzhalterprobleme und verhält sich generell vorhersehbarer. Sie ist ein Muss für modernes Bash-Scripting, insbesondere wenn Sie seltsame Fehler vermeiden möchten.

Hier ist ein kurzes Beispiel:

#!/usr/bin/env bash set -euo pipefail read -r -p "Enter a value: " val if [[ "$val" == "admin" ]]; then echo "Welcome, admin." else echo "Access limited." fi 

Beachten Sie, wie es ==für die Zeichenfolgenübereinstimmung verwendet wird. Setzen Sie Ihre Variablen immer in Anführungszeichen – auch wenn sie nur aus einem Wort bestehen –, um Probleme mit Leerzeichen oder leeren Zeichenfolgen zu vermeiden. Es ist eine kleine Angewohnheit, erspart aber viel Ärger.

Zeichenfolgen und Zahlen sicher vergleichen

user="alice" target="alice" if [[ "$user" == "$target" ]]; then echo "Usernames match." else echo "Usernames differ." fi # Numeric comparison: read -r -p "Enter a number: " n if [[ "$n" -gt 10 ]]; then echo "Greater than 10." elif [[ "$n" -eq 10 ]]; then echo "Equal to 10." else echo "Less than 10." fi 

Stellen Sie sicher, dass Sie die Variablen in diesen Tests in Anführungszeichen setzen, damit leere Zeichenfolgen oder Leerzeichen nichts durcheinanderbringen. Numerische Vergleiche verwenden -gt, -eq, usw., genau wie in klassischen Shell-Skripten.

Dateiexistenz und Berechtigungen

path="./data.txt" if [[ -f "$path" ]]; then echo "File exists." else echo "Creating file..." : > "$path" # creates an empty file fi 

Dies hilft zu prüfen, ob eine Datei vorhanden ist, und falls nicht, wird eine erstellt. Nützlich für Skripte, die Konfigurationen initialisieren oder Dateien verarbeiten.

Kombinieren Sie mehrere Bedingungen mit &&und||

file="./report.log" size=5 if [[ -f "$file" ]] && [[ "$size" -ge 5 ]]; then echo "Process report." fi role="staff" if [[ "$role" == "admin" || "$role" == "staff" ]]; then echo "Privileged access granted." fi 

Diese saubere Syntax verhindert Fehler, die auftreten, wenn Sie versehentlich zu viele Klammern hinzufügen oder Leerzeichen vergessen – die Shell ist diesbezüglich pingelig.

elifFür mehrere Prüfungen verwenden

status="warning" if [[ "$status" == "error" ]]; then echo "Exit immediately." exit 1 elif [[ "$status" == "warning" ]]; then echo "Log and continue." else echo "All good." fi 

Dies ist viel übersichtlicher, als eine Reihe verschachtelter ifs zu schreiben. Es trägt dazu bei, dass Ihr Skript lesbar bleibt und weniger fehleranfällig ist.

Methode 2: Rechnen Sie mit(( ))

Wenn Ihr Skript nur mit Ganzzahlen arbeitet, (( ))ist dies eine viel übersichtlichere Methode für Vergleiche und Berechnungen. Es ist übersichtlicher und schneller – und sieht außerdem eher wie normale Mathematik aus.

Beispiel für mathematische Vergleiche:

a=12 b=8 if (( a > b )); then echo "a is larger." elif (( a == b )); then echo "Equal." else echo "b is larger." fi 

Wenn Sie mehrere numerische Bedingungen haben, verketten Sie diese einfach mit &&oder ||innerhalb von (( )). Funktioniert viel besser als das Mischen von Tests:

x=7 y=3 z=10 if (( (x > y) && (z >= 10) )); then echo "Threshold met." fi 

Hinweis: Überprüfen Sie zur Eingabevalidierung immer, ob es sich bei dem, was Sie lesen, tatsächlich um eine Zahl handelt, insbesondere wenn es sich um Benutzereingaben handelt – [[ "$n" =~ ^-?[0-9]+$ ]].

Methode 3: Mit POSIX portabel bleiben[ ]

Wenn Ihr Skript in strikten POSIX-Shells oder sogar /bin/sh ausgeführt werden muss, verwenden Sie [ ]. Es ist älter, aber immer noch zuverlässig.

#!/bin/sh a="hello" b="hello" if [ "$a" = "$b" ]; then echo "Match." else echo "No match." fi # Numeric comparison: a=5 b=30 if [ "$a" -lt "$b" ]; then echo "a is less than b." fi # String lex order: x="apple" y="banana" if [ "$x" \< "$y" ]; then echo "apple comes before banana." fi 

Achten Sie darauf, Kleiner-als-Zeichen zu maskieren, wenn Sie Stringvergleiche in POSIX-Shells durchführen, da die Shell sonst verwirrt werden könnte. Es ist seltsam, aber so handhabt POSIX es.

Methode 4: Vereinfachen mit caseAnweisungen

Wenn eine einzelne Variable mehrere Werte haben kann, caseist dies eine sauberere Möglichkeit, mit Verzweigungen umzugehen, als eine Reihe von ifs.

read -r -p "Enter mode (start|stop|status): " mode case "$mode" in start) echo "Starting...";; stop) echo "Stopping...";; status) echo "Service is running.";; *) echo "Unknown mode."; exit 1;; esac 

Und für mehrere Übereinstimmungen:

level="warn" case "$level" in error|err) echo "Exit with failure."; exit 1;; warn|warning) echo "Log warning.";; info|debug) echo "Proceed normally.";; *) echo "Unrecognized level.";; esac 

Methode 5: Debuggen und Best Practices

  • Gruppieren Sie komplexe Bedingungen zur besseren Übersichtlichkeit in Klammern. Dies ist nicht zwingend erforderlich, trägt aber zur Übersichtlichkeit bei.
  • Verwenden Sie es ==für Zeichenfolgen -eqund Ganzzahlen und setzen Sie Variablen immer in Anführungszeichen.
  • Aktivieren Sie das Debuggen, set -xwenn etwas nicht funktioniert. Es zeigt dann jeden Befehl während der Ausführung an, sodass Sie erkennen können, wo das Problem liegt.
set -x # turn on tracing # your conditions here set +x # turn it off when done 
  • Behalten Sie die Konsistenz Ihrer Einrückung bei, auch wenn die Shell sich nicht darum kümmert – das erleichtert das Lesen und spätere Beheben von Fehlern.

Kurzanleitung für den Bediener

  • Zeichenfolgen: ==, !=, -n var(nicht leer), -z var(leer)
  • Zahlen: -eq, -ne, -gt, -lt, oder (( ))Syntax verwenden.
  • Dateien: -f(existiert und normale Datei), -d(Verzeichnis), -e(existiert), -x(ausführbare Datei) usw.
  • Logik: &&(und), ||(oder), !(nicht)

Zusammenfassung

Die meisten Probleme mit bedingten Bash-Skripten sind auf die Verwendung der falschen Testsyntax, fehlerhafte Operatoren oder fehlende Anführungszeichen zurückzuführen. Bleiben Sie [[ ]]für die meisten Aufgaben bei, verwenden Sie (( ))für mathematische Berechnungen und verwenden Sie [ ], wenn Sie höchste Kompatibilität benötigen. Mit etwas Debugging und Eingabevalidierung werden Ihre Skripte deutlich vorhersehbarer. Es geht nur darum, gute Gewohnheiten zu entwickeln und zu verstehen, was jeder Test im Hintergrund bewirkt.

Zusammenfassung

  • [[ ]]Für String- und Dateitests verwenden – sicherer und moderner.
  • Für Mathematik verwenden (( ))– sauberere Syntax für Ganzzahlen.
  • Um Überraschungen zu vermeiden, setzen Sie Variablen immer in Anführungszeichen.
  • caseFür mehrere Zweige basierend auf einer einzelnen Variablen verwenden.
  • Denken Sie daran, das Debugging zu aktivieren, wenn etwas schief geht ( set -x).

Hoffentlich spart dies jemandem, der versucht, seine Bash-Skripte zu debuggen, ein paar Stunden. Denn ja, Shell-Skripting kann knifflig sein – aber sobald Sie wissen, wie Sie diese Tests richtig durchführen, ist es viel weniger frustrierend.