GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Anfängerserie Nr. 7:Entscheidungsfindung mit If Else- und Case-Anweisungen

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.


Linux
  1. Computer mit Linux zugänglicher und nachhaltiger machen

  2. Programmieren mit Bash:Syntax und Tools

  3. Bash-Anfängerserie Nr. 9:Verwenden von Funktionen in Bash

  4. Bash-Anfängerserie Nr. 8:Schleifen in Bash

  5. Verwenden von Case-Anweisungen in Bash

Bash-Anfängerserie Nr. 5:Verwenden von arithmetischen Operatoren in Bash-Skripten

Bash-Anfängerserie Nr. 4:Verwenden von Arrays in Bash

Bash-Anfängerserie Nr. 3:Übergabe von Argumenten an Bash-Skripte

Bash-Anfängerserie Nr. 6:Zeichenfolgenoperationen in Bash

Bash-Anfängerserie Nr. 10:Automatisierung mit Bash

Bash If Else und andere bedingte Anweisungen verstehen