So arbeiten Sie mit Variablen in Bash

Variablen sind ein grundlegendes Element beim Erstellen von Skripten und beim Entschlüsseln von Code, den man aus dem Internet kopiert. In diesem Artikel erfahren Sie alles, was Sie wissen müssen, um Variablen in Bash zu verwenden!

Grundlagen zu Variablen

Variablen sind benannte Platzhalter, die entweder eine Zeichenkette (Text) oder einen numerischen Wert speichern. Wenn diese in Befehlen oder Ausdrücken genutzt werden, verhalten sie sich so, als ob anstelle des Variablennamens der jeweilige Wert direkt eingegeben worden wäre.

Um eine Variable zu definieren, weisen Sie ihr einfach einen Namen und einen Wert zu. Die Variablennamen sollten aussagekräftig sein und den gespeicherten Wert widerspiegeln. Sie dürfen nicht mit einer Ziffer beginnen oder Leerzeichen enthalten. Ein Unterstrich am Anfang ist jedoch erlaubt. Abgesehen davon können Sie eine beliebige Kombination aus alphanumerischen Zeichen, Groß- und Kleinbuchstaben verwenden.

Beispiele für die Verwendung von Variablen

Hier erstellen wir fünf Variablen. Die Syntax ist einfach: Name, Gleichheitszeichen (=), und Wert. Wichtig ist, dass vor oder nach dem Gleichheitszeichen keine Leerzeichen stehen. Diese Zuweisung eines Wertes zu einer Variable wird auch als „Initialisierung“ bezeichnet.

Wir erstellen vier Zeichenketten-Variablen und eine numerische Variable, namens „aktuelles_jahr“:

name=Max
system=Ubuntu
held=Superheld
kraft=Superkraft
aktuelles_jahr=2023

Um den Wert einer Variable anzuzeigen, benutzen wir den Befehl ‚echo‘. Dabei muss dem Variablennamen ein Dollarzeichen ($) vorangestellt werden, um auf den Wert zuzugreifen:

echo $name
echo $system
echo $aktuelles_jahr

Lassen Sie uns alle Variablen gleichzeitig nutzen:

echo "$system ist für $name wie $kraft für $held (c) $aktuelles_jahr"

Die Werte der Variablen ersetzen ihre Namen. Sie können die Werte von Variablen auch ändern. Um der Variable „system“ einen neuen Wert zu geben, wiederholen Sie einfach die Initialisierung:

system=Debian

Wenn Sie den vorherigen ‚echo‘-Befehl erneut ausführen, erhalten Sie ein anderes Ergebnis:

echo "$system ist für $name wie $kraft für $held (c) $aktuelles_jahr"

Sie können also denselben Befehl mit denselben Variablen verwenden und unterschiedliche Ergebnisse erhalten, indem Sie die in den Variablen gespeicherten Werte ändern.

Wir werden später auf die Verwendung von Anführungszeichen mit Variablen eingehen. Hier sind einige wichtige Punkte, die Sie sich vorerst merken sollten:

  • Eine Variable in einfachen Anführungszeichen ‚ wird als literal Text behandelt, nicht als Variable.
  • Variablen in doppelten Anführungszeichen “ werden als Variablen behandelt und expandiert.
  • Um den Wert einer Variable zu bekommen, muss das Dollarzeichen $ vorangestellt werden.
  • Eine Variable ohne $ liefert nur den Namen der Variable.

Sie können auch eine neue Variable erstellen, die ihre Werte aus einer oder mehreren bestehenden Variablen erhält. Der folgende Befehl definiert eine neue Variable „jahres_system“ und kombiniert die Werte der Variablen „system“ und „aktuelles_jahr“:

jahres_system="$system $aktuelles_jahr"
echo $jahres_system

Variablen in Skripten verwenden

Ohne Variablen wären Skripte stark eingeschränkt. Variablen bieten die Flexibilität, ein Skript allgemeiner und nicht nur für eine spezielle Situation anwendbar zu machen. Um das zu verdeutlichen, hier ist ein Skript, das die Anzahl der Dateien im Verzeichnis /dev zählt.

Speichern Sie diesen Text als Datei mit dem Namen „anzahl_dateien.sh“:

#!/bin/bash

verzeichnis_zaehlen=/dev

anzahl_dateien=$(ls $verzeichnis_zaehlen | wc -l)

echo $anzahl_dateien Dateien in $verzeichnis_zaehlen

Bevor Sie das Skript ausführen, müssen Sie es ausführbar machen:

chmod +x anzahl_dateien.sh

Geben Sie Folgendes ein, um das Skript auszuführen:

./anzahl_dateien.sh

Das Skript gibt die Anzahl der Dateien im Verzeichnis /dev aus. Hier ist, was passiert:

Eine Variable namens „verzeichnis_zaehlen“ wird definiert und mit der Zeichenkette „/dev“ initialisiert.
Eine weitere Variable namens „anzahl_dateien“ wird definiert. Ihr Wert wird durch eine Befehlssubstitution erhalten. Das ist der Befehl zwischen den Klammern $( ). Beachten Sie das Dollarzeichen $ vor der ersten Klammer. Dieser Befehl $( ) wertet den Befehl zwischen den Klammern aus und gibt das Resultat zurück. Dieser Wert wird der Variable „anzahl_dateien“ zugewiesen.
Der Befehl innerhalb der Befehlssubstitution führt ein ‚ls‘-Kommando im Verzeichnis aus, das in der Variable „verzeichnis_zaehlen“ gespeichert ist, welche „/dev“ ist. Das Skript führt also „ls /dev“ aus.
Die Ausgabe dieses Befehls wird an den Befehl ‚wc‘ weitergeleitet. Die Option ‚-l‘ (Zeilenanzahl) veranlasst ‚wc‘, die Anzahl der Zeilen in der Ausgabe von ‚ls‘ zu zählen. Da jede Datei in einer separaten Zeile aufgelistet wird, ist dies die Anzahl der Dateien und Unterverzeichnisse in „/dev“. Dieser Wert wird der Variablen „anzahl_dateien“ zugewiesen.
Die letzte Zeile verwendet ‚echo‘, um das Ergebnis auszugeben.

Das Skript funktioniert jedoch nur für das Verzeichnis „/dev“. Wie können wir es so anpassen, dass es mit jedem beliebigen Verzeichnis funktioniert? Dazu ist nur eine kleine Änderung nötig.

Befehlszeilenparameter in Skripten verwenden

Viele Befehle wie ‚ls‘ und ‚wc‘ verwenden Befehlszeilenparameter. Diese geben dem Befehl Informationen darüber, was er tun soll. Wenn Sie möchten, dass ‚ls‘ in Ihrem Home-Verzeichnis arbeitet und auch versteckte Dateien anzeigt, können Sie den folgenden Befehl verwenden, wobei ‚~‘ und die Option ‚-a‘ Befehlszeilenparameter sind:

ls ~ -a

Unsere Skripte können auch Befehlszeilenparameter entgegennehmen. Sie werden als $1 für den ersten Parameter, $2 für den zweiten usw. bis zu $9 für den neunten Parameter bezeichnet. (Es gibt auch $0, aber das ist reserviert und enthält immer den Namen des Skripts.)

Sie können auf Befehlszeilenparameter in einem Skript genauso zugreifen wie auf normale Variablen. Lassen Sie uns unser Skript modifizieren und unter dem Namen „anzahl_dateien2.sh“ speichern:

#!/bin/bash

verzeichnis_zaehlen=$1

anzahl_dateien=$(ls $verzeichnis_zaehlen | wc -l)

echo $anzahl_dateien Dateien in $verzeichnis_zaehlen

Diesmal wird der Variable „verzeichnis_zaehlen“ der Wert des ersten Befehlszeilenparameters $1 zugewiesen.

Der Rest des Skripts arbeitet wie zuvor. Anstelle einer spezifischen Lösung ist Ihr Skript nun eine allgemeine. Sie können es mit jedem Verzeichnis verwenden, da es nicht fest auf „/dev“ eingestellt ist.

So machen Sie das Skript ausführbar:

chmod +x anzahl_dateien2.sh

Testen Sie es jetzt mit verschiedenen Verzeichnissen. Sie können zuerst „/dev“ ausführen, um sicherzustellen, dass Sie das gleiche Ergebnis wie zuvor erhalten. Geben Sie Folgendes ein:

./anzahl_dateien2.sh /dev
./anzahl_dateien2.sh /etc
./anzahl_dateien2.sh /bin

Sie erhalten das gleiche Ergebnis (207 Dateien) wie zuvor für das Verzeichnis „/dev“. Dies ist ein guter Test. Sie bekommen nun für jedes der anderen Verzeichnisse die entsprechenden Ergebnisse.

Um das Skript zu verkürzen, können Sie auf die Variable „verzeichnis_zaehlen“ verzichten und nur durchgängig auf $1 verweisen, wie folgt:

#!/bin/bash

anzahl_dateien=$(ls $1 | wc -l)

echo $anzahl_dateien Dateien in $1

Spezielle Variablen

Wir haben $0 erwähnt, das immer den Dateinamen des Skripts enthält. Damit kann das Skript, selbst wenn es umbenannt wurde, seinen Namen korrekt ausgeben. Das ist nützlich in Protokollierungssituationen, wenn Sie wissen möchten, welcher Prozess einen Eintrag hinzugefügt hat.

Hier sind die anderen vordefinierten, speziellen Variablen:

$#: Die Anzahl der Befehlszeilenparameter, die dem Skript übergeben wurden.
@: Alle Befehlszeilenparameter, die dem Skript übergeben wurden.
$?: Der Exit-Status des zuletzt ausgeführten Prozesses.
$$: Die Prozess-ID (PID) des aktuellen Skripts.
$USER: Der Benutzername des Benutzers, der das Skript ausführt.
$HOSTNAME: Der Hostname des Computers, auf dem das Skript ausgeführt wird.
$SECONDS: Die Anzahl der Sekunden, die das Skript schon ausgeführt wird.
$RANDOM: Gibt eine Zufallszahl zurück.
$LINENO: Gibt die aktuelle Zeilennummer des Skripts zurück.

Sie möchten sie alle in einem Skript sehen, nicht wahr? Das können Sie! Speichern Sie folgenden Text als „spezial.sh“:

#!/bin/bash

echo "Es gab $# Befehlszeilenparameter"
echo "Sie sind: @"
echo "Parameter 1 ist: $1"
echo "Das Skript heißt: $0"
# Ein einfacher Prozess, um den Exit-Status zu zeigen
pwd
echo "pwd lieferte $?"
echo "Das Skript hat die Prozess-ID $$"
echo "Das Skript wurde von $USER gestartet"
echo "Es läuft auf $HOSTNAME"
sleep 3
echo "Es läuft seit $SECONDS Sekunden"
echo "Zufallszahl: $RANDOM"
echo "Dies ist Zeile Nummer $LINENO des Skripts"

Um es ausführbar zu machen, geben Sie Folgendes ein:

chmod +x spezial.sh

Jetzt können Sie es mit verschiedenen Befehlszeilenparametern ausführen:

Umgebungsvariablen

Die Bash verwendet Umgebungsvariablen, um die Eigenschaften der Umgebung, in der sie gestartet wird, zu speichern. Diese Variablen enthalten Informationen, auf die Bash leicht zugreifen kann, wie Ihren Benutzernamen, Ihr Gebietsschema, die Anzahl der Befehle, die Ihre Historie speichern soll, Ihren Standardeditor und vieles mehr.

Um die aktiven Umgebungsvariablen in Ihrer Bash-Sitzung anzuzeigen, verwenden Sie diesen Befehl:

env | less

Beim Durchblättern der Liste finden Sie einige Variablen, auf die Sie in Ihren Skripten zugreifen können.

Variablen exportieren

Wenn ein Skript ausgeführt wird, befindet es sich in einem eigenen Prozess, und die Variablen sind außerhalb dieses Prozesses nicht sichtbar. Wenn Sie eine Variable mit einem anderen Skript, das von Ihrem Skript gestartet wird, teilen möchten, müssen Sie diese Variable exportieren. Hier ist ein Beispiel mit zwei Skripten, das dies zeigt.

Speichern Sie zuerst Folgendes als „skript_eins.sh“:

#!/bin/bash

variable_eins=alpha
variable_zwei=bravo

# Werte überprüfen
echo "$0: variable_eins=$variable_eins, variable_zwei=$variable_zwei"

export variable_eins
export variable_zwei

./skript_zwei.sh

# Werte erneut überprüfen
echo "$0: variable_eins=$variable_eins, variable_zwei=$variable_zwei"

Das Skript erstellt zwei Variablen, „variable_eins“ und „variable_zwei“ und weist ihnen Werte zu. Es gibt die Variablen im Terminal aus, exportiert sie und ruft „skript_zwei.sh“ auf. Wenn „skript_zwei.sh“ beendet wird und die Ausführung zum ersten Skript zurückkehrt, gibt es die Variablen nochmals im Terminal aus. So können Sie sehen, ob sie sich verändert haben.

Das zweite Skript, „skript_zwei.sh“, wird von „skript_eins.sh“ aufgerufen. Speichern Sie es mit folgendem Inhalt:

#!/bin/bash

# Werte überprüfen
echo "$0: variable_eins=$variable_eins, variable_zwei=$variable_zwei"

# neue Werte setzen
variable_eins=charlie
variable_zwei=delta

# Werte erneut überprüfen
echo "$0: variable_eins=$variable_eins, variable_zwei=$variable_zwei"

Dieses Skript gibt die Werte der beiden Variablen aus, weist ihnen neue Werte zu und gibt sie dann erneut aus.

Um die Skripte auszuführen, müssen Sie diese zuerst ausführbar machen:

chmod +x skript_eins.sh
chmod +x skript_zwei.sh

Starten Sie „skript_eins.sh“ mit folgendem Befehl:

./skript_eins.sh

Die Ausgabe zeigt Folgendes:

„skript_eins.sh“ gibt die Werte der Variablen aus, die „alpha“ und „bravo“ sind.
„skript_zwei.sh“ gibt die Werte der Variablen (alpha und bravo) so aus, wie es sie erhalten hat.
„skript_zwei.sh“ ändert sie zu „charlie“ und „delta“.
„skript_eins.sh“ gibt die Werte der Variablen aus, die immer noch „alpha“ und „bravo“ sind.

Was im zweiten Skript geschieht, bleibt im zweiten Skript. Es ist so, als ob Kopien der Variablen an das zweite Skript gesendet werden, die aber beim Beenden dieses Skripts verworfen werden. Die ursprünglichen Variablen im ersten Skript bleiben unberührt, egal was mit den Kopien im zweiten Skript geschieht.

Variablen mit Anführungszeichen verwenden

Vielleicht ist Ihnen aufgefallen, dass Skripte, die Variablen verwenden, oft in Anführungszeichen stehen. Dadurch können Variablen korrekt referenziert und ihre Werte genutzt werden, wenn die Zeile im Skript ausgeführt wird.

Wenn der Wert, den Sie einer Variablen zuweisen möchten, Leerzeichen enthält, müssen diese bei der Zuweisung in Anführungszeichen gesetzt werden, da die Bash Leerzeichen standardmäßig als Trennzeichen interpretiert.

Hier ein Beispiel:

name_seite=Beispiel Seite

Die Bash interpretiert das Leerzeichen vor „Seite“ als Hinweis, dass ein neuer Befehl gestartet wird. Sie meldet, dass es keinen solchen Befehl gibt. ‚echo‘ zeigt, dass die Variable „name_seite“ leer ist und nicht einmal den Text „Beispiel“ enthält.

Versuchen Sie es erneut mit Anführungszeichen um den Wert:

name_seite="Beispiel Seite"

Diesmal wird der gesamte Text als ein Wert erkannt und korrekt der Variablen „name_seite“ zugewiesen.

echo ist Ihr Freund

Es kann eine Weile dauern, bis Sie sich an Befehlssubstitution, die Verwendung von Anführungszeichen für Variablen und das Einfügen von Dollarzeichen an der richtigen Stelle gewöhnt haben.

Bevor Sie die Eingabetaste drücken, um eine Zeile mit Bash-Befehlen auszuführen, versuchen Sie es mit ‚echo‘ davor. Auf diese Weise können Sie sicherstellen, dass die Befehle wie gewünscht ausgeführt werden. Auch Syntaxfehler lassen sich so leicht erkennen.