Home | Previous | Contents | Next
Bislang waren unsere Skripte nicht interaktiv. Das heißt, sie haben keine Eingaben vom Benutzer entgegengenommen. In dieser Lektion werden wir sehen, wie unsere Skripte Fragen stellen und Antworten erhalten und verwenden können.
Lesen
Um Eingaben über die Tastatur zu erhalten, verwenden wir den Befehl read
. Der read
-Befehl nimmt Eingaben von der Tastatur entgegen und weist sie einer Variablen zu. Hier ist ein Beispiel:
echo
-n „Geben Sie einen Text ein >read
textecho
„Sie haben eingegeben: $text“Wie wir sehen können, haben wir in Zeile 3 eine Eingabeaufforderung angezeigt. Beachten Sie, dass „-n
„, das dem echo
-Befehl übergeben wird, bewirkt, dass der Cursor auf der gleichen Zeile bleibt, d. h., Das heißt, es wird kein Zeilenvorschub am Ende der Eingabeaufforderung ausgegeben.
Als nächstes rufen wir den Befehl read
mit dem Argument „text
“ auf. Dieser wartet darauf, dass der Benutzer etwas eintippt, gefolgt von der Eingabetaste, und weist dann der Variablen text
zu, was auch immer eingetippt wurde.
Hier ist das Skript in Aktion:
read_demo.bash
Geben Sie einen Text ein >this is some text
Sie haben eingegeben: Dies ist ein TextWenn wir dem read
-Befehl nicht den Namen einer Variablen zur Zuweisung seiner Eingabe geben, verwendet er die UmgebungsvariableREPLY
.
Der read
-Befehl hat mehrere Kommandozeilenoptionen. Die drei interessantesten sind -p
-t
und-s
.
Mit der Option -p
können wir einen Prompt angeben, der der Eingabe des Benutzers vorausgeht. Dies erspart den zusätzlichen Schritt, ein Echo zu verwenden, um den Benutzer aufzufordern. Hier ist das frühere Beispiel, das umgeschrieben wurde, um die Option -p
zu verwenden:
read
-p „Geben Sie einen Text ein> “ textecho
„Sie haben eingegeben: $text“Die Option -t
, gefolgt von einer Anzahl von Sekunden, bietet einen automatischen Timeout für den Befehl read
. Dies bedeutet, dass der read
-Befehl nach der angegebenen Anzahl von Sekunden aufgibt, wenn keine Antwort vom Benutzer empfangen wurde.Diese Option könnte im Fall eines Skripts verwendet werden, das fortfahren muss (vielleicht auf eine Standardantwort zurückgreifen), auch wenn der Benutzer nicht auf die Eingabeaufforderungen antwortet.
echo
-n „Beeil dich und tippe etwas! >if read
-t 3 Antwort; then
echo
„Toll, du hast es rechtzeitig geschafft!“else
echo
„Sorry, du bist zu langsam!“fi
Die Option -s
bewirkt, dass die Eingaben des Benutzers nicht angezeigt werden, was nützlich ist, wenn wir den Benutzer auffordern, ein Passwort oder andere vertrauliche Informationen einzugeben.
Arithmetik
Da wir auf einem Computer arbeiten, ist es natürlich zu erwarten, dass er einige einfache Arithmetiken ausführen kann. Die Shell bietet Funktionen zum ganzzahligen Rechnen.
Was ist eine ganze Zahl? Das bedeutet ganze Zahlen wie 1, 2, 458, -2859. Es bedeutet nicht Bruchzahlen wie 0,5, .333 oder 3,1415. Um mit Bruchzahlen umzugehen, gibt es ein separates Programm namens bc
, das eine Sprache zur Berechnung beliebiger Genauigkeiten bereitstellt. Es kann in Shell-Skripten verwendet werden, sprengt aber den Rahmen dieses Tutorials.
Angenommen, wir wollen die Kommandozeile als primitiven Taschenrechner verwenden. Das geht so:
echo $((2+2))
Wenn wir einen arithmetischen Ausdruck mit den doppelten Klammern umgeben, führt die Shell eine arithmetische Expansion durch.
Beachten Sie, dass Leerzeichen ignoriert werden:
echo $((2+2))
echo $(( 2+2 ))
echo $(( 2 + 2 ))
4Die Shell kann eine Vielzahl von gängigen (und weniger gängigen) arithmetischen Operationen durchführen. Hier ist ein Beispiel:
read
-p „Gib die erste Zahl ein –> “ first_numread
-p „Gib die zweite Zahl ein -> “ second_numecho
„erste Zahl + zweite Zahl = $((erste_num + zweite_num))“echo
„erste Zahl – zweite Zahl = $((erste_num – zweite_Zahl))“echo
„erste Zahl * zweite Zahl = $((erste_Zahl * zweite_Zahl))“echo
„erste Zahl / zweite Zahl = $((erste_Zahl / zweite_Zahl))“echo
„erste Zahl % zweite Zahl = $((erste_Zahl % zweite_Zahl))“echo
„erste Zahl hoch“echo
„Potenz der zweiten Zahl = $((erste_Zahl ** zweite_Zahl))“Beachten Sie, dass das führende „$
“ nicht benötigt wird, um Variablen innerhalb des arithmetischen Ausdrucks zu referenzieren, wie z. B. „first_num +second_num
„.
Testen Sie dieses Programm und beobachten Sie, wie es mit Divisionen umgeht (denken Sie daran, dass es sich um ganzzahlige Divisionen handelt) und wie es mit großen Zahlen umgeht. Zahlen, die zu groß werden, laufen über wie der Kilometerzähler in einem Auto, wenn er die Anzahl der Kilometer überschreitet, für die er ausgelegt ist. Es fängt von vorne an, aber zuerst geht es durch alle negativen Zahlen, weil ganze Zahlen im Speicher dargestellt werden. Eine Division durch Null (was mathematisch ungültig ist) führt zu einem Fehler.
Die ersten vier Operationen, Addition, Subtraktion, Multiplikation und Division, sind leicht zu erkennen, aber die fünfte ist vielleicht ungewohnt. Das „%
„-Symbol steht für den Rest (auch bekannt als Modulo). Diese Operation führt eine Division durch, aber anstatt den Quotienten wie bei der Division zurückzugeben, wird der Rest zurückgegeben. Obwohl dies nicht sehr nützlich erscheinen mag, ist es in der Tat sehr nützlich beim Schreiben von Programmen. Wenn die Restoperation beispielsweise Null zurückgibt, zeigt sie an, dass die erste Zahl ein genaues Vielfaches der zweiten ist. Das kann sehr praktisch sein:
read
-p „Geben Sie eine Zahl ein> “ Zahlecho
„Zahl ist $Zahl“if ;
then
echo
„Zahl ist gerade“else
echo
„Zahl ist ungerade“fi
Oder, in diesem Programm, das eine beliebige Anzahl von Sekunden in Stunden und Minuten formatiert:
read
-p „Anzahl der Sekunden eingeben > “ secondshours=$((Sekunden / 3600))seconds=$((Sekunden % 3600))minutes=$((Sekunden / 60))seconds=$((Sekunden % 60))echo
„$Stunden Stunde(n) $Minuten Minute(n) $Sekunden Sekunde(n)“