News zu Tech Portfolio

Bash Cheat Sheet: Ver­gleichs­ope­ra­to­ren & Tests

Headergrafik Cheat Sheet Bash - Vergleiche, Tests

Kennt ihr das? Ihr benötigt Befehle, Ope­ra­to­ren und kleine Helfer für eure tägliche Arbeit als DBA oder In­fra­struk­tur-Ad­mi­nis­tra­tor 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 re­gel­mä­ß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 ei­gent­lich prüfen, ob eine Datei ein Hardlink ist?

Genau dafür habe ich mir ein kleines Bash Cheat Sheet zu­sam­men­ge­stellt. Daraus möchte ich heute einen kleinen Auszug zum Thema Ver­gleichs­ope­ra­to­ren und Tests mit euch teilen. Kein Bash-Grundkurs, sondern eine schnelle Ge­dächt­nis­stüt­ze für den nächsten „Wie war das nochmal?”-Moment.

Profilbild Michael
Michael Decker
In­fra­struk­tur Ad­mi­nis­tra­tor
ASPICON

Kennt ihr das? Ihr benötigt Befehle, Ope­ra­to­ren und kleine Helfer für eure tägliche Arbeit als DBA oder In­fra­struk­tur-Ad­mi­nis­tra­tor 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 re­gel­mä­ß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 ei­gent­lich prüfen, ob eine Datei ein Hardlink ist?

Genau dafür habe ich mir ein kleines Bash Cheat Sheet zu­sam­men­ge­stellt. Daraus möchte ich heute einen kleinen Auszug zum Thema Ver­gleichs­ope­ra­to­ren und Tests mit euch teilen. Kein Bash-Grundkurs, sondern eine schnelle Ge­dächt­nis­stüt­ze für den nächsten „Wie war das nochmal?”-Moment.

Profilbild Michael
Michael Decker
In­fra­struk­tur Ad­mi­nis­tra­tor
ASPICON

Vergleich von Strings

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 nach­fol­gen­den Beispiel wird der voll­stän­di­ge Hostname des Systems mit ‘hostname ‑f‘ ermittelt und an­schlie­ßend gegen ein fest de­fi­nier­tes Na­mens­sche­ma geprüft. Erwartet wird ein Hostname nach dem Muster ‘<hostbezeichnung>-<NN>.<domain>.<tld>‘, zum Beispiel ‘postgres-01.example.com‘. Ent­spricht der er­mit­tel­te Hostname diesem Aufbau, wird die Prüfung er­folg­reich ab­ge­schlos­sen; an­dern­falls 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

Auf­schlüs­se­lung 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

Vergleich von Zahlen

-eq :    =
-ne :    !=
-gt :    >
-ge :    >=
-lt :    <
-le :    <=

Beispiel: Nu­me­ri­scher Vergleich – „größer oder gleich“

Vor dem Start eines Backups wird geprüft, ob auf dem Ziel-Da­tei­sys­tem noch aus­rei­chend freier Spei­cher­platz vorhanden ist. Der aktuell ver­füg­ba­re Spei­cher­platz wird mit df ermittelt und an­schlie­ßend mit einem de­fi­nier­ten Min­dest­wert ver­gli­chen. Nur wenn der ver­füg­ba­re Spei­cher­platz größer oder gleich dem Min­dest­wert ist, wird die Ver­ar­bei­tung 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 ei­gent­li­che Vergleich ist:

[[ "${FREE_SPACE_GB}" -ge "${MIN_FREE_SPACE_GB}" ]]

Dabei steht ‑ge für greater than or equal, also: <ver­füg­ba­rer Spei­cher­platz> >= <Min­dest­an­for­de­rung>.

Dateien, Ver­zeich­nis­se & Co. testen

Manchmal muss ein Skript her­aus­fin­den, womit es überhaupt arbeitet. Gibt es das Backup-Ver­zeich­nis? Existiert die Kon­fi­gu­ra­ti­ons­da­tei? Ist ein Pfad ein sym­bo­li­scher 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 Ei­gen­schaf­ten sind vor allem diese Kan­di­da­ten 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

Rechte und Besitzer prüfen

Auch einige spe­zi­el­le­re Da­tei­ei­gen­schaf­ten 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 un­ter­schied­li­chen Benutzern oder Be­rech­ti­gun­gen laufen, können solche Checks helfen, Vor­aus­set­zun­gen früh­zei­tig zu über­prü­fen, statt erst beim ei­gent­li­chen Befehl in einen Fehler zu laufen.

Leere Strings erkennen

Eine weitere kleine, aber nicht ganz triviale Prüfung, um bei­spiels­wei­se einen fehlenden Da­ten­bank­na­men abzufangen:

-z STRING      # STRING ist leer
-n STRING      # STRING ist nicht leer

Gerade bei Skripten, die Werte über Parameter oder Um­ge­bungs­va­ria­blen erhalten, ist das schnell eingebaut und ver­hin­dert, dass mit un­voll­stän­di­gen Angaben wei­ter­ge­ar­bei­tet wird.

Welche Datei ist neuer?

Auch Dateien lassen sich direkt anhand ihres Än­de­rungs­zeit­punkts vergleichen:

FILE1 -nt FILE2     # FILE1 ist neuer als FILE2
FILE1 -ot FILE2     # FILE1 ist älter als FILE2

So lässt sich ohne zu­sätz­li­chen stat-Aufruf ent­schei­den, ob ein weiterer Ver­ar­bei­tungs­schritt notwendig ist.

Für den nächsten „Wie war das nochmal?“-Moment

Natürlich ist das nur ein Aus­schnitt dessen, was sich mit Bash abbilden lässt. Aber genau diese Ver­glei­che und Tests tauchen im Admin-Alltag eben ab und zu mal wieder auf: Werte ver­glei­chen, Schwell­wer­te prüfen, Dateien und Ver­zeich­nis­se va­li­die­ren oder si­cher­stel­len, dass die Vor­aus­set­zun­gen für den nächsten Schritt stimmen.

Die Her­aus­for­de­rung 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 um­ständ­li­chen Test baut, lohnt sich manchmal ein kurzer Blick auf die vor­han­de­nen Ope­ra­to­ren. Genau dafür ist dieses Cheat Sheet gedacht: nicht zum Bash-Lernen von null an, sondern als Ge­dächt­nis­stüt­ze, wenn die Lösung ei­gent­lich bekannt ist – nur die verdammte Syntax gerade nicht mehr.

Im nächsten Teil geht es dann um String-Ma­ni­pu­la­ti­on und Variablen – also unter anderem darum, Da­tei­na­men und Pfade direkt mit Bash-Bord­mit­teln aus­ein­an­der­zu­neh­men, Default-Werte zu setzen und mit Bash-Son­der­va­ria­blen zu arbeiten.

Hier findest du weitere » Cheat Sheets die dir das Leben als Linux-Admin leichter machen.

icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email