Einführung
Stellen Sie sich einen Roboterkellner vor. Ein statischer Roboter kann zu jedem nur „Guten Tag“ sagen. Ein dynamischer Roboter kann nach Ihrem Namen fragen und „Hallo, Sarah“ oder „Hallo, Mike“ sagen.
Im vorherigen Lab hat Ihr Skript immer genau dasselbe getan. In diesem Lab machen Sie es dynamisch, indem Sie Daten von außerhalb des Skripts übernehmen.
Das ist ein wichtiger Schritt in der Programmierung. Sobald ein Skript Eingaben annehmen kann, ist es keine feste Demo mehr, sondern ein wiederverwendbares Werkzeug.
Sie lernen zwei Möglichkeiten kennen, mit Ihrem Skript zu kommunizieren:
- Fragen und zuhören: Das Skript hält an und stellt Ihnen eine Frage (mit
read). - Notizen übergeben: Sie übergeben dem Skript bereits beim Start eine Notiz (mit Argumenten).
Am Ende dieses Labs kann Ihr Code jede gewünschte Person begrüßen, nicht nur „World“.
Interaktive Eingaben mit read verwenden
Unsere erste Methode ist der „Gesprächs“-Ansatz. Wir lassen das Skript eine Frage ausgeben und anschließend auf eine Antwort warten.
Dafür verwenden wir den Befehl read. Stellen Sie sich read als einen Befehl vor, der sagt: „Halte alles an, höre zu und warte, bis der Benutzer etwas eingibt.“
Dies ist Ihr erstes Beispiel dafür, dass ein Skript Daten empfängt, während es bereits ausgeführt wird. Beim Shell-Scripting ist eine Variable ein benannter Speicherplatz, in dem Daten vorübergehend abgelegt werden, zum Beispiel ein Benutzername, ein Dateiname oder eine Zahl. Variablen machen Skripte wiederverwendbar, weil das Skript mit wechselnden Eingaben statt mit fest codiertem Text arbeiten kann.
Stellen Sie zunächst sicher, dass Sie sich in Ihrem Projekt-Arbeitsverzeichnis befinden:
cd ~/project
Erstellen Sie mit nano eine neue Datei namens hello.sh:
nano hello.sh
Geben Sie den folgenden Code ein.
Hinweis: Wir definieren eine „Box“ (Variable) namens name, in der die Antwort des Benutzers gespeichert wird.
#!/bin/bash
echo "What is your name?"
read name
echo "Hello, $name!"
Aufschlüsselung:
echo "...": Das Skript spricht mit Ihnen.read name: Das Skript hört zu. Ihre Eingabe wird in der Boxnamegespeichert.$name: Das Skript öffnet die Box. Das Symbol$ist der Schlüssel, mit dem Sie auf den Wert der Variable zugreifen.
Beachten Sie den Unterschied zwischen name und $name. name ist die Bezeichnung der Variable, wenn Sie sie erstellen oder mit einem Wert füllen. $name bedeutet: „Ersetze dies durch den Wert, der in der Variable gespeichert ist.“ Dieser Vorgang heißt Expansion und gehört zu den wichtigsten Verhaltensweisen der Shell.
Speichern Sie Ihre Arbeit (Ctrl+O, Enter) und beenden Sie nano (Ctrl+X).
Das interaktive Skript ausführen
Bevor Sie mit Ihrem Skript sprechen können, müssen Sie die Ausführung erlauben. Erinnern Sie sich an den „Schlüssel“ aus dem vorherigen Lab?
Erteilen Sie die Ausführungsberechtigung:
chmod +x hello.sh
Starten Sie nun ein Gespräch mit dem Skript:
./hello.sh
Das Skript fragt „What is your name?“ und hält anschließend an. Es wartet auf Ihre Eingabe. Der Cursor blinkt möglicherweise.
Geben Sie Ihren Namen ein, zum Beispiel Alice, und drücken Sie Enter.
What is your name?
Alice
Hello, Alice!
Das nennt man interaktive Eingabe. Für Werkzeuge, die von Menschen verwendet werden, ist sie praktisch, für die Automatisierung aber ungeeignet. Stellen Sie sich vor, Sie wollten dieses Skript automatisch um 3 Uhr morgens ausführen. Es würde bei der Frage hängen bleiben und auf eine Antwort warten, die niemals kommt.
Dieser Zielkonflikt ist im praktischen Betrieb wichtig. Interaktive Skripte sind praktisch, wenn ein Mensch anwesend ist. Geplante Jobs, CI-Pipelines und Startskripte benötigen dagegen normalerweise nicht interaktive Eingaben, damit sie unbeaufsichtigt laufen können.
Argumente für nicht interaktive Eingaben verwenden
Damit unser Skript für die Automatisierung geeignet ist, müssen wir ihm die Daten vor dem Start übergeben, sodass es nicht anhalten muss. Dafür verwenden wir Argumente.
Stellen Sie sich Argumente wie einen „Briefschlitz“ in einer Tür vor. Sie werfen die Nachricht beim Vorbeigehen hinein.
In Bash haben diese Briefschlitze nummerierte Namen:
$1ist das erste Wort, das Sie nach dem Skriptnamen eingeben.$2ist das zweite Wort usw.
Diese nummerierten Werte heißen Positionsparameter. Die Shell erstellt sie automatisch, wenn das Skript startet. Sie definieren $1 nicht selbst; Bash übernimmt den Wert aus der Kommandozeile, mit der das Skript gestartet wurde.
Passen Sie hello.sh so an, dass es im ersten Briefschlitz $1 nachsieht, statt eine Frage zu stellen.
Öffnen Sie die Datei:
nano hello.sh
Ändern Sie den Code so:
#!/bin/bash
name=$1
echo "Hello, $name!"
name=$1 übernimmt hier den Wert aus dem Briefschlitz $1 und speichert ihn in der Box name. Das Skript hält nicht an und stellt keine Fragen.
Speichern Sie die Datei und beenden Sie nano.
Das Skript mit Argumenten ausführen
Jetzt führen Sie das Skript auf eine andere Weise aus. Sie übergeben ihm den Namen direkt beim Start.
Führen Sie diesen Befehl aus:
./hello.sh LabEx
LabEx ist hier das Argument. Das Skript übernimmt es als $1 und gibt sofort Folgendes aus:
Hello, LabEx!
Probieren Sie es mit einem anderen Namen:
./hello.sh World
Das Skript funktioniert sofort. Es gibt keine Pause.
Das Problem mit dem leeren Briefschlitz
Was geschieht, wenn Sie kein Argument übergeben?
./hello.sh
Sie erhalten:
Hello, !
Der Briefschlitz $1 war leer, daher blieb auch die Box name leer. In späteren Labs lernen Sie, wie Sie das erkennen und eine Fehlermeldung ausgeben. Für den Moment haben Sie jedoch erfolgreich ein schlankes, automatisierungsbereites Skript erstellt.
Der Unterschied zwischen interaktiven Eingaben und Kommandozeilenargumenten ist grundlegend. read fragt während der Ausführung nach einer Eingabe, während $1 bereits von Anfang an verfügbar ist. Viele Unix-Werkzeuge sind auf Argumente ausgelegt, weil sie sich leichter automatisieren, dokumentieren, wiederholen und mit anderen Befehlen kombinieren lassen.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben die Kunst des Zuhörens kennengelernt.
In diesem Lab haben Sie Folgendes untersucht:
- Interaktiver Modus: Mit
readein Gespräch mit dem Benutzer führen (geeignet für Menschen). - Argumentmodus: Mit
$1Daten beim Start des Skripts übernehmen (geeignet für Roboter und Automatisierung).
Außerdem haben Sie gelernt, dass Variablen wie $name einfach beschriftete Boxen sind, in denen Skripte Informationen speichern. Dieses Konzept bildet die Grundlage der gesamten Programmierung.



