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
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
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
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 ] # 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
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
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
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
- Fehlendes Leerzeichen:
[ "$a"="$b" ]ist falsch, die korrekte Form ist[ "$a" = "$b" ] - Variable ohne Anführungszeichen:
[ -f $file ]sollte sein[ -f "$file" ] - 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
[ "$a" -eq "$b" ] && echo "ist wahr" || echo "ist falsch"