Ich habe mit dem Befehl drei Dateien in meinem Verzeichnis erstellt touch inv{1..3}.txt
. Jetzt habe ich zwei Befehle verwendet und ihre Ausgabe ist ziemlich gleich. Diese beiden Befehle sind ls inv[13].txt
und ls {1,3}.txt
.
Wie unterscheiden sich diese beiden? Wie unterscheiden sich eckige Klammern von geschweiften Klammern? Ich habe auch nach "Linux [..]" gegoogelt, konnte aber nichts finden. Könnte ich also wissen, wie diese Dinge in der Linux-Terminologie heißen?
Vielen Dank
command-line
bash
scripts
posixKing
quelle
quelle
{}
und Dateinamenerweiterung> Musterabgleich für[]
.Antworten:
{}
wird Klammererweiterung genannt. Es gibt zwei Formen:{x..y}
und{x,y}
, ersetzenx
undy
durch einen beliebigen alphabetischen oder numerischen Wert.In der ersten Form
{x..y}
wird auf alle Werte vonx
bisy
einschließlich erweitert. Zum Beispiel{2..5}
wird erweitert werden2
,3
,4
,5
.In der zweiten expliziten Form
{x,y}
wird nur aufx
,y
. Zum Beispiel{2,5}
wird erweitert2
und5
.Wenn keine Erweiterung möglich ist, wird das Muster wörtlich behandelt, z
{a..3}
. B. in .Es ist wichtig zu beachten, dass die Klammererweiterung (wenn möglich) unabhängig von einer Dateianpassung während der Dateierstellung / -anpassung durchgeführt wird.
[]
ist als Pfadnamen-Erweiterungsmuster (oder Globbing-Muster) bekannt. Im Gegensatz zur Klammererweiterung können Sie sie nur verwenden, wenn Sie mit Dateinamen übereinstimmen. Sie wird buchstäblich behandelt, wenn Sie sie beim Erstellen von Dateien verwenden.Es hat zwei Formen:
[xyz...]
und[x-y]
.In der ersten Form wird jedes einzelne Zeichen in den eckigen Klammern separat abgeglichen, dh jedes Zeichen wird einzeln behandelt. Also für
[25].txt
es wird eine Datei mit dem Namen übereinstimmen2.txt
oder5.txt
im aktuellen Verzeichnis, während für[245].txt
sie eine beliebige Datei mit dem Namen übereinstimmen2.txt
oder4.txt
oder5.txt
.In der zweiten Form wird zuerst eine Bereichserweiterung durchgeführt, bevor sie einzeln abgeglichen wird, wenn dies anderweitig wörtlich behandelt wird. Daher stimmt
[2-5]. txt
es mit jeder Datei mit dem Namen2.txt
oder3.txt
oder4.txt
oder überein5.txt
. Wenn der Bereich nicht erweitert werden kann, wird er buchstäblich behandelt, z[a-3].txt
.Ein wichtiger Verhaltensunterschied zwischen diesen beiden besteht darin, dass mehr Muster übereinstimmen müssen, während weniger tatsächlich übereinstimmen. Da die Klammererweiterung auf jeden Fall durchgeführt wird, wird der Fehler angezeigt, dass bestimmte Dateien nicht vorhanden sind, während die Pfadnamenerweiterung mit allen möglichen Fehlern übereinstimmt.
Portabilitätshinweis:
Der
[]
Pfadnamen-Erweiterungsoperator wird von POSIX definiert und ist daher zwischen Bourne-Shell und Derivaten portierbar.Die Klammererweiterung
{}
wird von POSIX nicht definiert und ist daher nicht für alle Schalen tragbar. Zum Beispieldash
(sh
in Ubuntu) hat dies nicht. Es wurde entlehntcsh
und wird auf bestimmte Schalen arbeitet nur zum Beispielbash
,zsh
,ksh93
,fish
. Stellen Sie sicher, dass die von Ihnen verwendete Shell dies unterstützt, bevor Sie sie implementieren.Beispiel:
quelle
[
]
Erweiterung zu verlassen, wenn es keine Übereinstimmungen gibt, da dies je nach Shell-Konfiguration unterschiedlich sein kann. Wenn Sie[
oder]
in einem Dateinamen verwenden möchten , sollte dieser in Ihren Befehlen angegeben werden. Es lohnt sich auch, den Unterschied zwischen{13..79}
und zu bemerken[13-79]
. Die erste wird alle Zahlen im Bereich erzeugen aus13
zu79
, die zweite die Zeichen übereinstimmen1
,3
,4
,5
,6
,7
, und9
.nullglob
(oder ähnliches) gedacht . Über das[13-79]
Matching habe ich in meiner Antwort das Verhalten pro Zeichen von [] `deutlich erwähnt.ksh
hat diese Funktion, aber es ist nicht moderner Aromen, wie mksh und pkdshDer Hauptunterschied zwischen den beiden Formen ist hier dargestellt:
inv[15].txt
ist ein Glob und erweitert die Liste der übereinstimmenden Dateien in Ihrem Dateisystem. Dies ist eine Pfadnamenerweiterung .inv{1,5}.txt
Erweitert aufinv1.txt
undinv5.txt
unabhängig davon, welche Dateien sich tatsächlich in Ihrem Dateisystem befinden. Dies ist eine Klammererweiterung .quelle
ba{con,tman}
und es kein Äquivalent in eckigen Klammern gibt. IOW, die Klammererweiterung gilt nicht nur für einzelne Zeichen.