Shell-Ablaufsteuerung

Anders als in Sprachen wie Java und PHP darf die Ablaufsteuerung in sh nicht leer sein. Zum Beispiel (das Folgende ist PHP-Ablaufsteuerungssyntax):

Beispiel

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // Nichts tun
}

In sh/bash kann man das nicht so schreiben. Wenn der else-Zweig keine Anweisungen auszuführen hat, schreibe dieses else nicht.


if else

if

Syntax der if-Anweisung:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

In einer Zeile geschrieben (anwendbar auf die Terminal-Eingabeaufforderung):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

Das abschließendefiistifrückwärts geschrieben; Ähnliche wirst du später noch antreffen.

if else

Syntax von if else:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

Syntax von if else-if else:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

In if else,[...]nutzt man in Vergleichsanweisungen für größer als-gt, und für kleiner als nutzt man-lt。

if [ "$a" -gt "$b" ]; then
    ...
fi

Wenn man((...))als Vergleichsanweisung verwendet, können größer als und kleiner als direkt verwendet werden>und<。

if (( a > b )); then
    ...
fi

Das folgende Beispiel prüft, ob zwei Variablen gleich sind:

Beispiel

a=10
b=20
if [ $a == $b ]
dann
   echo "a equals b"
elif [ $a -gt $b ]
dann
   echo "a ist größer als b"
elif [ $a -lt $b ]
dann
   echo "a ist kleiner als b"
else
   echo "Keine passende Bedingung"
fi

Ausgabe:

a 小于 b

Verwendung((...))als Vergleichsanweisung:

Beispiel

a=10
b=20
if (( $a == $b ))
dann
   echo "a equals b"
elif (( $a > $b ))
dann
   echo "a ist größer als b"
elif (( $a < $b ))
dann
   echo "a ist kleiner als b"
else
   echo "Keine passende Bedingung"
fi

Ausgabe:

a 小于 b

Die if-else-Anweisung wird oft zusammen mit dem test-Befehl verwendet, wie unten gezeigt:

Beispiel

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
dann
    echo 'Die beiden Zahlen sind gleich!'
else
    echo 'Die beiden Zahlen sind nicht gleich!'
fi

Ausgabe:

The two numbers are equal!

for-Schleife

Ähnlich wie in anderen Programmiersprachen unterstützt Shell for-Schleifen.

Das allgemeine Format einer for-Schleife ist:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

In einer Zeile geschrieben:

for var in item1 item2 ... itemN; do command1; command2… done;

Wenn der Variablenwert in der Liste enthalten ist, führt die for-Schleife alle Befehle einmal aus und verwendet den Variablennamen, um den aktuellen Wert in der Liste zu erhalten. Die Befehle können beliebige gültige Shell-Befehle und -Anweisungen sein. Die in-Liste kann Substitutionen, Zeichenketten und Dateinamen enthalten.

Die in-Liste ist optional. Wenn Sie sie nicht verwenden, verwendet die for-Schleife die Positionsparameter der Befehlszeile.

Zum Beispiel die Zahlen in der aktuellen Liste der Reihe nach ausgeben:

Beispiel

for loop in 1 2 3 4 5
do
    echo "Der Wert ist: $loop"
done

Ausgabe:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

Die Zeichen in einer Zeichenkette der Reihe nach ausgeben:

#!/bin/bash

for str in This is a string
do
    echo $str
done

Ausgabe:

This
is
a
string

while-Anweisung

Die while-Schleife wird verwendet, um kontinuierlich eine Reihe von Befehlen auszuführen und auch Daten aus einer Eingabedatei zu lesen. Ihr Syntaxformat ist:

while condition
do
    command
done

Das Folgende ist eine grundlegende while-Schleife. Die Testbedingung lautet: Wenn int kleiner oder gleich 5 ist, gibt die Bedingung true zurück. int beginnt bei 1, und bei jedem Durchlauf der Schleife wird int um 1 erhöht. Die Ausführung des obigen Skripts liefert die Zahlen 1 bis 5 und endet dann.

Beispiel

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

Führen Sie das Skript aus, Ausgabe:

1
2
3
4
5

Das obige Beispiel verwendet den Bash-let-Befehl, mit dem ein oder mehrere Ausdrücke ausgeführt werden. Bei Variablenberechnungen müssen Sie kein $ hinzufügen, um Variablen darzustellen. Einzelheiten finden Sie unter:Bash-let-Befehl

。

Die while-Schleife kann verwendet werden, um Tastatureingaben zu lesen. Im folgenden Beispiel wird die Eingabe auf die Variable FILM gesetzt, und drücken Sie <Ctrl-D>, um die Schleife zu beenden.

Beispiel

echo 'Drücken Sie <CTRL-D> zum Beenden'
echo -n 'Geben Sie den Namen Ihrer Lieblingswebsite ein: '
while read FILM
do
    echo "Ja!$FILMist eine gute Website"
done

Führen Sie das Skript aus, die Ausgabe sieht ungefähr so aus:

按下 <CTRL-D> 退出
输入你最喜欢的网站名:Example
是的!Example 是一个好网站

Endlosschleife

Syntaxformat der Endlosschleife:

while :
do
    command
done

Oder

while true
do
    command
done

Oder

for (( ; ; ))


until-Schleife

Die until-Schleife führt eine Reihe von Befehlen aus, bis die Bedingung wahr wird, dann stoppt sie.

Die until-Schleife ist in ihrer Handhabungsmethode genau das Gegenteil der while-Schleife.

Im Allgemeinen sind while-Schleifen besser als until-Schleifen, aber zu bestimmten Zeiten – nur in sehr seltenen Fällen – sind until-Schleifen nützlicher.

until-Syntaxformat:

until condition
do
    command
done

Die Bedingung ist im Allgemeinen ein bedingter Ausdruck. Wenn der Rückgabewert falsch ist, werden die Anweisungen im Schleifenkörper weiter ausgeführt; andernfalls wird die Schleife verlassen.

Im folgenden Beispiel verwenden wir den until-Befehl, um die Zahlen 0 ~ 9 auszugeben:

Beispiel

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Run result:

Das Ausgabeergebnis ist:

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esacist eine Mehrfachauswahl-Anweisung, ähnlich der switch ... case-Anweisung in anderen Sprachen. Es ist eine Mehrfachverzweigungs-Auswahlstruktur. Jeder case-Zweig beginnt mit einer rechten runden Klammer und endet mit zwei Semikolons;;bedeutet break, das heißt, die Ausführung endet, und es wird aus der gesamten case ... esac-Anweisung herausgesprungen. esac (was rückwärts geschriebenes case ist) dient als Endmarkierung.

Mit der case-Anweisung können Sie einen Wert mit einem Muster abgleichen. Wenn die Übereinstimmung erfolgreich ist, wird der entsprechende Befehl ausgeführt.

case ... esacDas Syntaxformat ist wie folgt:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

Die Funktionsweise von case ist wie oben dargestellt. Auf den Wert muss das Wortinfolgen, jedes Muster muss mit einer rechten Klammer enden. Der Wert kann eine Variable oder eine Konstante sein. Nachdem der Abgleich festgestellt hat, dass der Wert einem Muster entspricht, werden alle dazwischenliegenden Befehle ausgeführt, bis;;。

Der Wert prüft jedes Muster auf eine Übereinstimmung. Sobald ein Muster übereinstimmt, wird nach Ausführung der entsprechenden Befehle des übereinstimmenden Musters nicht mit anderen Mustern fortgefahren. Wenn kein Muster übereinstimmt, verwenden Sie das Sternchen *, um den Wert zu erfassen, und führen Sie dann die folgenden Befehle aus.

Das folgende Skript fordert zur Eingabe von 1 bis 4 auf und gleicht sie mit jedem Muster ab:

Beispiel

echo 'Geben Sie eine Zahl zwischen 1 und 4 ein:'
echo 'Die von Ihnen eingegebene Zahl ist:'
read aNum
case $aNum in
    1)  echo 'Sie haben 1 gewählt'
    ;;
    2)  echo 'Sie haben 2 gewählt'
    ;;
    3)  echo 'Sie haben 3 gewählt'
    ;;
    4)  echo 'Sie haben 4 gewählt'
    ;;
    *)  echo 'Sie haben keine Zahl zwischen 1 und 4 eingegeben'
    ;;
esac

Die Eingabe unterschiedlicher Inhalte führt zu unterschiedlichen Ergebnissen, zum Beispiel:

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

Das folgende Skript gleicht Zeichenketten ab:

Beispiel

#!/bin/sh

site="example"

case "$site" in
   "example") echo "Example Tutorial"
   ;;
   "google") echo "Google Search"
   ;;
   "taobao") echo "Taobao"
   ;;
esac

Das Ausgabeergebnis ist:

Example

Ausbrechen aus Schleifen

Während einer Schleife müssen Sie manchmal vorzeitig aus der Schleife ausbrechen, bevor die Endbedingung der Schleife erreicht ist. Shell verwendet zwei Befehle, um diese Funktion umzusetzen:breakundcontinue。

break-Befehl

Der break-Befehl ermöglicht es Ihnen, aus allen Schleifen auszubrechen (wodurch die Ausführung aller nachfolgenden Schleifen beendet wird).

Im folgenden Beispiel gerät das Skript in eine Endlosschleife, bis der Benutzer eine Zahl größer als 5 eingibt. Um diese Schleife zu verlassen und zur Shell-Eingabeaufforderung zurückzukehren, müssen Sie den Befehl break verwenden.

Beispiel

#!/bin/bash
while :
do
    echo -n "Geben Sie eine Zahl zwischen 1 und 5 ein:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Die eingegebene Zahl ist$aNum!"
        ;;
        *) echo "Die eingegebene Zahl liegt nicht zwischen 1 und 5! Spiel vorbei"
            break
        ;;
    esac
done

Führen Sie den obigen Code aus, die Ausgabe ist:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束

continue

Der Befehl continue ähnelt dem Befehl break, mit nur einem Unterschied: Er bricht nicht aus allen Schleifen aus, sondern nur aus der aktuellen Schleife.

Ändern Sie das obige Beispiel:

Beispiel

#!/bin/bash
while :
do
    echo -n "Geben Sie eine Zahl zwischen 1 und 5 ein: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Die eingegebene Zahl ist$aNum!"
        ;;
        *) echo "Die eingegebene Zahl liegt nicht zwischen 1 und 5!"
            continue
            echo "Spiel vorbei"
        ;;
    esac
done

Wenn Sie den Code ausführen, zeigt sich, dass die Schleife in diesem Beispiel nicht endet, wenn eine Zahl größer als 5 eingegeben wird. Die Anweisungecho "Spiel vorbei"wird niemals ausgeführt.

Weitere Erweiterungen