Home → Tech Portfolio → Bash Cheat Sheet: Vergleichsoperatoren & Tests
Kennt ihr das? Ihr benötigt Befehle, Operatoren und kleine Helfer für eure tägliche Arbeit als DBA oder Infrastruktur-Administrator gerade oft genug, um zu wissen, dass es sie gibt. Die genaue Syntax habt ihr aber bis zum nächsten Einsatz schon wieder vergessen.
Mir geht es zumindest regelmäßig so. Gerade bei Bash sind es oft die kleinen Details: Wie prüfe ich nochmal, ob eine Datei existiert und nicht leer ist? Und kann ich eigentlich prüfen, ob eine Datei ein Hardlink ist?
Genau dafür habe ich mir ein kleines Bash Cheat Sheet zusammengestellt. Daraus möchte ich heute einen kleinen Auszug zum Thema Vergleichsoperatoren und Tests mit euch teilen. Kein Bash-Grundkurs, sondern eine schnelle Gedächtnisstütze für den nächsten „Wie war das nochmal?”-Moment.
Kennt ihr das? Ihr benötigt Befehle, Operatoren und kleine Helfer für eure tägliche Arbeit als DBA oder Infrastruktur-Administrator gerade oft genug, um zu wissen, dass es sie gibt. Die genaue Syntax habt ihr aber bis zum nächsten Einsatz schon wieder vergessen.
Mir geht es zumindest regelmäßig so. Gerade bei Bash sind es oft die kleinen Details: Wie prüfe ich nochmal, ob eine Datei existiert und nicht leer ist? Und kann ich eigentlich prüfen, ob eine Datei ein Hardlink ist?
Genau dafür habe ich mir ein kleines Bash Cheat Sheet zusammengestellt. Daraus möchte ich heute einen kleinen Auszug zum Thema Vergleichsoperatoren und Tests mit euch teilen. Kein Bash-Grundkurs, sondern eine schnelle Gedächtnisstütze für den nächsten „Wie war das nochmal?”-Moment.
STRING1 = STRING2 : Wahr, wenn beide Strings identisch sind. Verwendung mit dem Test-Kommando [ ... ]
STRING1 == STRING2 : Wahr, wenn beide Strings übereinstimmen. Innerhalb von [[ ... ]]
STRING1 =~ STRING2 : Wahr, wenn STRING1 zum angegebenen regulären Ausdruck (REGEX) passt
STRING1 != STRING2 : Wahr, wenn beide Strings nicht identisch sind
Beispiel: String mit regulärem Ausdruck prüfen
In dem nachfolgenden Beispiel wird der vollständige Hostname des Systems mit ‘hostname ‑f‘ ermittelt und anschließend gegen ein fest definiertes Namensschema geprüft. Erwartet wird ein Hostname nach dem Muster ‘<hostbezeichnung>-<NN>.<domain>.<tld>‘, zum Beispiel ‘postgres-01.example.com‘. Entspricht der ermittelte Hostname diesem Aufbau, wird die Prüfung erfolgreich abgeschlossen; andernfalls bricht das Skript mit einem Fehler ab.
# Vollständigen Hostnamen ermitteln
HOSTNAME="$(hostname -f)"
# Prüfen, ob der Hostname dem Schema "-.." entspricht
if [[ "${HOSTNAME}" =~ ^[[:alnum:]-]+-[0-9]{2}\.[[:alnum:]-]+\.[[:alpha:]]+$ ]]; then
echo "Hostname entspricht dem erwarteten Namensschema: ${HOSTNAME}"
else
echo "Hostname entspricht nicht dem erwarteten Namensschema: ${HOSTNAME}"
exit 1
fi
Aufschlüsselung des Regex:
^ # Anfang des Strings
[[:alnum:]-]+ # String aus Buchstaben, Ziffern und "-"
- # Trennzeichen vor der Nummer
[0-9]{2} # Genau zwei Ziffern
\. # Punkt
[[:alnum:]-]+ # Domain
\. # Punkt
[[:alpha:]]+ # TLD aus Buchstaben
$ # Ende des Strings
-eq : =
-ne : !=
-gt : >
-ge : >=
-lt : <
-le : <= Beispiel: Numerischer Vergleich – „größer oder gleich“
Vor dem Start eines Backups wird geprüft, ob auf dem Ziel-Dateisystem noch ausreichend freier Speicherplatz vorhanden ist. Der aktuell verfügbare Speicherplatz wird mit df ermittelt und anschließend mit einem definierten Mindestwert verglichen. Nur wenn der verfügbare Speicherplatz größer oder gleich dem Mindestwert ist, wird die Verarbeitung fortgesetzt.
BACKUP_DIR="/backup"
MIN_FREE_SPACE_GB=20
# Verfügbaren Speicherplatz des Backup-Dateisystems in GiB ermitteln
FREE_SPACE_GB="$(df --output=avail -BG "${BACKUP_DIR}" | tail -n 1 | tr -dc '0-9')"
# Prüfen, ob mindestens der benötigte Speicherplatz verfügbar ist
if [[ "${FREE_SPACE_GB}" -ge "${MIN_FREE_SPACE_GB}" ]]; then
echo "Ausreichend Speicherplatz vorhanden."
else
echo "Nicht ausreichend Speicherplatz vorhanden."
exit 1
fi
Der eigentliche Vergleich ist:
[[ "${FREE_SPACE_GB}" -ge "${MIN_FREE_SPACE_GB}" ]]
Dabei steht ‑ge für greater than or equal, also: <verfügbarer Speicherplatz> >= <Mindestanforderung>.
Manchmal muss ein Skript herausfinden, womit es überhaupt arbeitet. Gibt es das Backup-Verzeichnis? Existiert die Konfigurationsdatei? Ist ein Pfad ein symbolischer Link? Ist ein Socket vorhanden?
Dafür bringt Bash eine ganze Reihe fertiger Tests mit:
-d FILE # FILE ist ein Verzeichnis
-b FILE # FILE ist ein Blockgerät
-c FILE # FILE ist ein Zeichengerät
-p FILE # FILE ist eine Pipe
-h FILE # FILE ist ein symbolischer Link
-L FILE # FILE ist ein symbolischer Link
-S FILE # FILE ist ein Socket
-t DESCRIPTOR # File-Descriptor ist mit einem Terminal verbunden
Für reguläre Dateien und deren Eigenschaften sind vor allem diese Kandidaten praktisch:
-e FILE # FILE existiert
-f FILE # FILE ist eine reguläre Datei
-r FILE # FILE ist lesbar
-s FILE # FILE existiert und ist nicht leer
-w FILE # FILE ist beschreibbar
-x FILE # FILE ist ausführbar
Auch einige speziellere Dateieigenschaften lassen sich direkt abfragen:
-g FILE # Set-GID-Bit (SGID) ist gesetzt
-u FILE # Set-UID-Bit (SUID) ist gesetzt
-k FILE # Sticky-Bit ist gesetzt
-O FILE # FILE gehört dem aktuellen Benutzer
-G FILE # FILE gehört zur effektiven Gruppe
-N FILE # FILE wurde seit dem letzten Lesen verändert
Gerade wenn Skripte mit unterschiedlichen Benutzern oder Berechtigungen laufen, können solche Checks helfen, Voraussetzungen frühzeitig zu überprüfen, statt erst beim eigentlichen Befehl in einen Fehler zu laufen.
Eine weitere kleine, aber nicht ganz triviale Prüfung, um beispielsweise einen fehlenden Datenbanknamen abzufangen:
-z STRING # STRING ist leer
-n STRING # STRING ist nicht leer
Gerade bei Skripten, die Werte über Parameter oder Umgebungsvariablen erhalten, ist das schnell eingebaut und verhindert, dass mit unvollständigen Angaben weitergearbeitet wird.
Auch Dateien lassen sich direkt anhand ihres Änderungszeitpunkts vergleichen:
FILE1 -nt FILE2 # FILE1 ist neuer als FILE2
FILE1 -ot FILE2 # FILE1 ist älter als FILE2
So lässt sich ohne zusätzlichen stat-Aufruf entscheiden, ob ein weiterer Verarbeitungsschritt notwendig ist.
Natürlich ist das nur ein Ausschnitt dessen, was sich mit Bash abbilden lässt. Aber genau diese Vergleiche und Tests tauchen im Admin-Alltag eben ab und zu mal wieder auf: Werte vergleichen, Schwellwerte prüfen, Dateien und Verzeichnisse validieren oder sicherstellen, dass die Voraussetzungen für den nächsten Schritt stimmen.
Die Herausforderung ist dabei oft gar nicht, wie sich eine bestimmte Prüfung umsetzen lässt. Vielmehr muss man erst einmal wissen – oder sich daran erinnern –, was Bash bereits von Haus aus mitbringt. Bevor man also selbst einen umständlichen Test baut, lohnt sich manchmal ein kurzer Blick auf die vorhandenen Operatoren. Genau dafür ist dieses Cheat Sheet gedacht: nicht zum Bash-Lernen von null an, sondern als Gedächtnisstütze, wenn die Lösung eigentlich bekannt ist – nur die verdammte Syntax gerade nicht mehr.
Im nächsten Teil geht es dann um String-Manipulation und Variablen – also unter anderem darum, Dateinamen und Pfade direkt mit Bash-Bordmitteln auseinanderzunehmen, Default-Werte zu setzen und mit Bash-Sondervariablen zu arbeiten.
Hier findest du weitere » Cheat Sheets die dir das Leben als Linux-Admin leichter machen.
Share this article
Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenSie müssen den Inhalt von reCAPTCHA laden, um das Formular abzuschicken. Bitte beachten Sie, dass dabei Daten mit Drittanbietern ausgetauscht werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von Facebook. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen