Spezielle Bash -Variablen mit Beispielen

Spezielle Bash -Variablen mit Beispielen

Bash ist eine großartige Codierungssprache, mit der Sie komplexe Dinge wie die Manipulation von Big Data machen oder einfache Skripte für Sever- oder Desktop -Management erstellen können.

Die für die Verwendung der Bash-Sprache erforderliche Einstiegsfähigkeit ist ziemlich niedrig, und Ein-Liner-Skripte (ein häufig verwendeter Jargon, das mehrere in der Befehlszeile ausgeführte Befehle angibt, die ein Mini-Skript bilden) sowie reguläre Skripte können wachsen in Komplexität (und wie gut sie geschrieben sind), wie der Bash -Entwickler mehr lernt.

Das Lernen, spezielle Variablen in Bash zu verwenden, ist ein Teil dieser Lernkurve. Während ursprünglich die besonderen Variablen kryptisch aussehen: $$, $?, $*, \ $ 0, $ 1 usw., Sobald Sie sie verstanden haben und in Ihren eigenen Skripten verwenden, werden die Dinge bald klarer und leichter zu erinnern.

In diesem Tutorial lernen Sie:

  • So verwenden Sie spezielle Variablen in Bash
  • So zitieren Sie Variablen korrekt, sogar besondere
  • Beispiele, die spezielle Variablen aus der Befehlszeile und Skripten verwenden

Spezielle Bash -Variablen mit Beispielen

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Linux-Verteilungsunabhängige
Software BASH -Befehlszeile, Linux -basiertes System
Andere Jedes Dienstprogramm, das standardmäßig nicht in der Bash -Shell enthalten ist sudo apt-Get Installieren Sie den Dienstprogramm (oder yum install Für Redhat -basierte Systeme)
Konventionen # - Erfordert, dass Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sudo Befehl
$-erfordert, dass Linux-Commands als regulärer nicht privilegierter Benutzer ausgeführt werden
  1. $$ - Zeigen Sie die PID an (Prozesskennung)

    In diesem Beispiel verwenden wir die spezielle Variable $$ um die anzuzeigen PID (Prozesskennung) Für unser aktuelles Programm. Dies funktioniert etwas anders, je nachdem, ob Sie diese Variable aus der Befehlszeile verwenden:

    $ echo $$ 316204 $ ps -f | grep -e "$$ | pid" uid pid ppid c Stime tty ty ty cmd roel 316204 62582 0 11:53 Punkte/2 00:00:00 Bash Roel 316499 316204 0 11:57 PTS/2 00:00:00 PS -PS - EF Roel 316500 316204 0 11:57 Punkte/2 00:00:00 Grep -e 316204 | PID 

    Oder aus einem Skript. Betrachten wir zum Beispiel das folgende Skript prüfen.Sch:

    echo $$ ps -f | grep -e "$$ | pid" 
    Kopieren

    Was, wenn wir es ausführbar machen (CHMOD +X -Test.Sch) und ausführen, produziert:

    $ chmod +x Test.Sh $ ./prüfen.SH 316820 UID PID PPID C STIME TTY TTY CMD ROEL 316820 316204 0 12:01 PTS/2 00:00:00 BASH ROEL 316821 316820 0 12:01 PTS/2 00:00 PS -EF ROEL 316822 316820 0 12 01 Punkte/2 00:00:00 Grep -e 316820 | PID 

    Der Unterschied liegt in der PID produziert! Dies mag auf den ersten Blick konzeptionell sinnvoll sein, aber lassen Sie uns den Hauptgrund erklären, warum die PID Unterscheidet sich: Wir verwenden eine andere Bash -Hülle. Der erste ausgeführte Befehl befand sich direkt in der Befehlszeile und damit unser Special $$ Variable (die die PID des aktuell laufenden Programms identifiziert) erzeugt die PID der derzeit laufenden Bash -Shell (Sein 316204).

    In der zweiten Instanz führen wir ein Skript aus und jeder Start eines Skripts startet immer eine neue Bash -Shell. Das Ergebnis ist, dass unsere PID ist der PID der neu gestarteten Bash Shell (316820). Wir können dies auch bestätigen, indem wir uns das ansehen Ppid (ich.e. Eltern PID, oder Der Elternteil des Prozesskennung) - es ist 316204 Was zu unserer Bash -Shell entspricht, aus der wir das Skript gestartet haben, wie im ersten Beispiel zu sehen ist (sowohl das erste als auch das zweite Beispiel wurden im selben Terminal auf derselben Maschine ausgeführt).

    Der grep -e Der Befehl in unseren beiden Beispielen ermöglicht es uns, die erste Zeile der vollständigen Prozessliste der Maschine zu erfassen (wie er erhalten von von PS -f) durch Ermöglichen der erweiterten Regex -Unterstützung und Grepping für PID neben unserem PID (durch die Nutzung $$). Der | ist das erweiterte reguläre Expressionsabscheider, das diese doppelte Erfassung ermöglicht.

    Weitere Informationen zu regulären Ausdrücken finden Sie in unseren Bash Regexps für Anfänger mit Beispielen und erweiterten Bash Regex mit Beispielenartikeln.

    Beachten Sie auch, dass wir die PID -Erfassung durch Verwendung automatisiert haben $$ im Grep Befehl. Das $$ Variable ändert sich nie, es sei denn, eine neue Bash -Shell / Unterschale wird gestartet, wie wir im folgenden Beispiel sehen können:

    $ echo $$ 316204 $ bash $ echo $$ 318023 $ echo $ PPID 316204 

    Der PID unserer Haupt -Bash -Hülle ist immer noch 316204 wie vorher. Als nächstes beginnen wir eine neue Unterschale und die PID dieser neuen Hülle ist 318023 Bei inspiziert. Und mit der automatisch festgelegten (nach bash) Variablen $ Ppid Wir können das bestätigen Ppid (Übergeordnete Prozess -ID) der sekundären Bash -Shell/Subshell als 316204, die zu unserer Hauptschale entspricht. Wie Sie sehen können, in Bezug auf das Prozessmanagement und insbesondere die $$ Variable, es gibt keinen großen Unterschied zwischen dem Starten eines Skripts und einer neuen Unterschale.

    Weitere Informationen zum Bash -Prozessmanagement finden Sie in unserem Bash -Hintergrund -Prozessmanagement und unserem Prozessmanagement und automatischen Prozessabschlussartikeln.



  2. $? - Code beenden

    Der $? Variable sagt uns, was die Code beenden war vom vorherigen Befehl. Kennt der Code beenden einer ausgeführten Anweisung ermöglicht es uns, ein Skript in zwei oder mehr verschiedene Richtungen fortzusetzen. Zum Beispiel, wenn wir eine begonnen haben rm Befehl (um einige Dateien aus einem Programm zu löschen), möchten wir möglicherweise überprüfen, ob der Prozess erfolgreich abgeschlossen wurde.

    Wenn der Code beenden Ist 0, Es bedeutet im Allgemeinen (laut: fast immer), dass ein Prozess erfolgreich beendet wurde. Wenn jedoch die Code beenden Ist 1 (oder mehr) es bedeutet oft (wenn auch nicht immer), dass der Prozess mit einem Fehler oder einem negativen Ergebnis terminiert wurde. Zum Beispiel konnte die Datei in unserem Beispiel nicht gelöscht werden. Mal sehen, wie dies in der Befehlszeile funktioniert.

    $ berühre das.existiert $ rm dies.existiert $ echo $? 0 $ rm das.tut.nicht.existieren rm: kann das nicht entfernen '.tut.nicht.existieren ': Keine solche Datei oder Verzeichnis $ echo $? 1 

    Wir erstellen zuerst eine Datei Das.existiert durch Verwendung der berühren Befehl. berühren Erstellt einfach eine Datei mit Nullgröße, ohne etwas darauf zu schreiben. Als nächstes entfernen wir die Datei mithilfe rm das.existiert und anzeigen die $? Code beenden Sie mit Echo. Das Ergebnis ist 0, da der Befehl so erfolgreich war, wie erwartet.

    Als nächstes versuchen wir, eine Datei zu löschen, die nicht existiert, und einen Fehler erhalten. Wenn wir den Exit -Code überprüfen, ist dies in der Tat 1 Es ist ein Fehler angezeigt, der aufgetreten ist. Wir können den Wert dieser Variablen leicht aus der Befehlszeile oder innerhalb eines Skripts unter Verwendung eines überprüfen Wenn [$? -Gl 0]; Dann oder eine ähnliche bedingte Aussage (beendet von fi).

    Mehr darüber lernen Wenn Basierte Aussagen, siehe Bash if Anweisungen, wenn elif sonst dann fi. Kombinieren $? mit Wenn Aussagen sind üblich und mächtig, um verschiedene Dinge in Bash zu automatisieren.

  3. $ 1, $ 2,… $* - Argumente übergeben

    Wenn wir ein Skript in der Bash -Befehlszeile starten, können wir Argumente an dasselbe weitergeben. Es liegt vollständig vom Skript, die an sie übergebenen Argumente zu bewältigen. Wenn das Skript beispielsweise überhaupt keine Argumente bearbeitet (der Standard), gibt es keine Konsequenz, wenn Sie entweder angeben oder nicht angeben, oder viele Variablen zu einem Skript.

    Wir können über bestehende Argumente handeln, indem wir die speziellen Variablen verwenden $ 1, $ 2, $* usw. Das erste Argument, das dem Skript übergeben wird $ 1, Das zweite Argument wird immer sein $ 2 usw. Eine Sache, auf die Sie achten sollten, ist, dass Bash diesen Speicherplatz als Trennzeichen interpretiert, wenn Sie einen Speicherplatz in einem standardgesteuerten Bash -Client einführen.

    Wenn Sie versuchen, einen Text wie zum Beispiel zu übergeben dies ist ein Beispiel Sie müssten es richtig zitieren: "dies ist ein Beispiel"; Damit Bash diesen Text als eine einzelne Variable ansieht, die übergeben wird.



    Das Sonderangebot $* Variable ist eine Abkürzung zum Schreiben Alle Variablen in eine einzelne Zeichenfolge. Mal sehen, wie dies funktioniert, indem wir ein neues definieren Test2.Sch Skript wie folgt:

    echo "1: $ 1" echo "2: $ 2" echo "All: $ *" 
    Kopieren

    Als geringfügige Variation haben wir uns entschieden, unsere Variablen hier als zu definieren $ 1 Zu $ * anstatt $ 1 Zu $*. In der Tat wäre es eine gute Idee, Variablen immer auf diese Weise zu zitieren. Weitere Informationen finden Sie in unserer korrekten Variablen -Parsen und Zitat im Bash -Artikel.

    Wenn wir dasselbe ausführen und entweder zwei oder drei Argumente verwenden, sehen wir:

    $ chmod +x test2.Sh $ ./test2.Sh '1 "2' 1: 1 2: 2 All: 1 2 $ ./test2.sh '1 "2" 3' 1: 1 2: 2 All: 1 2 3 

    Wir können sehen, wie unsere erste Eingabe des Skripts als korrekt erkannt wird $ 1 usw. Wir stellen auch fest, dass das dritte Argument vom Skript vollständig ignoriert wird, bis er das erreicht hat Echo "All: $ *" Anweisungen, der tatsächlich alle Argumente zeigt, wie zuvor erläutert. Lassen Sie uns nun eine falsche Eingabe untersuchen, ohne zu zitieren:

    $ ./test2.SH Das soll ein einzelner Satz sein. 1: Dies 2: ist alles: Dies soll ein einzelner Satz sein. $ ./test2.SH "Dies soll ein einzelner Satz sein."1: Dies soll ein einzelner Satz sein. 2: Alles: Dies soll ein einzelner Satz sein. 

    Hier wird klar, wie ein Raum als Trennzeichen anstelle eines tatsächlichen Raums interpretiert werden kann, es sei denn, der Text ist ordnungsgemäß zitiert. Im ersten Ergebnis, Das wird als erstes Argument angesehen, während im zweiten Ergebnis der gesamte Satz als erstes Argument angesehen wird.



  4. $ 0 - Der Befehl ausgeführt

    Über gelernt haben $ 1, Man könnte sich fragen, was die \ $ 0 Spezielle Variable. Wenn Sie darüber nachdenken, wie ein Befehl gebildet wird (Befehlsargument1 Argument2 usw.), Sie können bemerken, wie Befehl kommt vor dem ersten Argument ($ 1). Der Befehl in gewisser Weise ist so - visuell - \ $ 0, Und genau das ist das Besondere \ $ 0 Variable enthält; Der Befehl läuft.

    $ echo \ $ 0 Bash 

    Wie wir in der Befehlszeile sehen und als Sinn ergeben, ist der derzeit ausgeführte Befehl verprügeln. Wenn wir das hinzufügen echo \ $ 0 Befehl zu einem Testskript Test3.Sch und das gleiche ausführen, wir bekommen:

    $ ./test3.Sch ./test3.SH $… /Arbeitsbereich /Test3.SH… /Arbeitsbereich /Test3.Sch 

    Wie jetzt ist der derzeit laufende Befehl ./test3.Sch, genau wie aus der Befehlszeile ausgeführt. Wenn wir den Befehl mit einem längeren Pfadnamen starten wie wie … /Arbeitsbereich /Test3.Sch Andererseits wird dies über das Special wieder wiederholt \ $ 0 Variable.

Abschluss

In diesem Artikel haben wir das untersucht $$, $?, $ 1, $ 2 usw., $* Und \ $ 0 Variablen, wie sie funktionieren und wie Sie sie entweder direkt aus der Befehlszeile oder aus Skripten verwenden können. Es gibt einige andere besondere Variablen, aber dies sind die wichtigsten besonderen Variablen in Bash, die ich in vielen Jahren der Bash -Codierung verwendet habe. Genießen!

Verwandte Linux -Tutorials:

  • Abrufen von Webseiten mit WGet, Curl und Lynx
  • Big Data Manipulation zum Spaß und Gewinn Teil 1
  • Big Data Manipulation zum Spaß und Gewinn Teil 3
  • Beispiele des Linux-Komplexes Bash-Ein-Liner
  • Big Data Manipulation zum Spaß und Gewinn Teil 2
  • Verschachtelte Schleifen in Bash -Skripten
  • Mastering -Bash -Skriptschleifen beherrschen
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Schleifen mit Beispielen verprügeln