Umfeld
Um alle Funktionen der Bash -Shell -Erweiterungen zu testen, müssen wir sicherstellen, dass wir eine kürzlich durchgeführte Version von Bash ausführen. Nachfolgend finden Sie die Systeminformationen für diesen Artikel. Die Tests in diesem Artikel laufen auf Ubuntu 19.10 Wie unten gezeigt.
$ uname -a
Linux Instance-1 5.3.0-1014-GCP #15-UBUNTU SMP TUE MAR 3 04:14:57
UTC 2020 x86_64 x86_64 x86_64 gnu/linux
Die Bash -Version für diese Tests ist Bash Version 5, die ziemlich aktuell ist. Ältere Versionen von Bash fehlen eine Reihe von Funktionen.
$ bash -Verssion
Gnu Bash, Version 5.0.3 (1) -Release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
Lizenz GPLV3+: GNU GPL Version 3 oder höher
Befehlssubstitution
Die Befehlsubstitution ermöglicht das Ausführen eines oder mehrerer Befehle und das Erfassen von Ausgängen und Aktionen aus diesen Befehlen und in einem anderen Befehl alle in einer Zeile oder weniger Zeilen als alle Befehle separat auszuführen. Befehlssubstitution hat zwei Syntaxe; Die beliebtere Syntax ist die Backtick -Syntax, in der der zu ausgeführte Befehl in zwei Backquotes oder Backticks eingeschlossen ist. Die andere Syntax, bei der es ebenso leistungsfähig ist. Schauen wir uns eine Reihe von Beispielen für die Befehlssubstitution unten an.
Einfache Befehlssubstitution mit $ () Syntax, um den Befehl Datum auszuführen.
$ echo $ (Datum)
Mi 18. März 01:42:46 UTC 2020
Einfache Befehlssubstitution mithilfe der Backtick -Syntax, um den Befehl Datum auszuführen.
$ echo 'Datum'
Mi 18. März 01:43:17 UTC 2020
Die Verwendung des STDIN -Operators zu Beginn der Befehlssubstitutionssyntax ist eine ausgefallene Möglichkeit, den Text einer Datei in eine Variable zu lesen und in einem Befehl auf der Shell wie unten zu verwenden.
$ echo "Hallo Welt"> Mytext
$ echo $ (< mytext)
Hallo Welt
Lesen.
$ echo "Hallo Welt"> Mytext
$ echo $ (Cat Mytext)
Hallo Welt
Lesen Sie eine Datei wie oben und verwenden.
$ echo "Hallo Welt"> Mytext
$ echo 'cat mytext'
Hallo Welt
Kombinieren Sie die eingebettete Befehlssubstitution mit einer anderen Befehlssubstitution mit $ () und Backticks zusammen
$ echo 'echo $ (Datum) | Cut -d "" -f 1'> myfile
$ cat myfile
Heiraten
Eingebettete Befehlssubstitution in einem anderen unter Verwendung von zwei $ () Syntaxoperationen
$ echo "Heute ist $ (echo $ (Datum) | Cut -d" "-F 1)"> myfile
$ cat myfile
Heute ist verheiratet
Verwenden Sie die Ausgabe von einem Befehl als Argumente in einen anderen Befehl mit der Backtick -Syntax. Wir erhalten eine Liste von Dateien, indem wir Katze ausführen, die eine Datei pro Zeile enthält, und diese dann in den Befehl rm übergeben, der jede Datei entfernt
$ touch eins; Berühren Sie zwei
$ echo One> myFiles; Echo zwei >> myFiles
$ rm 'cat myfiles' '
Geben Sie das gleiche wie oben, aber mit $ () Syntax die Befehlsausgabe von CAT in den Befehl rm über, um Dateien zu löschen.
$ touch eins; Berühren Sie zwei
$ echo One> myFiles; Echo zwei >> myFiles
$ rm $ (Cat MyFiles)
Speichern Sie die Ausgabe von einem CAT.
$ touch eins; Berühren Sie zwei
$ echo One> myFiles; Echo zwei >> myFiles
$ MyFiles = $ (Katzenmyfiles)
$ für f in $ myFiles; wiederholt $ f; rm $ f; Erledigt
eins
zwei
Gleich wie oben, aber verwenden.
$ touch eins; Berühren Sie zwei
$ echo One> myFiles; Echo zwei >> myFiles
$ MyFiles = 'Cat MyFiles'
$ für f in $ myFiles; wiederholt $ f; rm $ f; Erledigt
eins
zwei
Verwenden Sie die Befehlssubstitution durch den Stdin -Operator, um eine Dateizeile per Zeile in eine Variable zu lesen und dann die variablen Nachworte durchzuführen
$ touch eins; Berühren Sie zwei
$ echo One> myFiles; Echo zwei >> myFiles
$ MyFiles = $ (< myfiles)
$ für f in $ myFiles; wiederholt $ f; rm $ f; Erledigt
eins
zwei
Prozesssubstitution
Die Prozessersubstitution ist ein dokumentiertes Merkmal von Bash. Es ist meiner Meinung nach ziemlich kryptisch. Tatsächlich habe ich nicht viele gute Anwendungsfälle gefunden, die ich dafür empfehlen kann. Ein Beispiel ist hier zur Vollständigkeit enthalten. In diesem Beispiel werden die Liste der Dateien in umgekehrter Reihenfolge mit dem Befehl sortiert.
$ touch eins.txt; Berühren Sie zwei.txt; drei berühren.txt
$ sortieren -r <(ls *txt)
zwei.txt
drei.txt
eins.txt
Variable Substitution
Die variable Substitution ist das, was Sie in Betracht ziehen können, die Variablen zu verwenden und den Wert der Variablen zu ersetzen, wenn sie verwiesen wird. Es ist ziemlich intuitiv, einige Beispiele finden Sie unten.
Einfache variable Zuordnung und Verwendung, bei der wir eine Zeichenfolge in die Variable x einfügen und sie dann in STDOut drucken
$ X = 12345
$ echo $ x
12345
Überprüfen Sie, ob eine Variable etwas oder Null zugewiesen wird. In diesem Fall wird sie zugewiesen, damit wir sie an stdout drucken
$ X = 12345
$ wenn [-z "$ x"]; dann echo "x ist null"; sonst wiederholt $ x; fi
12345
Überprüfen Sie, ob einer Variablen etwas oder Null zugewiesen wird. In diesem Fall ist sie nicht festgelegt, sodass wir „Null“ anstelle des Werts drucken.
$ uneingestellter x
$ wenn [-z "$ x"]; dann echo "x ist null"; sonst wiederholt $ x; fi
X ist null
Ausdehnung der Klammer
Die Erweiterung der Klammer ist eine sehr leistungsstarke Funktion von Bash, mit der Sie kompaktere Skripte und Befehle schreiben können. Es hat viele verschiedene Funktionen und Optionen, die unten beschrieben wurden. Innerhalb der Klammern wird Ihre Syntax in eine ausführlicher. Schauen wir uns eine Reihe von Beispielen für die Erweiterung der Klammer an.
Jede Version der Elemente in der Liste in Klammern wird ausgeführt. Also gehen wir von einem Echo -Befehl und drucken 3 Versionen des unten getrennten Wortes unten durch Leerzeichen.
$ echo a, m, p _warehouse
A_WAREHOUSE M_WAREHOUSE P_WAREHOUSE
Ausdrücke in der Expansion verursachen mehrmals Ausführung. Um dies zu beweisen, verwenden wir den Befehl Datum und Schlaf, um zu überprüfen.
$ echo a, m, p _ $ (Datum; Schlaf 1)
A_Sun 22. März 18:56:45 UTC 2020 M_SUN 22. März 18:56:46 UTC
2020 P_Sun 22. März 18:56:47 UTC 2020
Erweiterungen mit Zahlen mit… führen dazu, dass sequentielle Zahlen in einer numerischen Reihenfolge erweitert werden
$ echo 1… 8 _warehouse
1_Wareshouse 2_Wareshouse 3_Wareshouse 4_Warehouse 5_WareHouse 6_WareHouse 7_warehouse
8_warehaus
Erweiterung der Umkehrreizklammer mit der Abfolge von Zahlen
$ echo 8… 1 _warehouse
8_WareHouse 7_WareHouse 6_WareHouse 5_Warehouse 4_WareHouse 3_WareHouse 2_warehouse
1_WareHouse
Verwenden eines optionalen Inkrementwerts, um die numerischen Inkremente der Ausdehnung der Klammer anzugeben
$ echo 1… 9… 3 _warehouse
1_WareHouse 4_WareHouse 7_Wareshouse
Die Ausweitung der lexikografischen Klammer wird durch Buchstaben im Alphabet in der Reihenfolge des Gebietsschemas durchbohrt
$ echo a… e _warehouse
A_Warehouse B_WAREHOUSE C_WAREHOUSE D_WAREHOUSE E_WAREHOUSE
Umgekehrte Ausdehnung der Lexikografischen Klamme umgekehrt
$ echo e… a _warehouse
E_WAREHOUSE D_WAREHOUSE C_WAREHOUSE B_WAREHOUSE A_WAREHOUSE
Lexikografische Ausdehnung der Klammer mit inkrements angegebenem Inkrement wird durch eine Liste von Zeichen vom Anfang bis zum Endpunkt durchlaufen, aber Zeichen entsprechend dem Inkrementwert überspringen
$ echo a… z… 5 _warehouse
A_Warehouse F_WareHouse K_WareHouse P_WAREHOUSE U_WAREHOUSE Z_WAREHOUSE
Erweiterung der multiplikativen Klammer mit 2 Ausdehnungen in einem Befehl
$ echo a… e 1… 5 _warehouse
A1_WareHouse A2_Warehouse A3_WareHouse A4_WareHouse A5_WareHouse B1_WareHouse
B2_WareHouse B3_WareHouse B4_Warehouse B5_WareHouse C1_WareHouse C2_WareHouse
C3_WareHouse C4_WareHouse C5_WareHouse D1_WareHouse D2_WareHouse D3_WareHouse
D4_WareHouse D5_WareHouse E1_Warehouse E2_WareHouse E3_WareHouse E4_WareHouse
E5_Warenhaus
Ausdehnung der Klammer, um die gleiche Wurzel zweimal in einem Befehl zu verwenden. Dies schafft ein Foo.TGZ TAR -Datei aus einem Verzeichnis unter dem Namen Foo. Es ist eine praktische Syntax, an der Sie sie in einer anderen Schleife verwenden und davon ausgehen möchten, dass die Basis des Wortes mehrmals verwendet wird. Dieses Beispiel zeigt es mit TAR, kann aber auch mit MV und CP gemäß diesem Beispiel verwendet werden.
$ mkdir foo
$ touch foo/foo a… e
$ tar czvf foo .TGZ,
foo/
Foo/Foob
foo/fooc
foo/fooa
Foo/Food
foo/fooe
Parameterausdehnung
Die Parameterausdehnung ist auch eine schöne kompakte Syntax mit vielen Funktionen wie: Erlauben Sie Skripten, Standardwerte für nicht festgelegte Variablen oder Optionen, String -Substring -Operationen, Suche und Ersetzen von Substitutionen und anderen Anwendungsfällen festzulegen. Beispiele finden Sie unten.
Überprüfen Sie auf NULL und verwenden Sie den Parameter, falls nicht NULL oder den Standardwert. In diesem Fall ist X nicht null, daher wird es verwendet
$ X = 1
$ echo $ x: -2
1
Überprüfen Sie auf NULL und verwenden Sie den Parameter, falls nicht NULL oder den Standardwert. In diesem Fall ist X null, sodass der Standardwert verwendet wird
$ uneingestellter x
$ echo $ x: -2
2
Überprüfen Sie, ob die Variable null ist, und setzen Sie sie fest und wiederholen Sie sie, wenn sie null ist. X wird zugewiesen 2 und gedruckt $ x. Dies kann beide die Variable festlegen und im Befehl mit der $ : = -Syntax verwenden.
$ uneingestellter x
$ wenn [-z "$ x"]; dann wieder null; fi
NULL
$ echo $ x: = 2
2
$ wenn [-z "$ x"]; dann wieder null; sonst wiederholt $ x; fi
2
Die Substring -Expansion ersetzt aus einem Offset -Punkt eine bestimmte Anzahl von Zeichen in der Zeichenfolge
$ X = "Hallo Welt"
$ echo $ x: 0: 7
Hallo w
Ändern Sie den Offset in den zweiten Charakter und drucken Sie 7 Zeichen des Substrings aus
$ X = "Hallo Welt"
$ echo $ x: 1: 7
Ello wo
Substring von Beginn der String, aber die letzten 2 Zeichen abschneiden
$ X = "Hallo Welt"
$ echo $ x: 0: -2
Hallo wor
Erhalten Sie eine Zeichenfolgelänge mit dieser Version der Parametererweiterung
$ X = "Hallo Welt"
$ echo $ #x
11
Suchen und ersetzen Sie innerhalb einer Variablen. In diesem Beispiel ersetzen Sie den ersten Kleinbuchstaben O durch Großbuchstaben O
$ X = "Hallo Welt"
$ echo $ x/o/o
Hallo Welt
Suchen und ersetzen Sie innerhalb einer Variablen, aber mit allen Übereinstimmungen, die aufgrund des führenden Schrägstrichs im Suchmuster ersetzt wurden.
$ X = "Hallo Welt"
$ echo $ x // o/o
Hallo Welt
Muster, die mit #beginnen, bedeuten, dass das Match am Anfang der Zeichenfolge beginnen muss, um ersetzt zu werden
$ X = "Hallo Welt"
$ echo $ x/#h/j
Jello World
Beispiel, bei der die Suche nach Übereinstimmung zu Beginn der String, jedoch fehlschlägt, weil die Übereinstimmung später in der Zeichenfolge liegt
$ X = "Hallo Welt"
$ echo $ x/#w/j
Hallo Welt
Muster, die mit % beginnen.
$ X = "Hallo Welt"
$ echo $ x/%d/d heute
Hallo Welt heute
Beispiel für das Ende der String -Übereinstimmung, die fehlschlägt, weil sich das Spiel am Anfang der String befindet.
$ X = "Hallo Welt"
$ echo $ x/%h/Today
Hallo Welt
Verwenden Sie Shopt mit Nocasematch, um einen unempfindlichen Ersatz für den Fall vorzunehmen.
$ Shopt -s Nocasematch
$ X = "Hallo Welt"
$ echo $ x/Hallo/Welcome
Willkommen Welt
Schalten Sie Shopt mit Nocasematch aus, um einen sensiblen Ersatz für den Fall vorzunehmen.
$ Shopt -U Nocasematch
$ X = "Hallo Welt"
$ echo $ x/Hallo/Welcome
Hallo Welt
Suchen Sie nach Umgebungsvariablen, die einem Muster entsprechen.
$ My_a = 1
$ My_b = 2
$ My_c = 3
$ echo $ !MEIN*
My_a my_b my_c
Holen Sie sich eine Liste übereinstimmender Variablen und schalten Sie dann jede Variable durch und drucken Sie ihren Wert aus
$ My_a = 1
$ My_b = 2
$ My_c = 3
$ variablen = $ !MEIN*
$ für i in $ variablen; echo $ i; echo "$ !ich getan
My_a
1
My_b
2
MEIN C
3
Machen Sie eine Saite alle Großbuchstaben
$ X = "Hallo Welt"
$ echo $ x ^^
HALLO WELT
Machen Sie eine Schnur alle Kleinbuchstaben
$ X = "Hallo Welt"
$ echo $ x ,,
Hallo Welt
Machen Sie den ersten Charakter einer Saiten -Großbuchstaben
$ X = "George Washington"
$ echo $ x^
George Washington
Machen Sie den ersten Charakter eines String -Kleinbuchs
$ X = bob
$ echo $ x,
Bob
Positionsparameter
Positionsparameter werden normalerweise als Befehlszeilenparameter betrachtet, wie sie verwendet werden, werden mit Beispielen unten angezeigt.
Parameter $ 0 ist der Skriptname, der ausgeführt wird, und dann 1 $, $ 2, $ 3 usw. sind Befehlszeilenparameter, die an ein Skript übergeben wurden.
$ cat script.Sch
echo $ 0
Echo $ 1
echo $ 2
echo $ 3
$ bash ./Skript.Sh Apple Banana Karotte
./Skript.Sch
Apfel
Banane
Karotte
Parameter $* ist eine einzelne Variable mit allen Befehlszeilenargumenten verkettet.
$ cat script.Sch
Echo $ 1
echo $ 2
echo $*
$ bash ./Skript.Sh Apple Banane
Apfel
Banane
Apfel Banane
Parameter $# ist eine Zahl mit der Menge der Positionsparameter, die in diesem Fall nachstehend an ein Skript übergeben wurden. Es werden 2 Argumente übergeben.
$ cat script.Sch
Echo $ 1
echo $ 2
echo $*
echo $#
$ bash ./Skript.Sh Apple Banane
Apfel
Banane
Apfel Banane
2
Tilde Expansion
Die Tilde -Expansion wird häufig mit Benutzernamen und Heimverzeichnissen beobachtet. Beispiele sind unten gezeigt.
Tilde -Erweiterung, um das Home -Verzeichnis des aktuellen Benutzers mit nur Tilde ohne Benutzernamen zu erhalten.
$ echo $ user
Wurzel
$ cd ~/
$ pwd
/Wurzel
Siehe ein bestimmtes Benutzerverzeichnis eines bestimmten Benutzers, nicht auf den aktuellen Benutzer mit Tilde und den Benutzernamen
$ cd ~ LinuxHint
$ pwd
/Home/LinuxHint
Arithmetische Substitution
Die arithmetische Substitution ermöglicht Bash, mathematische Operationen in der Schale oder in einem Skript durchzuführen. Beispiele für gemeinsame Verwendung sind unten angezeigt.
Einfache arithmetische Substitution durch $ und doppelte Klammern
$ echo $ ((2 + 3))
5
Der Post -Increment -Operator aktualisiert den Wert nach dem aktuellen Befehl um eins. Beachten.
$ X = 2
$ echo $ ((x ++))
2
$ echo $ x
3
Der Vorinkrement -Operator aktualisiert den Wert kurz vor dem aktuellen Befehl um einen um einen. Beachten.
$ X = 2
$ echo $ ((++ x))
3
$ echo $ x
3
Der Exponentbetreiber kann eine Zahl exponentiell auf eine Stromversorgung erhöhen
$ echo $ ((5 ** 2))
25
Linke bitweise Verschiebung; In diesem Fall verschieben Sie die Bits der Dezimalzahl 8 nach links, was sie im Wesentlichen mit 2 multipliziert
$ echo $ ((8)<<1))
16
Rechte bitweise Verschiebung; Verschieben Sie in diesem Fall die Bits der Dezimalzahl 8 nach rechts, die die Zahl im Wesentlichen durch 2 teilen
$ echo $ ((8 >> 1))
4
Bitweise und der Bediener vergleichen die Zahlen Stück für Stück und das Ergebnis sind die Bits, die alle festgelegt sind.
$ echo $ ((4 & 5))
4
Bitgewise oder Operator vergleichen die Zahlen Bit für Bit und die Ergebnisse sind die Bits, in denen eine der Eingänge über den Bit eingestellt sind.
$ echo $ ((4 | 9))
13
Der arithmetische Gleichstellungsoperator testet auf die Wahrheit und gibt 1 oder 0 zurück
$ echo $ ((4 == 4))
1
Der arithmetische Ungleichheitsoperator testet die Nichtgleichheit und gibt 1 oder 0 zurück
$ echo $ ((4) != 4))
0
Der bedingte Operator testet das erste Argument, wenn er true, durch das zweite Argument ersetzen und wenn falsch durch das dritte ersetzt wird. In diesem Fall entspricht 5 4+1, sodass die erste Bedingung wahr ist und 9 zurückgegeben wird. 5 entspricht nicht 4+2, so dass im zweiten Echo 7 zurückgegeben wird.
$ echo $ ((5 == 4+1 ? 9: 7))
9
$ echo $ ((5 == 4+2) ? 9: 7))
7
Sie können Hexadezimalzahlen in arithmetischen Erweiterungen verwenden, in diesem Fall entspricht 0xa 10 und 10+7 = 17.
$ echo $ ((0xa + 7))
17
Wortaufteilung
Verwenden der IFS -Umgebungsvariablen, um einen Trennzeichen zu registrieren, und mit den Befehlen Lese- und ReadArray können wir Strings in eine Reihe von Token analysieren und dann die Token zählen und darauf arbeiten. Beispiele sind unten gezeigt.
Verwenden Sie den IFS -Parameter als Trennzeichen, lesen
$ text = "Hallo Welt"
$ Ifs = "
$ read -a Tokens <<< "$text"
$ echo "Es gibt $ #Token [*] Wörter im Text."
Es gibt 2 Wörter im Text.
$ für i in "$ tokens [@]"; echo $ i; Erledigt
Hallo
Welt
User ReadArray ohne IFS und Geben Sie den Begrenzer im Befehl ReadArray an. Beachten Sie, dass dies nur ein Beispiel ist, in dem wir einen Verzeichnispfad basierend auf dem Slash -Trennzeichen aufgeteilt haben. In diesem Fall hat der Code die leere Zeichenfolge vor dem ersten Schrägstrich enthalten, der in einer echten Verwendung angepasst werden müsste, aber wir zeigen nur, wie man ReadArray anruft.
$ path = "/home/linuxHint/usr/local/bin"
$ readArray -d / -t -Token <<< "$path"
echo "Es gibt $ #Token [*] Wörter im Text."
Es gibt 6 Wörter im Text.
$ für i in "$ tokens [@]"; echo $ i; Erledigt
heim
LinuxHint
USR
lokal
Behälter
Dateiname Expansion
Wenn Sie sich auf eine Liste von Dateien oder Verzeichnissen im Dateisystem beziehen möchten, kann ein BASH -Befehl oder ein Bash -Skript die Dateiname -Erweiterung verwenden, um eine Liste von Dateien und Verzeichnissen aus einfachen Befehlen zu generieren. Beispiele sind unten gezeigt.
Der * Charakter erweitert sich zu einer Wildcard und nimmt alle übereinstimmenden Dateien mit dem Rest der Wild Card -Zeichenfolge auf. Hier nehmen wir alle Dateien ab, in denen enden .TXT und geben Sie sie in den DU -Befehl zur Überprüfung der Scheibengröße weiter.
$ touch a.txt b.txt c.txt
$ echo "Hallo Welt"> Inhalt.txt
$ du *.txt
0 a.txt
0 b.txt
0 c.txt
4 Inhalt.txt
Der ? Das Charakter stimmt nur mit einem einzelnen Zeichen überein, nicht unendlich viele Zeichen .txt.
$ touch a.txt b.txt c.txt
$ echo "Hallo Welt"> Inhalt.txt
$ du ?.txt
0 a.txt
0 b.txt
0 c.txt
Charaktere in Klammern erweitern sich, um einem der Charaktere zu entsprechen. In diesem Beispiel a.txt und c.TXT werden durch die Erweiterung aufgegriffen
$ touch a.txt b.txt c.txt
$ echo "Hallo Welt"> Inhalt.txt
$ du [AC].txt
0 a.txt
0 c.txt
Charaktere in Klammern können eine Reihe von Zeichen sein, und wir sehen hier alle Dateien von einem bis c -Bereich, gefolgt von .TXT -Suffix werden abgeholt
$ touch a.txt b.txt c.txt
$ echo "Hallo Welt"> Inhalt.txt
$ du [a-c].txt
0 a.txt
0 b.txt
0 c.txt
Abschluss
In diesem Artikel haben wir viele Arten von Shell -Erweiterungen behandelt, und ich hoffe. Als weitere Referenzen empfehle ich das Lesen des vollständigen Bash -Handbuchs und auch die vielen guten Artikel auf der Nixcraft -Website über Bash -Skripte, einschließlich Shell -Erweiterungen. Wir haben andere Artikel, die für Sie unter LinuxHint von Interesse sein können, darunter: 30 Bash -Skript -Beispiele, Bash -Kleinbuchstaben, Bash -Muster -Matching und Bash Split String -Beispiele. Außerdem haben wir einen beliebten kostenlosen 3 -stündigen Kurs für Bash -Programme, die Sie auf YouTube finden können.