Connect with us

Wie man

So arbeiten Sie mit Variablen in Bash

Warum stören sich die Leute immer noch mit ihnen?

Fatmawati Achmad Zaenuri / Shutterstock

Variablen sind wichtig, wenn Sie Skripte schreiben und verstehen möchten, wie sich der Code, den Sie aus dem Web ausschneiden und einfügen möchten, auf Ihren Linux-Computer auswirkt. Wir bringen Sie zum Laufen!

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 den Wert eingegeben, den sie anstelle des Namens der Variablen 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 weder mit einer Zahl beginnen noch Leerzeichen enthalten. Es kann jedoch mit einem Unterstrich beginnen. Abgesehen davon können Sie eine beliebige Mischung aus alphanumerischen Groß- und Kleinbuchstaben verwenden.

Beispiele

Hier erstellen wir fünf Variablen. Das Format besteht darin, den Namen und das Gleichheitszeichen einzugeben =und der Wert. Beachten Sie, dass vor oder nach dem Gleichheitszeichen kein Leerzeichen steht. Wenn Sie einer Variablen einen Wert geben, wird dies häufig als Wert für die Variable bezeichnet.

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

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

Fünf Variablen in einem Terminalfenster.

Zu siehe den Wert in einer Variablen gehalten, verwenden Sie die echo Befehl. Vor dem Variablennamen muss ein Dollarzeichen stehen $ Wann immer Sie auf den darin enthaltenen Wert verweisen, wie unten gezeigt:

echo $my_name
echo $my_boost
echo $this_year

Das "Echo" Befehl zum Anzeigen der Werte von Variablen in einem Terminalfenster.

Lassen Sie uns alle unsere Variablen gleichzeitig verwenden:

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

Das "Echo "$ my_boost ist für $ mich wie $ his_boost für $ ihn (c) $ this_year" Befehl in einem Terminalfenster.

Die Werte der Variablen ersetzen ihre Namen. Sie können auch die Werte von Variablen ändern. Um der Variablen einen neuen Wert zuzuweisen, my_boostSie wiederholen einfach, was Sie getan haben, als Sie den ersten Wert zugewiesen haben, wie folgt:

my_boost=Tequila

Das "my_boost = Tequila" Variable in einem Terminalfenster.

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 "$ my_boost ist für $ mich wie $ his_boost für $ ihn (c) $ this_year" Befehl in einem Terminalfenster.

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

Wir werden später über das Zitieren von Variablen sprechen. Im Moment sind hier einige Dinge zu beachten:

  • Eine Variable in einfachen Anführungszeichen ' wird als Literalzeichenfolge und nicht als Variable behandelt.
  • Variablen in Anführungszeichen " werden als Variablen behandelt.
  • Um den Wert in einer Variablen zu erhalten, müssen Sie das Dollarzeichen angeben $.
  • Eine Variable ohne Dollarzeichen $ Gibt nur den Namen der Variablen an.

Richtige und falsche Beispiele für das Referenzieren von Variablen in einem Terminalfenster.

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

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

Das Getränk des Jahres ="$ my_boost $ this_year" Befehl in einem Terminalfenster.

Verwendung von Variablen in Skripten

Skripte wären ohne Variablen völlig behindert. Variablen bieten die Flexibilität, die ein Skript eher zu einer allgemeinen als zu einer spezifischen Lösung macht. Um den Unterschied zu veranschaulichen, finden Sie hier ein Skript, das die Dateien in der Datei zählt /dev Verzeichnis.

Geben Sie dies in eine Textdatei ein und speichern Sie sie unter fcnt.sh (für „Anzahl der Dateien“):

#!/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 folgt ausführbar machen:

chmod +x fcnt.sh

"chmod + x fcnt.sh" in einem Terminalfenster.

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

./fcnt.sh

"./fcnt.sh" in einem Terminalfenster.

Dies druckt die Anzahl der Dateien in der /dev Verzeichnis. So funktioniert das:

  • Eine Variable namens folder_to_count ist definiert und enthält die Zeichenfolge „/ dev“.
  • Eine andere Variable namens file_count, ist definiert. Diese Variable bezieht ihren Wert aus einer Befehlsersetzung. Dies ist die Befehlsphrase zwischen den Klammern $( ). Beachten Sie, dass es ein Dollarzeichen gibt $ vor der ersten Klammer. Dieses Konstrukt $( ) wertet die Befehle in Klammern aus und gibt dann ihren endgültigen Wert zurück. In diesem Beispiel wird dieser Wert dem zugewiesen file_count Variable. Soweit das file_count Variable ist betroffen, es wird ein Wert übergeben, um zu halten; Es geht nicht darum, wie der Wert erhalten wurde.
  • Der in der Befehlsersetzung ausgewertete Befehl führt eine aus ls Dateiliste im Verzeichnis im folder_to_count Variable, die auf „/ dev“ gesetzt wurde. Das Skript führt also den Befehl „ls / dev“ aus.
  • Die Ausgabe dieses Befehls wird in die geleitet wc Befehl. Das -l (Zeilenanzahl) Option verursacht wc zu Zählen Sie die Anzahl der Zeilen in der Ausgabe von der ls Befehl. Da jede Datei in einer separaten Zeile aufgeführt ist, ist dies die Anzahl der Dateien und Unterverzeichnisse im Verzeichnis „/ dev“. Dieser Wert wird dem zugewiesen file_count Variable.
  • 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 arbeiten lassen? Alles was es braucht ist eine kleine Änderung.

Verwenden von Befehlszeilenparametern in Skripten

Viele Befehle, wie z ls und wcNehmen Sie die Befehlszeilenparameter. Diese stellen dem Befehl Informationen zur Verfügung, damit er weiß, was er tun soll. Falls Sie es wollen ls um an Ihrem Home-Verzeichnis zu arbeiten und auch um versteckte Dateien anzuzeigenkönnen Sie den folgenden Befehl verwenden, wobei die Tilde ~ und das -a (alle) Optionen sind Befehlszeilenparameter:

ls ~ -a

Unsere Skripte können Befehlszeilenparameter akzeptieren. Sie werden als bezeichnet $1 für den ersten Parameter $2 als zweite und so weiter bis $9 für den neunten Parameter. (Eigentlich gibt es eine $0, aber das ist reserviert, um immer das Skript zu halten.)

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

#!/bin/bash

folder_to_count=$1

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

echo $file_count files in $folder_to_count

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

Der Rest des Skripts funktioniert genauso wie zuvor. Anstelle einer bestimmten 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 machen Sie das Skript ausführbar:

chmod +x fcnt2.sh

"chmod + x fcnt2.sh" in einem Terminalfenster.

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

"./fnct2.sh / dev" in einem Terminalfenster.

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 verkürzen, können Sie auf die Variable verzichten. folder_to_countInsgesamt und nur als Referenz $1 durchgehend wie folgt:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Arbeiten mit speziellen Variablen

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

Die folgenden speziellen voreingestellten Variablen sind:

  • $ #: Wie viele Befehlszeilenparameter wurden an das Skript übergeben.
  • $ @: 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.
  • $ SEKUNDEN: Die Anzahl der Sekunden, die das Skript ausgeführt wurde.
  • $ ZUFÄLLIG: Gibt eine Zufallszahl zurück.
  • $ LINENO: Gibt die aktuelle Zeilennummer des Skripts zurück.

Sie möchten alle in einem Skript sehen, nicht wahr? Sie können! Speichern Sie Folgendes als Textdatei mit dem Namen: special.sh::

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: $@"
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

"chmod + x special.sh" in einem Terminalfenster.

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

"./special.sh alpha bravo charlie 56 2048 Donnerstag" in einem Terminalfenster.

Umgebungsvariablen

Bash verwendet Umgebungsvariablen, um die Eigenschaften der Umgebung zu definieren und aufzuzeichnen, die beim Start erstellt wird. Auf diese Informationen kann Bash problemlos zugreifen, z. B. Ihren Benutzernamen, Ihr Gebietsschema, die Anzahl der Befehle, die Ihre Verlaufsdatei enthalten kann, Ihren Standardeditor und vieles mehr.

Verwenden Sie diesen Befehl, um die aktiven Umgebungsvariablen in Ihrer Bash-Sitzung anzuzeigen:

env | less

Das "env |  weniger" Befehl in einem Terminalfenster

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

Eine Liste der aktiven Umgebungsvariablen in einem Terminalfenster.

So exportieren Sie Variablen

Wenn ein Skript ausgeführt wird, befindet es sich in einem eigenen Prozess, und die verwendeten Variablen können außerhalb dieses Prozesses nicht angezeigt werden. Wenn Sie eine Variable für ein anderes Skript freigeben möchten, das Ihr Skript startet, müssen Sie diese Variable exportieren. Wir zeigen Ihnen mit zwei Skripten, wie das geht.

Speichern Sie zunächst Folgendes mit 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"

Dadurch werden zwei Variablen erstellt: first_var und second_varund weist einige Werte zu. Diese werden im Terminalfenster gedruckt, die Variablen exportiert und aufgerufen script_two.sh. Wann script_two.sh Wird beendet und der Prozessablauf kehrt zu diesem Skript zurück. Die Variablen werden erneut im Terminalfenster gedruckt. 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.shAnrufe. 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, um sie ausführbar zu machen:

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

"chmod + x script_one.sh" und "chmod + x script_two.sh" in einem Terminalfenster.

Geben Sie zum Starten Folgendes ein script_one.sh::

./script_one.sh

"./script_one.sh" in einem Terminalfenster.

Dies 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 sie empfangen wurden.
  • script_two.sh ändert sie in Charlie und Delta.
  • script_one.sh Gibt die Werte der Variablen aus, die 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 sie werden verworfen, wenn dieses Skript beendet wird. Die ursprünglichen Variablen im ersten Skript werden durch nichts geändert, was mit den Kopien im zweiten Skript passiert.

So zitieren Sie Variablen

Möglicherweise haben Sie 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=How-To Geek

"site_name = How-To Geek" in einem Terminalfenster.

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 Leitung. echo zeigt uns, dass die site_name Variable enthält nichts – nicht einmal den „How-To“ -Text.

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

site_name="How-To Geek"

Site-Name ="How-To Geek" in einem Terminalfenster.

Dieses Mal wird es als einzelner Wert erkannt und dem korrekt zugewiesen site_name Variable.

Echo ist dein Freund

Es kann einige Zeit dauern, bis Sie sich daran gewöhnt haben, Befehle zu ersetzen, Variablen in Anführungszeichen zu setzen und sich daran zu erinnern, wann das Dollarzeichen eingefügt werden soll.

Bevor Sie die Eingabetaste drücken und eine Reihe von Bash-Befehlen ausführen, versuchen Sie es mit echo vor. Auf diese Weise können Sie sicherstellen, dass das, was passieren wird, Ihren Wünschen entspricht. Sie können auch Fehler auffangen, die Sie möglicherweise in der Syntax gemacht haben.

Continue Reading
Click to comment

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Tendencia