Spezielle Variablen in der Shell

ShellBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die speziellen Variablen in der Shell-Programmierung kennen. Diese Variablen liefern wichtige Informationen über die Ausführungsumgebung des Skripts, wie zum Beispiel Befehlszeilenargumente, den Namen des Skripts und die Prozess-ID. Das Verständnis dieser Variablen wird Ihnen helfen, flexiblere und leistungsfähigere Shell-Skripte zu schreiben.

Erstellen Ihres ersten Skripts

Beginnen wir mit der Erstellung eines einfachen Shell-Skripts, um die Verwendung spezieller Variablen zu demonstrieren.

  1. Öffnen Sie Ihr Terminal in der WebIDE. Sie sollten eine Eingabeaufforderung sehen, die auf Ihre Eingabe wartet.

  2. Navigieren Sie in das Projektverzeichnis:

cd ~/project

Dieser Befehl wechselt Ihr aktuelles Verzeichnis zu ~/project, welches Ihr Standard-Arbeitsverzeichnis für dieses Lab ist.

  1. Erstellen Sie eine neue Datei namens special_vars.sh mit dem folgenden Befehl:
touch special_vars.sh

Der Befehl touch erstellt eine leere Datei, falls diese noch nicht existiert, oder aktualisiert deren Zeitstempel, falls sie bereits vorhanden ist.

  1. Öffnen Sie die Datei im WebIDE-Editor. Klicken Sie dazu einfach auf den Dateinamen im Datei-Explorer auf der linken Seite Ihres Bildschirms.

  2. Fügen Sie der Datei den folgenden Inhalt hinzu:

#!/bin/bash

echo "Script Name: $0"
echo "First Argument: $1"
echo "Second Argument: $2"
echo "All Arguments: $@"
echo "Number of Arguments: $#"
echo "Process ID: $$"

Lassen Sie uns aufschlüsseln, was jede Zeile bewirkt:

  • #!/bin/bash: Dies wird Shebang genannt. Es weist das System an, die Bash zu verwenden, um dieses Skript zu interpretieren.
  • $0: Diese spezielle Variable enthält den Namen des Skripts.
  • $1 und $2: Diese stehen jeweils für das erste und zweite Befehlszeilenargument.
  • $@: Dies repräsentiert alle an das Skript übergebenen Befehlszeilenargumente.
  • $#: Dies gibt die Anzahl der Befehlszeilenargumente an.
  • $$: Dies liefert die Prozess-ID der aktuellen Shell.
  1. Speichern Sie die Datei, nachdem Sie den Inhalt hinzugefügt haben.

  2. Machen Sie das Skript ausführbar, indem Sie den folgenden Befehl in Ihrem Terminal ausführen:

chmod +x special_vars.sh

Der Befehl chmod ändert die Berechtigungen einer Datei. Die Option +x fügt die Ausführungsberechtigung hinzu, sodass Sie das Skript starten können.

Ausführen des Skripts mit Argumenten

Nachdem wir unser Skript erstellt haben, führen wir es nun mit verschiedenen Argumenten aus, um zu sehen, wie sich die speziellen Variablen verhalten.

  1. Führen Sie das Skript ohne Argumente aus:
./special_vars.sh

Das ./ vor dem Skriptnamen weist die Shell an, im aktuellen Verzeichnis nach dem Skript zu suchen.

Sie sollten eine Ausgabe ähnlich dieser sehen:

Script Name: ./special_vars.sh
First Argument:
Second Argument:
All Arguments:
Number of Arguments: 0
Process ID: 1234

Beachten Sie, dass das erste und zweite Argument leer sind und die Anzahl der Argumente 0 ist, da wir keine angegeben haben.

  1. Führen Sie das Skript nun mit einigen Argumenten aus:
./special_vars.sh hello world

Die Ausgabe sollte so aussehen:

Script Name: ./special_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Process ID: 1235

Das hat sich geändert:

  • $1 enthält nun "hello"
  • $2 enthält nun "world"
  • $@ zeigt alle Argumente: "hello world"
  • $# zeigt 2, da wir zwei Argumente übergeben haben

Die Prozess-ID ($$) kann bei jedem Ausführen des Skripts anders sein, da sie vom Betriebssystem zugewiesen wird.

Verständnis von $? und $!

Zwei weitere wichtige spezielle Variablen sind $? und $!. Erstellen wir ein neues Skript, um deren Verwendung zu demonstrieren.

  1. Erstellen Sie eine neue Datei namens exit_status.sh:
touch ~/project/exit_status.sh
  1. Öffnen Sie die Datei im WebIDE-Editor und fügen Sie den folgenden Inhalt hinzu:
#!/bin/bash

echo "Running a successful command:"
ls /home
echo "Exit status: $?"

echo "Running a command that will fail:"
ls /nonexistent_directory
echo "Exit status: $?"

echo "Running a background process:"
sleep 2 &
echo "Process ID of last background command: $!"

Lassen Sie uns dieses Skript analysieren:

  • $? gibt den Exit-Status des zuletzt ausgeführten Befehls an. 0 bedeutet normalerweise Erfolg, während Werte ungleich Null auf verschiedene Fehlerzustände hinweisen.
  • $! gibt die Prozess-ID des zuletzt im Hintergrund ausgeführten Befehls an.
  • Das & am Ende eines Befehls lässt diesen im Hintergrund laufen.
  1. Speichern Sie die Datei und machen Sie sie ausführbar:
chmod +x ~/project/exit_status.sh
  1. Führen Sie das Skript aus:
./exit_status.sh

Sie sollten eine Ausgabe ähnlich dieser sehen:

Running a successful command:
labex
Exit status: 0
Running a command that will fail:
ls: cannot access '/nonexistent_directory': No such file or directory
Exit status: 2
Running a background process:
Process ID of last background command: 1236

Beachten Sie:

  • Der erste ls-Befehl ist erfolgreich, daher ist $? gleich 0.
  • Der zweite ls-Befehl schlägt fehl (da das Verzeichnis nicht existiert), daher ist $? gleich 2 (ein Wert ungleich Null, der einen Fehler anzeigt).
  • Der sleep-Befehl läuft im Hintergrund, und $! liefert seine Prozess-ID.

Verwendung spezieller Variablen in Funktionen

Spezielle Variablen können auch innerhalb von Funktionen verwendet werden. Erstellen wir ein Skript, um dies zu zeigen.

  1. Erstellen Sie eine neue Datei namens function_vars.sh:
touch ~/project/function_vars.sh
  1. Öffnen Sie die Datei im WebIDE-Editor und fügen Sie den folgenden Inhalt hinzu:
#!/bin/bash

function print_args {
  echo "Function Name: $0"
  echo "First Argument: $1"
  echo "Second Argument: $2"
  echo "All Arguments: $@"
  echo "Number of Arguments: $#"
}

echo "Calling function with two arguments:"
print_args hello world

echo "Calling function with four arguments:"
print_args one two three four

Dieses Skript definiert eine Funktion print_args, die spezielle Variablen verwendet. Danach wird diese Funktion zweimal mit einer unterschiedlichen Anzahl von Argumenten aufgerufen.

  1. Speichern Sie die Datei und machen Sie sie ausführbar:
chmod +x ~/project/function_vars.sh
  1. Führen Sie das Skript aus:
./function_vars.sh

Sie sollten eine Ausgabe ähnlich dieser sehen:

Calling function with two arguments:
Function Name: ./function_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Calling function with four arguments:
Function Name: ./function_vars.sh
First Argument: one
Second Argument: two
All Arguments: one two three four
Number of Arguments: 4

Beachten Sie Folgendes:

  • $0 bezieht sich immer noch auf den Skriptnamen, nicht auf den Funktionsnamen.
  • $1, $2, $@ und $# funktionieren für Funktionsargumente genauso wie für Skriptargumente.
  • Die Werte dieser Variablen ändern sich jedes Mal, wenn die Funktion mit anderen Argumenten aufgerufen wird.

Den Unterschied zwischen $@ und $* verstehen

Die speziellen Variablen $@ und $* werden beide verwendet, um alle Befehlszeilenargumente darzustellen, verhalten sich jedoch unterschiedlich, wenn sie in doppelte Anführungszeichen gesetzt werden. Erstellen wir ein Skript, um diesen Unterschied zu verdeutlichen.

  1. Erstellen Sie eine neue Datei namens at_vs_star.sh:
touch ~/project/at_vs_star.sh
  1. Öffnen Sie die Datei im WebIDE-Editor und fügen Sie den folgenden Inhalt hinzu:
#!/bin/bash

echo "Using \$@:"
for arg in "$@"; do
  echo "Argument: $arg"
done

echo "Using \$*:"
for arg in "$*"; do
  echo "Argument: $arg"
done

Dieses Skript demonstriert den Unterschied zwischen $@ und $* innerhalb einer Schleife.

  1. Speichern Sie die Datei und machen Sie sie ausführbar:
chmod +x ~/project/at_vs_star.sh
  1. Führen Sie das Skript mit mehreren Argumenten aus, einschließlich solcher mit Leerzeichen:
./at_vs_star.sh "arg with spaces" another_arg "third arg"

Sie sollten eine Ausgabe ähnlich dieser sehen:

Using $@:
Argument: arg with spaces
Argument: another_arg
Argument: third arg
Using $*:
Argument: arg with spaces another_arg third arg

Was hier passiert:

  • Bei "$@" wird jedes Argument als separate Einheit behandelt. Argumente mit Leerzeichen bleiben als einzelne Einheiten erhalten.
  • Bei "$*" werden alle Argumente zu einer einzigen Zeichenfolge kombiniert, getrennt durch das erste Zeichen der Variable IFS (Internal Field Separator), was normalerweise ein Leerzeichen ist.

Dieser Unterschied ist entscheidend, wenn Sie Argumente verarbeiten müssen, die Leerzeichen oder andere Sonderzeichen enthalten könnten.

Zusammenfassung

In diesem Lab haben Sie die speziellen Variablen in der Shell-Programmierung kennengelernt und erfahren, wie man sie effektiv einsetzt. Sie haben Skripte erstellt, die die Verwendung verschiedener spezieller Variablen wie $0, $1, $@, $#, $$, $? und $! demonstrieren. Außerdem haben Sie untersucht, wie sich diese Variablen in verschiedenen Kontexten verhalten, zum Beispiel innerhalb von Funktionen und beim Umgang mit Befehlszeilenargumenten.

Wichtige Erkenntnisse:

  1. $0, $1, $2 usw. repräsentieren den Skriptnamen und die Befehlszeilenargumente.
  2. $@ und $# ermöglichen es Ihnen, mit allen Argumenten zu arbeiten und diese zu zählen.
  3. $$ liefert die aktuelle Prozess-ID, was nützlich ist, um eindeutige temporäre Dateien zu erstellen.
  4. $? hilft Ihnen zu prüfen, ob der vorherige Befehl erfolgreich war.
  5. $! gibt die PID des letzten Hintergrundprozesses an, was für die Jobsteuerung nützlich ist.
  6. $@ und $* verhalten sich unterschiedlich, wenn sie in Anführungszeichen gesetzt werden, was beim Umgang mit Argumenten, die Leerzeichen enthalten, wichtig ist.

Das Verständnis dieser speziellen Variablen ist grundlegend für das Schreiben fortgeschrittener und flexibler Shell-Skripte. Sie ermöglichen es Ihnen, Skripte zu erstellen, die sich an verschiedene Eingaben anpassen und wertvolle Informationen über die Ausführungsumgebung liefern.

Während Sie weiter üben und mit Shell-Skripten experimentieren, werden Sie noch viele weitere Möglichkeiten finden, diese speziellen Variablen in Ihrer Arbeit zu nutzen. Denken Sie daran, das Bash-Handbuch (man bash) für detailliertere Informationen zu diesen und anderen speziellen Variablen zu konsultieren.