Hi! Wir haben bereits die Grundlagen des Shell-Skriptings behandelt, wie das Akzeptieren von Eingaben, das Verarbeiten von Daten durch arithmetische Operationen und das Generieren und Anzeigen von Ausgaben in den vorherigen Teilen dieses Tutorials (Teil 1 und Teil 2). In diesem Teil werden wir tiefer auf ein fortgeschritteneres Thema in einer Programmiersprache eingehen – Entscheidungen in einem Programm treffen, aber dieses Mal werden wir es mit der Bash-Shell tun. Fangen wir an!
Einführung
Die meisten unserer heutigen Programmiersprachen sind in der Lage, Entscheidungen auf der Grundlage von Bedingungen zu treffen, die wir festlegen. Eine Bedingung ist ein Ausdruck, der zu einem booleschen Wert ausgewertet wird – wahr oder falsch. Jeder Programmierer kann sein Programm intelligent machen, basierend auf der Entscheidung und Logik, die er in sein Programm einfügt. Die Bash-Shell unterstützt if- und switch-Entscheidungsanweisungen (Case).
If-Anweisung
If ist eine Anweisung, die es dem Programmierer ermöglicht, eine Entscheidung im Programm auf der Grundlage von Bedingungen zu treffen, die er angegeben hat. Wenn die Bedingung erfüllt ist, führt das Programm bestimmte Codezeilen aus, andernfalls führt das Programm andere vom Programmierer angegebene Aufgaben aus. Das Folgende ist die unterstützte Syntax der if-Anweisung in der Bash-Shell.
Allgemeine Syntax
Einzelentscheidung:
if <condition>
then
### series of code goes here
fi
Doppelte Entscheidung:
if <condition>
then
### series of code if the condition is satisfied
else
### series of code if the condition is not satisfied
fi
Mehrfache if-Bedingung:
if <condition1>
then
### series of code for condition1
elif <condition2>
then
### series of code for condition2
else
### series of code if the condition is not satisfied
fi
Syntax mit einzelnen Klammern
if [ condition ]
then
### series of code goes here
fi
Syntax mit doppelten Klammern
if ((condition))
then
### series of code goes here
fi
Die Syntax mit einzelnen Klammern ist die älteste unterstützte Syntax in der Bash-Shell. Es wird zusammen mit allen bedingten Anweisungen in Linux verwendet. In der Zwischenzeit wird die Syntax mit doppelten Klammern für eine auf Zahlen basierende bedingte Anweisung verwendet, um Programmierern eine vertraute Syntax bereitzustellen. Alle Arten von if-Anweisungen benötigen eine bestimmte Bedingung, um eine Aufgabe auszuführen.
Bedingte Anweisungen in Linux
Bedingte Anweisungen werden zusammen mit einer Entscheidungssteuerungsanweisung verwendet. Es gibt verschiedene Arten von Bedingungsanweisungen, die Sie in der Bash-Shell verwenden können. Die häufigsten sind:dateibasierte, stringbasierte und arithmetische Bedingungen.
Dateibasierte Bedingung
Dateibasierte Bedingungen sind unäre Ausdrücke und werden häufig verwendet, um den Status einer Datei zu untersuchen. Die folgende Liste zeigt die am häufigsten verwendeten dateibasierten Bedingungen in der Bash-Shell.
Operator | Beschreibung |
-eine Datei | Gibt wahr zurück, wenn die Datei existiert |
-b-Datei | Gibt wahr zurück, wenn die Datei existiert und eine blockspezifische Datei ist |
-c-Datei | Gibt wahr zurück, wenn die Datei existiert und eine spezielle Zeichendatei ist |
-d-Datei | Gibt wahr zurück, wenn die Datei existiert und ein Verzeichnis ist |
-e-Datei | Gibt wahr zurück, wenn die Datei existiert |
-r-Datei | Gibt wahr zurück, wenn die Datei existiert und lesbar ist |
-s-Datei | Gibt wahr zurück, wenn die Datei existiert und größer als null ist |
-s-Datei | Gibt wahr zurück, wenn die Datei existiert und größer als null ist |
-w-Datei | Gibt wahr zurück, wenn die Datei existiert und beschreibbar ist |
-x-Datei | Gibt wahr zurück, wenn die Datei existiert und ausführbar ist |
-N-Datei | Gibt wahr zurück, wenn die Datei existiert und seit dem letzten Lesen geändert wurde |
Eine dateibasierte Entscheidung treffen
Sehen wir uns ein Beispiel an, das veranschaulicht, wie eine dateibasierte Entscheidung in einem Bash-Skript erstellt wird. In diesem Beispiel erstellen wir ein Skript, das feststellt, ob die Datei im Home-Verzeichnis vorhanden ist.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "file exists!"
else
echo "file does not exist"
fi
In diesem Beispiel haben wir mit dem cd-Befehl sichergestellt, dass die Shell unabhängig von unserem aktuellen aktiven Verzeichnis zum Home-Verzeichnis zurückkehrt. Darüber hinaus wird der Befehl ls verwendet, um die Liste der Dateien im Verzeichnis anzuzeigen, damit wir überprüfen können, ob die Datei wirklich existiert oder nicht. Wie Sie sehen können, gibt das Skript den Text „Datei existiert!“ aus. weil die sample.sh im Home-Verzeichnis liegt.
Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.
Lassen Sie uns nun unser Skript verbessern, indem wir unseren Code dynamischer gestalten, indem wir dem Benutzer erlauben, einen Skriptnamen einzugeben und die Berechtigungen der gegebenen Datei festzulegen.
#!/bin/bash
cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
echo "file exists!"
if [ -r $filename ]
then
status="readable "
fi
if [ -w $filename ]
then
status=$status"writable "
fi
if [ -x $filename ]
then
status=$status"executable"
fi
echo "file permission: "$status
else
echo "file does not exist"
fi
String-basierte Bedingung
Das Treffen von Entscheidungen basierend auf einer Zeichenfolgen-Benutzereingabe ist auch in der Bash-Shell möglich. Die Zeichenfolgen-basierte Bedingung gibt als Ergebnis einen binären Ausdruck zurück, Bedeutung, sie gibt wahr zurück, wenn die angegebene Bedingung erfüllt ist, andernfalls gibt sie falsch zurück. Im Folgenden finden Sie die häufig verwendeten Zeichenfolgen-basierten Bedingungsoperatoren:
Operator | Beschreibung |
== | Gibt wahr zurück, wenn die Zeichenketten gleich sind |
!= | Gibt wahr zurück, wenn die Zeichenfolgen nicht gleich sind |
-n | Gibt true zurück, wenn der zu testende String nicht null ist |
-z | Gibt wahr zurück, wenn der zu testende String null ist |
Lassen Sie uns ein Beispielskript mit einer zeichenfolgenbasierten bedingten Anweisung erstellen. Das Skript ermöglicht es dem Benutzer, zwei Zeichenfolgen einzugeben und zu beurteilen, ob eine der Zeichenfolgen null ist, ob beide Zeichenfolgen gleich oder nicht gleich sind.
#!/bin/bash
read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
echo "The 1st string is null"
elif [ -z "$str2" ]
then
echo "The 2nd string is null"
else
if [ $str1 == $str2 ]
then
echo "The strings are equal"
else
echo "The strings are not equal"
fi
fi
Arithmetikbasierte Bedingung
Die Shell bietet mehrere Möglichkeiten zum Deklarieren einer arithmetisch basierten Bedingung. Das erste ist die Verwendung von Mnemoniken, die zusammen mit der alten Syntax mit einzelnen Klammern verwendet werden können, und das andere verwendet mathematikfreundliche Symbole, die zusammen mit der doppelten Klammer
verwendet werden könnenUnten ist die Liste der verfügbaren Mnemoniken für arithmetisch basierte bedingte Anweisungen in der Shell:
Operator | Verwendung/Beschreibung |
-eq | Gleich |
-ge | Größer als oder gleich |
-gt | Größer als |
-le | Kleiner als oder gleich |
-lt | Kleiner als |
-ne | Nicht gleich |
Lassen Sie uns ein Skript erstellen, das eine Ganzzahl vom Benutzer akzeptiert und bestimmt, ob die Ganzzahl eine Null, eine negative, eine ungerade oder eine gerade Zahl ist.
#!/bin/bash
read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
echo "Zero"
elif [ $int1 -lt 0 ]
then
echo "Negative"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Even"
else
echo "Odd"
fi
fi
Arithmetischer Operator für Syntax mit doppelten Klammern:
Operator | Verwendung/Beschreibung |
== | Gleich |
>= | Größer als oder gleich |
> | Größer als |
<= | Kleiner als oder gleich |
< | Kleiner als |
!= | Nicht gleich |
Lassen Sie uns nun unser vorheriges Skript rekonstruieren und die Syntax mit doppelten Klammern verwenden:
#!/bin/bash
read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
echo "Zero"
elif (( $int1 < 0 ))
then
echo "Negative"
else
if (( $((int1%2)) == 0 ))
then
echo "Even"
else
echo "Odd"
fi
fi
Switch-Anweisung
Die switch-Anweisung ist eine andere Art von bedingter Anweisung im Shell-Skripting. Es ermöglicht einem Programmierer, mehrere Werte auf einfachere Weise mit einer Variablen zu vergleichen als mit einer if-bedingten Anweisung. Die Syntax für die switch-Anweisung lautet:
casein
<pattern1>)
##series of code for pattern1
;;
<pattern2>)
##series of code for pattern2
;;
<patternN>)
##series of code for patternN
;;
*)
##default statements
esac
Das Muster ist der mögliche Wert der Variablen. Jedes Muster wird durch ein doppeltes Semikolon getrennt, das als Break-Statement des Musters dient. Die switch-Anweisung wird mit einer esac-Anweisung abgeschlossen.
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Invalid input"
esac
echo "The result is: " $res
Schlussfolgerung
Die Bash-Shell bietet viele nützliche Tools für Programmierer. Wie die meisten heutigen Programmiersprachen ist es auch in der Lage, bedingte Entscheidungen zu treffen, die Shell-Skripte interaktiver und intelligenter machen. Wir werden in der nächsten Serie eine sich wiederholende Kontrollstruktur vorstellen. 'Bis zum nächsten Mal.
Referenzen
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
Die nächste Lektion: Wiederholungskontrollstrukturen