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

Shell-Scripting Teil 3:Entscheidungskontrollstrukturen in Shell-Scripts

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önnen

Unten 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:


case in
<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


Linux
  1. Assoziative Arrays in Shell-Skripten?

  2. Richtiges Sperren in Shell-Skripten?

  3. Dateideskriptoren und Shell-Scripting?

  4. Nur verschieben, wenn die Datei in einem Shell-Skript vorhanden ist

  5. Finden Sie mithilfe des Shell-Skripts heraus, ob die Datei in HDFS vorhanden ist oder nicht

Shell-Scripting für Anfänger – So schreiben Sie Bash-Scripts unter Linux

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist

Shell-Scripting Teil 4 – Eingabe, Ausgabe und Umleitung

Shell-Scripting Schritt-für-Schritt-Tutorial

Arrays in Shell-Skripten

Was ist eine .sh-Datei?