Machen wir unsere Bash-Skripte intelligent!
In diesem Teil der Bash-Einsteigerserie lernen Sie, wie Sie bedingte Anweisungen in Ihren Bash-Skripten verwenden, damit sie sich in verschiedenen Szenarien und Fällen unterschiedlich verhalten.
Auf diese Weise können Sie viel effizientere Bash-Skripte erstellen und auch eine Fehlerprüfung in Ihre Skripte implementieren.
If-Anweisung in Bash verwenden
Das grundlegendste Konstrukt in jeder Entscheidungsfindungsstruktur ist eine if-Bedingung. Die allgemeine Syntax einer einfachen if-Anweisung lautet wie folgt:
if [ condition ]; then
your code
fi
Der if
Anweisung wird mit einem fi
abgeschlossen (Umkehrung von if).
Achten Sie auf Leerraum!
- Zwischen der öffnenden und schließenden Klammer und der eingegebenen Bedingung muss ein Leerzeichen stehen. Andernfalls wird sich die Shell über einen Fehler beschweren.
- Vor und nach dem Bedingungsoperator muss ein Leerzeichen stehen (=, ==, <=usw.). Andernfalls sehen Sie einen Fehler wie "unärer Operator erwartet".
Lassen Sie uns nun ein Beispielskript root.sh erstellen. Dieses Skript gibt die Aussage „Sie sind Root“ nur dann wieder, wenn Sie das Skript als Root-Benutzer ausführen:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
fi
Das whoami
Befehl gibt den Benutzernamen aus. Aus dem Bash-Variablen-Tutorial kennen Sie diesen $(command)
Syntax wird für die Befehlsersetzung verwendet und gibt Ihnen die Ausgabe des Befehls.
Die Bedingung $(whoami) = 'root'
gilt nur, wenn Sie als Root-Benutzer angemeldet sind.
Glauben Sie mir nicht? Das müssen Sie nicht. Führen Sie es aus und überzeugen Sie sich selbst.
If-else-Anweisung in Bash verwenden
Sie haben vielleicht bemerkt, dass Sie keine Ausgabe erhalten, wenn Sie root.sh ausführen Skript als normaler Benutzer. Jeglicher Code, den Sie ausführen möchten, wenn eine if-Bedingung als falsch ausgewertet wird, kann wie folgt in eine else-Anweisung eingefügt werden:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Wenn Sie das Skript jetzt als normaler Benutzer ausführen, werden Sie daran erinnert, dass Sie nicht der allmächtige Root-Benutzer sind:
[email protected]:~$ ./root.sh
You are not root
Use-else-if-Anweisung in Bash
Sie können eine elif-Anweisung (else-if) immer dann verwenden, wenn Sie mehr als einen Ausdruck (Bedingung) gleichzeitig testen möchten.
Zum Beispiel die folgende age.sh bash-Skript nimmt Ihr Alter als Argument und gibt eine sinnvolle Nachricht aus, die Ihrem Alter entspricht:
#!/bin/bash
AGE=$1
if [ $AGE -lt 13 ]; then
echo "You are a kid."
elif [ $AGE -lt 20 ]; then
echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
echo "You are an adult."
else
echo "You are an elder."
fi
Führen Sie nun einige Durchläufe von age.sh durch Skript zum Testen mit verschiedenen Altersgruppen:
[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.
Beachten Sie, dass ich den -lt
verwendet habe (kleiner als) Testbedingung mit der $AGE-Variablen.
Beachten Sie auch, dass Sie mehrere elif
haben können Anweisungen, aber nur ein else
-Anweisung in einem if-Konstrukt und muss mit einem fi
abgeschlossen werden .
Verwendung von verschachtelten if-Anweisungen in Bash
Sie können eine if-Anweisung auch innerhalb einer anderen if-Anweisung verwenden. Sehen Sie sich zum Beispiel die folgende Datei weather.sh an Bash-Skript:
#!/bin/bash
TEMP=$1
if [ $TEMP -gt 5 ]; then
if [ $TEMP -lt 15 ]; then
echo "The weather is cold."
elif [ $TEMP -lt 25 ]; then
echo "The weather is nice."
else
echo "The weather is hot."
fi
else
echo "It's freezing outside ..."
fi
Das Skript nimmt eine beliebige Temperatur als Argument und zeigt dann eine Nachricht an, die widerspiegelt, wie das Wetter sein würde. Wenn die Temperatur größer als fünf ist, wird die verschachtelte (innere) if-elif-Anweisung ausgewertet. Lassen Sie uns das Skript ein paar Mal ausführen, um zu sehen, wie es funktioniert:
[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.
Case-Anweisung in Bash verwenden
Sie können in Bash auch case-Anweisungen verwenden, um mehrere if-Anweisungen zu ersetzen, da sie manchmal verwirrend und schwer zu lesen sind. Die allgemeine Syntax eines Case-Konstrukts lautet wie folgt:
case "variable" in
"pattern1" )
Command … ;;
"pattern2" )
Command … ;;
"pattern2" )
Command … ;;
esac
Achtung!
- Den Mustern folgt immer ein Leerzeichen und
)
. - Auf Befehle folgt immer ein doppeltes Semikolon
;;
. Leerzeichen davor sind nicht obligatorisch. - Case-Anweisungen enden mit
esac
(umgekehrt).
Case-Anweisungen sind besonders nützlich, wenn es um Mustererkennung oder reguläre Ausdrücke geht. Sehen Sie sich zur Demonstration die folgende char.sh an Bash-Skript:
#!/bin/bash
CHAR=$1
case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac
Das Skript nimmt ein Zeichen als Argument und zeigt an, ob es sich bei dem Zeichen um ein kleines/großes Alphabet, eine Zahl oder ein Sonderzeichen handelt.
[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.
Beachten Sie, dass ich das Platzhalter-Sternchen-Symbol (*) verwendet habe, um den Standardfall zu definieren, der das Äquivalent einer else-Anweisung in einer if-Bedingung ist.
Testbedingungen in bash
Es gibt zahlreiche Testbedingungen, die Sie mit if-Anweisungen verwenden können. Die Testbedingungen variieren je nachdem, ob Sie mit Zahlen, Zeichenfolgen oder Dateien arbeiten. Betrachten Sie sie als logische Operatoren in Bash.
Ich habe einige der beliebtesten Testbedingungen in die folgende Tabelle aufgenommen:
Bedingung | Äquivalent |
---|---|
$a -lt $b | $a <$b |
$a -gt $b | $a> $b |
$a -le $b | $a <=$b |
$a -ge $b | $a>=$b |
$a -eq $b | $a ist gleich $b |
$a -ne $b | $a ist nicht gleich $b |
-e $DATEI | $FILE existiert |
-d $DATEI | $FILE existiert und ist ein Verzeichnis. |
-f $DATEI | $FILE existiert und ist eine normale Datei. |
-L $DATEI | $FILE existiert und ist ein Softlink. |
$STRING1 =$STRING2 | $STRING1 ist gleich $STRING2 |
$STRING1 !=$STRING2 | $STRING1 ist nicht gleich $STRING2 |
-z $STRING1 | $STRING1 ist leer |
Glücklicherweise müssen Sie sich keine der Testbedingungen merken, da Sie sie auf der Test-Manpage nachschlagen können:
[email protected]:~$ man test
Lassen Sie uns ein letztes Skript mit dem Namen filetype.sh erstellen das erkennt, ob eine Datei eine normale Datei, ein Verzeichnis oder ein Softlink ist:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Error: Invalid number of arguments"
exit 1
fi
file=$1
if [ -f $file ]; then
echo "$file is a regular file."
elif [ -L $file ]; then
echo "$file is a soft link."
elif [ -d $file ]; then
echo "$file is a directory."
else
echo "$file does not exist"
fi
Ich habe das Skript ein wenig verbessert, indem ich eine Überprüfung der Anzahl der Argumente hinzugefügt habe. Wenn es keine Argumente oder mehr als ein Argument gibt, gibt das Skript eine Nachricht aus und beendet sich, ohne die restlichen Anweisungen im Skript auszuführen.
Lassen Sie uns das Skript ein paar Mal ausführen, um es mit verschiedenen Dateitypen zu testen:
[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh
Error: Invalid number of arguments
Bonus:Bash if else-Anweisung in einer Zeile
Bisher wurden alle if else-Anweisungen, die Sie gesehen haben, in einem richtigen Bash-Skript verwendet. Das ist die anständige Art, aber Sie sind nicht dazu verpflichtet.
Wenn Sie nur das Ergebnis in der Shell selbst sehen möchten, können Sie die if else-Anweisungen in einer einzelnen Zeile in Bash verwenden.
Angenommen, Sie haben dieses Bash-Skript.
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Sie können alle if else-Anweisungen wie folgt in einer einzigen Zeile verwenden:
if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi
Sie können das Obige kopieren und im Terminal einfügen und sich das Ergebnis selbst ansehen.
Im Grunde fügen Sie einfach Semikolons nach den Befehlen hinzu und fügen dann die nächste if-else-Anweisung hinzu.
Fantastisch! Dies sollte Ihnen ein gutes Verständnis der bedingten Anweisungen in Bash vermitteln. Ich hoffe, es hat Ihnen Spaß gemacht, Ihre Bash-Skripte intelligenter zu machen!
Sie können Ihr neu erlerntes Wissen testen, indem Sie einige einfache Bash-Übungen im folgenden PDF durchführen. Es enthält auch die Lösung.
Bash-Kapitel-7-ÜbungsfragenProbleme und deren Lösung, um zu üben, was Sie gerade in diesem Kapitel gelernt habenBash-Kapitel-7-Übungsfragen-Linux-Handbuch.pdf31 KB
Bleiben Sie dran für nächste Woche, da Sie lernen werden, verschiedene Schleifenkonstrukte in Ihren Bash-Skripten zu verwenden.