Einführung in die Ausdehnung der Parameterausdehnung von Bash -Shell
- 4619
- 1117
- Ilja Köpernick
Eine Shell ist ein entscheidender Bestandteil eines Unix-basierten Betriebssystems und die Hauptschnittstelle, mit der wir mit dem System selbst interagieren können. Bash ist ohne Zweifel die am häufigsten verwendete Shell bei den meisten Linux -Verteilungen: Sie wurde als freier Software -Austausch für die geboren Bourne Shell
(Bash ist das Akronym für Bourne-auf-Shell) innerhalb des GNU-Projekts. In diesem Tutorial erfahren wir, wie einige der nützlichsten Bash -Erweiterungen funktionieren.
Falls Sie mit Bash noch nicht vertraut sind oder einfach Ihr Gedächtnis auffrischen müssen, werden Sie empfohlen, unser Bash -Skript -Tutorial für Anfänger zu besuchen, bevor Sie in das Bash -Shell -Erweiterungskonzept eintauchen.
In diesem Tutorial lernen Sie:
- So verwenden Sie verschiedene Bash -Parameter -Erweiterungen
Softwareanforderungen und Konventionen verwendet
Kategorie | Anforderungen, Konventionen oder Softwareversion verwendet |
---|---|
System | Verteilungsunabhängige |
Software | Eine Bash -Hülle |
Andere | Grundkenntnisse über Bash |
Konventionen | # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können |
Die einfachste mögliche Erweiterung
Die einfachste mögliche Parameterausdehnungssyntax ist die folgende:
$ Parameter
Wenn wir diese Syntax verwenden, Parameter
wird durch seinen Wert ersetzt. Lassen Sie uns ein Beispiel sehen:
$ Site = "LinuxConfig.org "$ echo" $ Site "LinuxConfig.Org
Wir haben die erstellt Grundstück
variabel und zugewiesen die "Linuxconfig.Org "
String dazu. Wir haben dann das benutzt Echo
Befehl zur Anzeige des Ergebnisses der variablen Erweiterung. Da dies eine grundlegende Expansion ist, hätte es auch ohne die Verwendung von verwendet Geschweifte Klammern
Um den variablen Namen:
$ echo "$ seiten" linuxconfig.Org
Warum haben wir das benutzt? Geschweifte Klammern
Dann? Bei der Ausführung von Parameterausdehnungen werden lockige Klammern verwendet, um den Variablennamen abzugrenzen:
$ echo "Sie lesen diesen Artikel auf $ site_!"Sie lesen diesen Artikel über
Was ist passiert? Da der variable Name nicht abgrenzt war, ist der _
Der Charakter wurde als Teil davon betrachtet. Die Shell versuchte, den damals existierenden existierenden zu erweitern $ Site_
Variable, daher wurde nichts zurückgegeben. Das Wickeln der Variablen mit lockigen Klammern löst dieses Problem:
$ echo "Sie lesen diesen Artikel auf $ Site _!"Sie lesen diesen Artikel auf Linuxconfig_!
Während die Verwendung von lockigen Zahnspangen bei grundlegender Parametererweiterung nicht immer benötigt wird, ist es obligatorisch, alle anderen Erweiterungen durchzuführen, die wir in diesem Artikel sehen werden.
Lassen Sie mich Ihnen einen Tipp geben. Im obigen Beispiel versuchte die Shell, eine nicht existierende Variable zu erweitern, wodurch ein leeres Ergebnis erzielt wurde. Dies kann sehr gefährlich sein, insbesondere wenn sie mit Pfadnamen arbeiten, wird beim Schreiben von Skripten immer empfohlen, die zu verwenden Substantivset
Option, die dazu führt, dass die Shell mit einem Fehler beendet wird, wenn auf eine nicht vorhandene Variable verwiesen wird:
$ set -o nounset $ echo "Sie lesen diesen Artikel auf $ Site_!"Bash: Site_: Ungebundene Variable
Arbeiten mit Indirektion
Die Verwendung der Verwendung der $ !Parameter
Syntax fügt unserer Parameterausdehnung eine Indirektion zu. Was bedeutet das? Der Parameter, den die Shell erweitern versucht, ist nicht Parameter
; Stattdessen wird es versucht, den Wert von zu verwenden Parameter
als der Name der Variablen, die erweitert werden soll. Lassen Sie uns dies mit einem Beispiel erklären. Wir alle kennen das HEIM
Die Variable erweitert sich im Pfad des User Home -Verzeichnisses im System, richtig?
$ echo "$ home" /home /egdoc
Sehr gut, wenn wir jetzt die Zeichenfolge „Home“, eine andere Variable zuweisen und diese Art von Erweiterung verwenden, erhalten wir:
$ variable_to_inspect = "home" $ echo "$ !variable_to_inspect " /home /egdoc
Wie Sie im obigen Beispiel sehen können, anstatt als Ergebnis „Zuhause“ zu erhalten variable_to_inspect
Als der Name der Variablen zu erweitern, sprechen wir deshalb über eine Ebene der Indirektion.
Expansion der Falländerung
Mit dieser Parameter -Expansionssyntax ändern wir den Fall der alphabetischen Zeichen innerhalb der Zeichenfolge, die sich aus der Ausdehnung des Parameters ergibt. Sagen Sie, wir haben eine Variable genannt Name
; Um den durch die Erweiterung der Variablen zurückgegebenen Text zu nutzen, würden wir die verwenden $ parameter^
Syntax:
$ name = "egidio" $ echo "$ name^" Egidio
Was ist, wenn wir die gesamte Saite überschreiten wollen, anstatt sie zu profitieren?? Einfach! wir benutzen das $ Parameter ^^
Syntax:
$ echo "$ name ^^" Egidio
In ähnlicher Weise verwenden wir das Kleinbuchstaben des ersten Zeichens einer Zeichenfolge, die wir die verwenden $ Parameter,
Expansionssyntax:
$ name = "egidio" $ echo "$ name," egidio
Um die gesamte Zeichenfolge zu unterbinden, verwenden wir stattdessen die $ Parameter ,,
Syntax:
$ name = "egidio" $ echo "$ name ,," Egidio
In allen Fällen a Muster
Ein einzelnes Zeichen zu entsprechen kann auch bereitgestellt werden. Wenn das Muster bereitgestellt wird, wird der Vorgang nur auf die Teile der ursprünglichen Zeichenfolge angewendet, die sie entspricht:
$ name = "egidio" $ echo "$ name ,, [dio]" Egidio
Im obigen Beispiel einschließen wir die Charaktere in quadratischen Klammern: Dies führt dazu, dass jeder von ihnen als Muster übereinstimmt.
Bei Verwendung der Erweiterungen, die wir in diesem Absatz und die erläutert haben Parameter
ist ein Array abonniert von @
oder *
, Die Operation wird auf alle darin enthaltenen Elemente angewendet:
$ my_array = (ein drei drei) $ echo "$ my_array [@] ^^" Eins Three Three
Wenn auf den Index eines bestimmten Elements im Array verwiesen wird, wird der Vorgang stattdessen nur darauf angewendet:
$ my_array = (eins drei) $ echo "$ my_array [2] ^^" drei
Substringentfernung
Die nächste Syntax, die wir untersuchen werden, ermöglicht es uns, a zu entfernen Muster
Von Anfang an oder vom Ende der Zeichenfolge, die sich aus der Expansion eines Parameters ergibt.
Entfernen Sie das Matching -Muster vom Beginn der Zeichenfolge
Die nächste Syntax, die wir untersuchen werden, $ Parameter#Muster
, ermöglicht es uns, a zu entfernen Muster
von dem Anfang des
Zeichenfolge, die aus dem resultiert Parameter
Erweiterung:
$ name = "egidio" $ echo "$ name#egi" Dio
Ein ähnliches Ergebnis kann durch die Verwendung der verwendet werden "$ Parameter ## Muster"
Syntax, aber mit einem wichtigen Unterschied: entgegen dem, den wir im obigen Beispiel verwendet haben, wodurch das entfernt wird kürzestes Matching -Muster Ab dem Beginn der Saite entfernt es die am längsten eins. Der Unterschied ist deutlich sichtbar, wenn Sie die verwenden *
Charakter in der Muster
:
$ name = "egidio doktile" $ echo "$ name#*i" dio diote
Im obigen Beispiel haben wir verwendet *
Als Teil des Muster Name
Variable. Das Wildcard
entspricht jedem Charakter, sodass das Muster selbst in "I 'Charakter und alles vor ihm" übersetzt wird. Wie wir bereits sagten, wenn wir das benutzen $ Parameter#Muster
Syntax, das kürzeste Matching -Muster, wird entfernt. In diesem Fall handelt es sich um "EGI". Mal sehen, was passiert, wenn wir das verwenden "$ Parameter ## Muster"
Syntax stattdessen:
$ name = "egidio doartile" $ echo "$ name ##*i" le
Diesmal wird das längste Matching -Muster entfernt („Egidio doci“): Das längste mögliche Match enthält das dritte 'I' und alles vor ihm. Das Ergebnis der Expansion ist nur „le“.
Entfernen Sie das Matching -Muster vom Ende der Zeichenfolge
Die Syntax, die wir oben gesehen haben. Wenn wir möchten, dass das Muster aus dem entfernt wird Ende von der Zeichenfolge müssen wir stattdessen die verwenden $ Parameter%Muster
oder $ Parameter %% Muster
Erweiterungen, um die kürzeste und längste Übereinstimmung am Ende der Saite zu entfernen:
$ name = "egidio doartile" $ echo "$ name%i*" Egidio doc
In diesem Beispiel übersetzt das Muster, das wir in etwa "I" -Scharakter und allem übersetzt haben, nachdem es ab dem Ende der Zeichenfolge begonnen hat. ". Das kürzeste Match ist "Ile", also wird "Egidio Doc" zurückgegeben. Wenn wir das gleiche Beispiel versuchen, aber die Syntax verwenden, die die längste Übereinstimmung beseitigt, die wir erhalten:
$ name = "egidio doartile" $ echo "$ name %% i*" zB
In diesem Fall ist das einst längste Spiel entfernt, was zurückgegeben wird, ist „z. B.“, z.
In allen Erweiterungen, die wir oben gesehen haben, wenn Parameter
ist ein Array und es wird mit abonniert *
oder @
, Die Entfernung des Matching -Musters wird auf alle seine Elemente angewendet:
$ my_array = (ein drei drei) $ echo "$ my_array [@]#*o" ne drei
Suchen und ersetzen Sie Muster
Wir haben die vorherige Syntax verwendet, um ein Matching -Muster vom Anfang oder vom Ende der Zeichenfolge zu entfernen, die sich aus der Expansion eines Parameters ergibt. Was ist, wenn wir wollen? ersetzen Muster
mit etwas anderem? Wir können die verwenden $ Parameter/Muster/String
oder $ Parameter // Muster/String
Syntax. Ersteres ersetzt nur das erste Ereignis des Musters, letzteres alle Vorkommen:
$ phrase = "Gelb ist die Sonne und Gelb ist die Zitrone" $ echo "$ Phrase/gelb/rot
Der Parameter
(Phrase) wird erweitert und die längste Übereinstimmung der Muster
(gelb) wird dagegen abgestimmt. Das Match wird dann durch die zur Verfügung gestellte Ersetzung ersetzt Saite
(Rot). Wie Sie beobachten können, wird nur das erste Ereignis ersetzt, so dass die Zitrone gelb bleibt! Wenn wir alle Ereignisse des Musters ändern wollen, müssen wir es mit dem präfixen /
Charakter:
$ phrase = "Gelb ist die Sonne und Gelb ist die Zitron
Diesmal wurde das gesamte Vorkommen von „Gelb“ durch „Rot“ ersetzt. Wie Sie sehen können, wird das Muster überall angepasst, wo es in der Zeichenfolge gefunden wird, die sich aus der Ausdehnung von ergibt Parameter
. Wenn wir angeben möchten, dass es nur zu Beginn oder am Ende der Zeichenfolge übereinstimmt werden muss, müssen wir es jeweils mit dem präfixen #
oder %
Charakter.
Genau wie in den vorherigen Fällen, wenn Parameter
ist ein Array, das von beiden abonniert wurde *
oder @
, Die Substitution erfolgt in jedem seiner Elemente:
$ my_array = (ein drei drei) $ echo "$ my_array [@]/o/" une twu drei
Substring -Expansion
Der $ Parameter: Offset
Und $ Parameter: Offset: Länge
Erweiterungen lassen uns nur einen Teil des Parameters erweitern und ein Substring zurückgeben, beginnend am angegebenen Offset
Und Länge
Zeichen lang. Wenn die Länge nicht angegeben ist, verläuft die Erweiterung bis zum Ende der ursprünglichen Zeichenfolge. Diese Art von Expansion wird genannt Substring -Expansion
:
$ name = "egidio faire" $ echo "$ name: 3" Dio Lehre
Im obigen Beispiel haben wir nur die bereitgestellt Offset
, ohne die anzugeben Länge
, Daher war das Ergebnis der Expansion das Substring, das durch den Start des durch den Versatzes angegebenen Zeichens (3) erhalten wurde, indem er begonnen hat, indem er begonnen hat, indem er begonnen hat (3).
Wenn wir eine Länge angeben, beginnt das Substring bei Offset
und wird sein Länge
Zeichen lang:
$ echo "$ Name: 3: 3" Dio
Wenn der Offset
ist negativ, es wird vom Ende der Zeichenfolge berechnet. In diesem Fall muss ein zusätzlicher Platz nachher hinzugefügt werden :
Andernfalls wird die Schale als eine andere Art von Expansion betrachtet, die von identifiziert wurde :-
Dies wird verwendet, um einen Standardwert zu liefern, wenn der zu erweiterende Parameter nicht vorhanden ist (wir haben in dem Artikel über die Verwaltung der Expansion leerer oder nicht fester Bash -Variablen darüber gesprochen):
$ echo "$ name: -6" fügsam
Wenn der zur Verfügung gestellte Länge
ist negativ, anstatt als die Gesamtzahl der Zeichen zu interpretieren, die die resultierende Zeichenfolge lang sein sollte, wird als Offset angesehen, der vom Ende der Zeichenfolge berechnet werden soll. Das Ergebnis der Expansion wird daher ein Substring sein, der beginnt Offset
und enden bei Länge
Zeichen vom Ende der ursprünglichen Zeichenfolge:
$ echo "$ name: 7: -3" doc
Bei Verwendung dieser Erweiterung und Parameter
ist ein indiziertes Array, das von abonniert wurde von *
oder @
, Die Offset
ist relativ zu den Indizes der Array -Elemente. Zum Beispiel:
$ my_array = (ein zwei drei) $ echo "$ my_array [@]: 0: 2" Eins zwei $ echo "$ my_array [@]: -2" Two Three Three
Ein Negativ Länge
, Erzeugt stattdessen einen Expansionsfehler:
$ echo "$ my_array [@]: 0: -2" Bash: -2: Substring -Ausdruck < 0
Expansion „Länge“
Bei Verwendung der $ #Parameter
Expansion, das Ergebnis der Expansion ist nicht der Wert des Parameters nach seiner Länge:
$ name = "egidio" $ echo "$ #name" 6
Wenn Parameter
ist ein Array, und es wird mit abonniert *
oder @
, Die Anzahl der darin enthaltenen Elemente wird zurückgegeben:
$ my_array = (ein drei drei) echo "$ #my_array [@]" 3
Wenn auf ein bestimmtes Element des Arrays verwiesen wird, wird stattdessen seine Länge zurückgegeben:
$ echo "$ #my_array [2]" 5
Alles zusammenstellen
In diesem Artikel haben wir viele Expansions -Syntax gesehen. Wir haben gesehen Lassen Sie einen Parameter in der Länge seines Wertes anstelle seines Wertes selbst erweitert werden.
Dies ist keine umfassende Liste aller möglichen Erweiterungen, die wir mit Bash durchführen können: Wenden Sie sich an die GNU -Dokumentation, wenn Sie mehr wissen möchten. In dem Artikel haben wir auch erwähnt verprügeln Arrays
: Um mehr über sie zu erfahren, können Sie unseren dedizierten Bash -Arrays -Artikel lesen.
Verwandte Linux -Tutorials:
- Dinge zu installieren auf Ubuntu 20.04
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Hung Linux System? Wie man zur Befehlszeile entkommt und…
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
- Mint 20: Besser als Ubuntu und Microsoft Windows?
- Ubuntu 20.04 Leitfaden
- Dinge zu installieren auf Ubuntu 22.04
- Installieren Sie Arch Linux in VMware Workstation
- Linux -Download
- « Überprüfen Sie die Java -Version
- So erstellen, verpacken und unterschreiben Sie eine Firefox -Weberweiterung »