Einführung in die Ausdehnung der Parameterausdehnung von Bash -Shell

Einführung in die Ausdehnung der Parameterausdehnung von Bash -Shell

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

Softwareanforderungen und Linux -Befehlszeilenkonventionen
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