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
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
...
fiWenn 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
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
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
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
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
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 -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
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 '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
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
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
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