Shell test-Befehl

testDer Befehl ist ein in die Shell integriertes Werkzeug zur bedingten Prüfung, das Ausdrücke auswertet und einen booleschen Wert (true/false) zurückgibt. Er wird normalerweise mitifAnweisungen und bildet die Grundlage für die Implementierung logischer Steuerung in Shell-Skripten.

Der Befehl test in der Shell wird verwendet, um zu prüfen, ob eine Bedingung zutrifft. Er kann Tests in drei Bereichen durchführen: numerische Werte, Zeichenketten und Dateien.

Syntaxformat

test EXPRESSION
# oder 
[ EXPRESSION ]  # 注意方括号内必须有空格

Dateitest-Operationen

testDer Befehl wird am häufigsten verwendet, um Dateiattribute zu prüfen. Nachfolgend sind gängige Dateitest-Optionen aufgeführt:

Operator Beschreibung Beispiel
-e Datei existiert [ -e file.txt ]
-f Ist eine reguläre Datei [ -f /path/to/file ]
-d Ist ein Verzeichnis [ -d /path/to/dir ]
-r Lesbar [ -r file.txt ]
-w Beschreibbar [ -w file.txt ]
-x Ausführbar [ -x script.sh ]
-s Dateigröße > 0 [ -s logfile ]
-L Ist ein symbolischer Link [ -L symlink ]

Beispielskript:

Beispiele

#!/bin/bash

file="/etc/passwd"

if [ -e "$file" ]; then
    echo "$fileexistiert"
    if [ -r "$file" ]; then
        echo "und ist lesbar"
    fi
else
    echo "$fileexistiert nicht"
fi

Das Ausgabeergebnis ist:

/etc/passwd 存在
并且可读

String-Vergleich

testBietet mehrere Methoden zum Zeichenkettenvergleich:

Operator Beschreibung Beispiel
-z STRING Zeichenkette ist [ -z "$var" ]
-n STRING Zeichenkette ist nicht leer [ -n "$var" ]
STRING1 = STRING2 Zeichenketten sind gleich [ "$var1" = "$var2" ]
STRING1 != STRING2 Zeichenketten sind nicht gleich [ "$var1" != "$var2" ]

Wichtiger Hinweis: String-Variablen sollten immer in doppelte Anführungszeichen gesetzt werden, um zu verhindern, dass leere Variablen Syntaxfehler verursachen.

Beispiel:

Beispiele

#!/bin/bash

read -p "Benutzername eingeben: " username

if [ -z "$username" ]; then
    echo "Fehler: Der Benutzername darf nicht leer sein"
    exit 1
elif [ "$username" = "root" ]; then
    echo "Warnung: Die Verwendung des root-Kontos wird nicht empfohlen"
else
    echo "Willkommen,$username"
fi

Nach der Ausführung geben wir example im Terminal ein, und die Ausgabe sieht in etwa wie folgt aus:

输入用户名: example
欢迎, example

Numerischer Vergleich

Für numerische Vergleiche,testwerden verschiedene Operatoren verwendet:

Operator Beschreibung Beispiel
-eq Gleich [ "$a" -eq "$b" ]
-ne Ungleich [ "$a" -ne "$b" ]
-gt Größer als [ "$a" -gt "$b" ]
-ge Größer als oder gleich [ "$a" -ge "$b" ]
-lt Kleiner als [ "$a" -lt "$b" ]
-le Kleiner als oder gleich [ "$a" -le "$b" ]

Beispiel:

Beispiele

#!/bin/bash

read -p "Geben Sie das Alter ein: " age

if [ "$age" -lt 0 ]; then
    echo "Das Alter darf nicht negativ sein"
elif [ "$age" -lt 18 ]; then
    echo "Minderjähriger"
elif [ "$age" -ge 18 ] && [ "$age" -lt 60 ]; then
    echo "Erwachsener"
else
    echo "Senior"
fi

Nach der Ausführung geben wir 12 im Terminal ein, und die Ausgabe ähnelt der folgenden:

输入年龄: 12
未成年人

Logische Operatoren

testUnterstützt logische Verknüpfungen:

Operator Beschreibung Beispiel
! Logisches NICHT [ ! -f "$file" ]
-a Logisches AND [ "$a" -eq 1 -a "$b" -eq 2 ]
-o Logisches OR [ "$a" -eq 1 -o "$b" -eq 2 ]

Moderne empfohlene Syntax: Verwenden Sie&&und||anstelle von-aund-o, die POSIX-konformer ist:

Beispiele

[ "$a" -eq 1 ] && [ "$b" -eq 2 ]  # UND
[ "$a" -eq 1 ] || [ "$b" -eq 2 ]  # ODER

Erweiterte Verwendung: [[ ]] und (( ))

Bash bietet eine leistungsfähigere Test-Syntax:

Doppelte eckige Klammern [[ ]]

  • Unterstützt Musterabgleich:[[ "$var" == *.txt ]]
  • Unterstützt reguläre Ausdrücke:[[ "$var" =~ ^[0-9]+$ ]]
  • Sicherere Zeichenkettenverarbeitung

Arithmetischer Vergleich (( ))

  • Speziell für numerische Vergleiche entwickelt:(( a > b ))
  • Unterstützt komplexere arithmetische Ausdrücke

Beispiel:

Beispiele

if [[ "$file" == *.log ]]; dann
    echo "Dies ist eine Logdatei"
fi

if (( $count > 10 )); then
    echo "Die Anzahl überschreitet 10"
fi

Praktische Anwendungsbeispiele

1. Prüfen, ob ein Dienst läuft

Beispiele

#!/bin/bash

service="nginx"

if systemctl is-active --quiet "$service"; then
    echo "$service"läuft"
else
    echo "$service"läuft nicht"
    # Hier kann ein Befehl zum Starten des Dienstes hinzugefügt werden
fi

2. Überprüfung der Backup-Datei

Beispiele

#!/bin/bash

backup_file="/backups/data_$(date +%Y%m%d).tar.gz"

if [ ! -f "$backup_file" ]; then
    echo "Fehler: Backup-Datei$backup_fileexistiert nicht"
    exit 1
elif [ ! -s "$backup_file" ]; then
    echo "Warnung: Backup-Datei ist leer"
else
    echo "Backup-Überprüfung erfolgreich"
fi

Häufige Fehler und Debugging-Tipps

  1. Fehlendes Leerzeichen:[ "$a"="$b" ]ist falsch, die korrekte Form ist[ "$a" = "$b" ]
  2. Variable ohne Anführungszeichen:[ -f $file ]sollte sein[ -f "$file" ]
  3. Verwechslung von Zeichenketten- und numerischem Vergleich: Verwenden Sie=zum Vergleichen von Zeichenketten,-eqzum Vergleichen numerischer Werte

Debugging-Tipp: Fügen Sie am Anfang des Skripts hinzuset -xum den Debug-Modus zu aktivieren, oder verwenden Sieechoum den Testausdruck auszugeben:

Beispiele

echo "Testausdruck: [$a -eq $b ]"
[ "$a" -eq "$b" ] && echo "ist wahr" || echo "ist falsch"
Andere Erweiterungen