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 einzugeben, das Gleichheitszeichen =, und der Wert. 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 gehalten, verwenden Sie die echo Befehl. Dem Variablennamen muss ein Dollarzeichen vorangestellt werden $ wann immer Sie auf den darin enthaltenen Wert verweisen, wie unten gezeigt:

echo $my_name
echo $my_boost
echo $this_year

Lassen Sie uns alle unsere Variablen gleichzeitig verwenden:

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


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

my_boost=Tequila

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"

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 ihm die kombinierten Werte der my_boost und this_year Variablen:

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

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, hier ist ein Skript, das die Dateien im /dev Verzeichnis.


Geben Sie dies in eine Textdatei ein und speichern Sie sie dann unter 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 druckt die Anzahl der Dateien im /dev Verzeichnis. So funktioniert das:

  • Eine Variable namens folder_to_count ist definiert und enthält die Zeichenfolge „/dev“.
  • Eine andere Variable, genannt file_count, ist definiert. Diese Variable bezieht ihren Wert aus einer Befehlsersetzung. Dies ist der Befehlssatz 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 Endwert zurück. In diesem example, dieser Wert wird dem . zugewiesen file_count Variable. Soweit der file_count Variable betrifft, ihr wurde ein zu haltender Wert übergeben; es geht nicht darum, wie der Wert ermittelt wurde.
  • Der in der Befehlsersetzung ausgewertete Befehl führt eine ls Dateiauflistung 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 wc Befehl. Die -l (Zeilenzahl) Option Ursachen wc zu zähle die anzahl der zeilen in der Ausgabe von 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 zum Laufen bringen? Alles was es braucht ist eine kleine Änderung.

So verwenden Sie Befehlszeilenparameter in Skripten

Viele Befehle, wie z ls und wc, Befehlszeilenparameter übernehmen. Diese liefern dem Befehl Informationen, damit er weiß, was er tun soll. Falls Sie es wollen ls um an Ihrem Home-Verzeichnis zu arbeiten und auch um versteckte Dateien anzuzeigen, können Sie den folgenden Befehl verwenden, wobei die Tilde ~ und der -a (all) Option sind Befehlszeilenparameter:

ls ~ -a

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


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 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 Variable wird der Wert des ersten Kommandozeilenparameters zugewiesen, $1.

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 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önnte man auf die Variable verzichten, folder_to_count, insgesamt und nur 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, die 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 Beendigungsstatus 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.
  • $zufällig: Gibt eine Zufallszahl zurück.
  • $ LINENO: Gibt die aktuelle Zeilennummer des Skripts zurück.


Sie wollen sie alle in einem Skript sehen, nicht wahr? Du kannst! Speichern Sie Folgendes als Textdatei mit dem Namen 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

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.

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"


Dadurch entstehen zwei Variablen, first_var und second_var, und weist einige Werte zu. Es druckt diese in das Terminalfenster, exportiert die Variablen und ruft auf script_two.sh. Wann 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.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, damit sie ausführbar sind:

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

Und jetzt geben Sie Folgendes ein, um zu starten script_one.sh:

./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 druckt die Werte der Variablen (Alpha und Bravo) so, 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 example:

site_name=How-To Geek

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 site_name Variable enthält nichts – nicht einmal den „How-To“-Text.

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

site_name="How-To Geek"

Diesmal wird es als einzelner Wert erkannt und dem site_name Variable.

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 du triffst Enter und führen Sie eine Reihe von Bash-Befehlen aus, versuchen Sie es mit echo vor. Auf diese Weise können Sie sicherstellen, dass das passiert, was Sie wollen. Sie können auch eventuelle Fehler in der Syntax abfangen.

Linux-Befehle
DateienTeer · pv · Katze · tac · chmod · grep · unterschied · sed · Mit · Mann · geschoben · popd · fsck · Testdisk · seq · fd · pandoc · CD · $PFAD · awk · beitreten · jq · falten · einzigartig · journalctl · Schwanz · stat · ls · fstab · Echo · weniger · chgrp · chown · Rev · aussehen · Saiten · Typ · umbenennen · Postleitzahl · entpacken · montieren · ummount · Installieren · fdisk · mkfs · rm · rmdir · rsync · df · gpg · wir · Nano · mkdir · von · ln · Patch · Konvertieren · rclon · Fetzen · srm
Prozessealias · Bildschirm · oben · nett · renice · Fortschritt · strace · System · tmux · chsh · Geschichte · bei · Charge · kostenlos · welcher · dmesg · chfn · Benutzermod · ps · chroot · xargs · tty · kleiner Finger · lsof · vmstat · Auszeit · Mauer · Jawohl · töten · Schlaf · sudo · es ist · Zeit · groupadd · Benutzermod · Gruppen · lshw · abschalten · neustarten · Halt · ausschalten · passwd · lscpu · crontab · Datum · bg · fg
Vernetzungnetstat · Klingeln · Traceroute · ip · ss · Wer ist · fail2ban · bmon · Sie · Finger · nmap · ftp · curl · wget · Wer · Wer bin ich · w · iptables · ssh-keygen · ufw

Beste Linux-Laptops für Entwickler und Enthusiasten

Related Posts