So arbeiten Sie mit Variablen in Bash

Variablen sind von entscheidender Bedeutung, wenn Sie Skripte schreiben und verstehen möchten, was der Code, den Sie aus dem Web ausschneiden und einfügen möchten, auf Ihrem Linux-Computer bewirkt. Wir machen Sie startklar!

Variablen 101

Variablen sind benannte Symbole, die entweder eine Zeichenfolge oder einen numerischen Wert darstellen. Wenn Sie sie in Befehlen und Ausdrücken verwenden, werden sie so behandelt, als hätten Sie statt des Variablennamens den Wert eingegeben, den sie enthalten.

Um eine Variable zu erstellen, geben Sie einfach einen Namen und einen Wert dafür ein. Ihre Variablennamen sollten beschreibend sein und Sie an den Wert erinnern, den sie enthalten. Ein Variablenname darf nicht mit einer Zahl beginnen und darf auch keine Leerzeichen enthalten. Es kann jedoch mit einem Unterstrich beginnen. Abgesehen davon können Sie jede beliebige Mischung aus alphanumerischen Groß- und Kleinbuchstaben verwenden.

Beispiele

Hier erstellen wir fünf Variablen. Das Format besteht darin, den Namen, das Gleichheitszeichen = und den Wert einzugeben. Beachten Sie, dass vor oder nach dem Gleichheitszeichen kein Leerzeichen steht. Einer Variablen einen Wert zuzuweisen wird oft als Zuweisen eines Wertes zu einer Variablen bezeichnet.

Wir erstellen vier String-Variablen und eine numerische Variable, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

Zu den Wert sehen in einer Variablen gespeichert ist, verwenden Sie den echo-Befehl. Sie müssen dem Variablennamen ein Dollarzeichen $ voranstellen, wenn Sie auf den darin enthaltenen Wert verweisen, wie unten gezeigt:

echo $my_name
echo $my_boost
echo $this_year

Der

Lassen Sie uns alle unsere Variablen gleichzeitig verwenden:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Der

Die Werte der Variablen ersetzen ihre Namen. Sie können auch die Werte von Variablen ändern. Um der Variablen my_boost einen neuen Wert zuzuweisen, wiederholen Sie einfach das, was Sie beim Zuweisen des ersten Werts getan haben, wie folgt:

my_boost=Tequila

Der

Wenn Sie den vorherigen Befehl erneut ausführen, erhalten Sie jetzt ein anderes Ergebnis:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Das Echo

Sie können also denselben Befehl verwenden, der auf dieselben Variablen verweist und unterschiedliche Ergebnisse erhalten, wenn Sie die in den Variablen enthaltenen Werte ändern.

Wir werden später über das Zitieren von Variablen sprechen. Hier sind einige Dinge, die Sie sich vorerst merken sollten:

Eine Variable in einfachen Anführungszeichen ‚ wird als Literalzeichenfolge und nicht als Variable behandelt.
Variablen in Anführungszeichen ” werden als Variablen behandelt.
Um den in einer Variablen gespeicherten Wert zu erhalten, müssen Sie das Dollarzeichen $ angeben.
Eine Variable ohne Dollarzeichen $ liefert nur den Namen der Variablen.

Sie können auch eine Variable erstellen, deren Wert einer vorhandenen Variablen oder Anzahl von Variablen entnommen wird. Der folgende Befehl definiert eine neue Variable namens drink_of_the_Year und weist ihr die kombinierten Werte der Variablen my_boost und this_year zu:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Das Getränk_des_Jahres=

So verwenden Sie Variablen in Skripten

Skripte wären ohne Variablen völlig gelähmt. Variablen bieten die Flexibilität, die ein Skript zu einer allgemeinen und nicht zu einer spezifischen Lösung macht. Um den Unterschied zu veranschaulichen, ist hier ein Skript, das die Dateien im Verzeichnis /dev zählt.

  7 nostalgische Halloween-Websites aus den 90er und 2000er Jahren

Geben Sie dies in eine Textdatei ein und speichern Sie sie als fcnt.sh (für „Dateianzahl“):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Bevor Sie das Skript ausführen können, müssen Sie es wie unten gezeigt ausführbar machen:

chmod +x fcnt.sh

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

./fcnt.sh

Dies gibt die Anzahl der Dateien im /dev-Verzeichnis aus. So funktioniert das:

Es wird eine Variable namens folder_to_count definiert, die die Zeichenfolge „/dev“ enthält.
Eine weitere Variable namens file_count ist definiert. Diese Variable bezieht ihren Wert aus einer Befehlsersetzung. Dies ist die Befehlsphrase zwischen den Klammern $( ). Beachten Sie, dass vor der ersten Klammer ein Dollarzeichen $ steht. Dieses Konstrukt $( ) wertet die Befehle innerhalb der Klammern aus und gibt dann ihren Endwert zurück. In diesem Beispiel wird dieser Wert der Variablen file_count zugewiesen. Was die Variable file_count betrifft, wird ihr ein Wert zum Halten übergeben; es geht nicht darum, wie der Wert ermittelt wurde.
Der in der Befehlsersetzung ausgewertete Befehl führt eine ls-Dateiauflistung im Verzeichnis in der Variable folder_to_count aus, die auf „/dev“ gesetzt wurde. Das Skript führt also den Befehl „ls /dev“ aus.
Die Ausgabe dieses Befehls wird an den Befehl wc weitergeleitet. Die Option -l (Zeilenzahl) bewirkt, dass wc zähle die anzahl der zeilen in der Ausgabe des ls-Befehls. Da jede Datei in einer separaten Zeile aufgeführt ist, ist dies die Anzahl der Dateien und Unterverzeichnisse im Verzeichnis „/dev“. Dieser Wert wird der Variablen file_count zugewiesen.
Die letzte Zeile verwendet echo, um das Ergebnis auszugeben.

Dies funktioniert jedoch nur für das Verzeichnis „/dev“. Wie können wir das Skript mit jedem Verzeichnis zum Laufen bringen? Alles was es braucht ist eine kleine Änderung.

So verwenden Sie Befehlszeilenparameter in Skripten

Viele Befehle wie ls und wc benötigen Befehlszeilenparameter. Diese liefern dem Befehl Informationen, damit er weiß, was er tun soll. Wenn Sie möchten, dass ls an Ihrem Home-Verzeichnis arbeitet und auch um versteckte Dateien anzuzeigen, können Sie den folgenden Befehl verwenden, wobei die Option tilde ~ und die Option -a (all) Befehlszeilenparameter sind:

ls ~ -a

Unsere Skripte können Befehlszeilenparameter akzeptieren. Sie werden als $1 für den ersten Parameter, $2 als zweiten usw. bezeichnet, bis hin zu $9 für den neunten Parameter. (Eigentlich gibt es auch ein $0, aber das ist reserviert, um immer das Skript zu speichern.)

Sie können in einem Skript auf Befehlszeilenparameter wie auf reguläre Variablen verweisen. Lassen Sie uns unser Skript wie unten gezeigt ändern und unter dem neuen Namen fcnt2.sh speichern:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Diesmal wird der Variablen folder_to_count der Wert des ersten Befehlszeilenparameters $1 zugewiesen.

Der Rest des Skripts funktioniert genauso wie zuvor. Anstelle einer spezifischen Lösung ist Ihr Skript jetzt ein allgemeines. Sie können es in jedem Verzeichnis verwenden, da es nicht fest codiert ist, um nur mit „/dev“ zu arbeiten.

  So beheben Sie die erneute Übermittlung des Formulars bei einem Aktualisierungsfehler bestätigen

So machen Sie das Skript ausführbar:

chmod +x fcnt2.sh

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

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Sie erhalten das gleiche Ergebnis (207 Dateien) wie zuvor für das Verzeichnis „/dev“. Dies ist ermutigend, und Sie erhalten verzeichnisspezifische Ergebnisse für jeden der anderen Befehlszeilenparameter.

Um das Skript zu kürzen, könnten Sie ganz auf die Variable folder_to_count verzichten und nur durchgängig auf $1 verweisen, wie folgt:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Arbeiten mit speziellen Variablen

Wir haben $0 erwähnt, das immer auf den Dateinamen des Skripts gesetzt wird. Auf diese Weise können Sie das Skript verwenden, um beispielsweise seinen Namen korrekt auszugeben, selbst wenn er umbenannt wurde. Dies ist in Protokollierungssituationen nützlich, in denen Sie den Namen des Prozesses wissen möchten, der einen Eintrag hinzugefügt hat.

Im Folgenden sind die anderen speziellen voreingestellten Variablen aufgeführt:

$#: Wie viele Befehlszeilenparameter an das Skript übergeben wurden.
[email protected]: Alle an das Skript übergebenen Befehlszeilenparameter.
$?: 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, für die das Skript ausgeführt wurde.
$RANDOM: Gibt eine Zufallszahl zurück.
$LINENO: Gibt die aktuelle Zeilennummer des Skripts zurück.

Sie wollen sie alle in einem Skript sehen, nicht wahr? Sie können! Speichern Sie Folgendes als Textdatei namens special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: [email protected]"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Geben Sie Folgendes ein, um es ausführbar zu machen:

chmod +x special.sh

Jetzt können Sie es mit einer Reihe verschiedener Befehlszeilenparameter ausführen, wie unten gezeigt.

Umgebungsvariablen

Die Bash verwendet Umgebungsvariablen, um die Eigenschaften der Umgebung zu definieren und aufzuzeichnen, die sie beim Start erstellt. Diese enthalten Informationen, auf die Bash leicht zugreifen kann, z. B. Ihren Benutzernamen, Ihr Gebietsschema, die Anzahl der Befehle, die Ihre Verlaufsdatei enthalten kann, Ihren Standardeditor und vieles mehr.

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

env | less

Der

Wenn Sie durch die Liste blättern, finden Sie möglicherweise einige, auf die Sie in Ihren Skripten verweisen können.

So exportieren Sie Variablen

Wenn ein Skript ausgeführt wird, befindet es sich in einem eigenen Prozess, und die verwendeten Variablen sind außerhalb dieses Prozesses nicht sichtbar. Wenn Sie eine Variable mit einem anderen Skript teilen möchten, das Ihr Skript startet, müssen Sie diese Variable exportieren. Wie das geht, zeigen wir Ihnen mit zwei Skripten.

  So erstellen und importieren Sie einen Bitmoji-Avatar in Snapchat

Speichern Sie zunächst Folgendes unter dem Dateinamen script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Dies erstellt zwei Variablen, first_var und second_var, und weist einige Werte zu. Es druckt diese in das Terminalfenster, exportiert die Variablen und ruft script_two.sh auf. Wenn script_two.sh beendet wird und der Prozessfluss zu diesem Skript zurückkehrt, gibt es die Variablen erneut im Terminalfenster aus. Dann können Sie sehen, ob sie sich geändert haben.

Das zweite Skript, das wir verwenden werden, ist script_two.sh. Dies ist das Skript, das script_one.shaufruft. Geben Sie Folgendes ein:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

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

Um diese Skripte auszuführen, müssen Sie Folgendes eingeben, damit sie ausführbar sind:

chmod +x script_one.sh
chmod +x script_two.sh

Geben Sie nun Folgendes ein, um script_one.sh zu starten:

./script_one.sh

Das sagt uns die Ausgabe:

script_one.sh gibt die Werte der Variablen aus, die Alpha und Bravo sind.
script_two.sh gibt die Werte der Variablen (alpha und bravo) so aus, wie es sie erhalten hat.
script_two.sh ändert sie in Charlie und Delta.
script_one.sh gibt die Werte der Variablen aus, die immer noch Alpha und Bravo sind.

Was im zweiten Skript passiert, bleibt im zweiten Skript. Es ist, als würden Kopien der Variablen an das zweite Skript gesendet, aber beim Beenden dieses Skripts verworfen. Die ursprünglichen Variablen im ersten Skript werden durch nichts verändert, was mit den Kopien von ihnen im zweiten passiert.

So zitieren Sie Variablen

Sie haben vielleicht bemerkt, dass Skripte, die auf Variablen verweisen, in Anführungszeichen stehen „. Dadurch können Variablen korrekt referenziert werden, sodass ihre Werte verwendet werden, wenn die Zeile im Skript ausgeführt wird.

Wenn der Wert, den Sie einer Variablen zuweisen, Leerzeichen enthält, müssen diese in Anführungszeichen gesetzt werden, wenn Sie sie der Variablen zuweisen. Dies liegt daran, dass Bash standardmäßig ein Leerzeichen als Trennzeichen verwendet.

Hier ist ein Beispiel:

site_name=1techpc.de

Bash sieht das Leerzeichen vor „Geek“ als Hinweis darauf, dass ein neuer Befehl gestartet wird. Es meldet, dass es keinen solchen Befehl gibt, und verlässt die Zeile. echo zeigt uns, dass die Variable site_name nichts enthält – nicht einmal den „How-To“-Text.

Versuchen Sie es erneut mit Anführungszeichen um den Wert, wie unten gezeigt:

site_name="1techpc.de"

site_name=

Diesmal wird es als einzelner Wert erkannt und der Variablen site_name richtig zugewiesen.

echo ist dein Freund

Es kann einige Zeit dauern, sich daran zu gewöhnen, die Ersetzung zu befehlen, Variablen zu zitieren und sich daran zu erinnern, wann das Dollarzeichen eingefügt werden muss.

Bevor Sie die Eingabetaste drücken und eine Zeile mit Bash-Befehlen ausführen, versuchen Sie es mit Echo davor. Auf diese Weise können Sie sicherstellen, dass das passiert, was Sie wollen. Sie können auch eventuelle Fehler in der Syntax abfangen.