GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash Brace Erweiterung &Variablen?

Für diese Frage gibt es hier bereits Antworten :Kann ich Variablen innerhalb der {}-Erweiterung ohne `eval` verwenden?

(3 Antworten)
Vor 6 Jahren geschlossen.

Ich habe einen Suchbefehl:

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Ich möchte Alpha,Bravo,Charlie ersetzen mit $find_dir

find Directory/{$find_dir} arg1 arg2

letzteres wird jedoch zu

erweitert
find Directory/{Alpha,Bravo,Charlie} arg1 arg2

eher dann

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

Wieso den? Es ist Teil eines ziemlich komplexen Bash-Skripts, das mehr oder weniger Verzeichnisse haben kann, die nicht alle relevant sind (daher würde das Globbing von Upload/* nicht funktionieren). Wenn ich also jetzt drei einrichte und ein weiteres hinzufüge, muss ich es später manuell hinzufügen. Außerdem muss es vom Stamm der Verzeichnisse aus ausgeführt werden, um die Perspektive der gefundenen Ausgaben beizubehalten (./Upload/Dir/file im Gegensatz zu ./Dir/file).

Aber die Verwendung einer Variablen würde es mir ermöglichen, das nach Bedarf zu ändern und es für andere Teile des Skripts relevant zu halten.

Akzeptierte Antwort:

Von bash Dokumentation, Abschnitt Klammererweiterung:

Die Erweiterung mit geschweiften Klammern wird vor allen anderen Erweiterungen durchgeführt, und alle
Sonderzeichen für andere Erweiterungen werden im Ergebnis beibehalten
. Es
ist streng textuell. Bash wendet keine syntaktische Interpretation
auf den Kontext der Erweiterung oder den Text zwischen den geschweiften Klammern an. Um
Konflikte mit der Parametererweiterung zu vermeiden, wird die Zeichenfolge „${“ nicht
für die geschweifte Erweiterung als geeignet erachtet.

Noch ein Hinweis in bash :

Die Reihenfolge der Erweiterungen ist:Klammererweiterung, Tildeerweiterung,
Parameter, Variable und arithmetische Erweiterung und Befehlsersetzung (von links nach rechts) , Wortaufteilung und Dateinamenerweiterung
.

Also in Ihrem Fall bash sah Klammererweiterung vor Variablenerweiterung, es wird zuerst Klammererweiterung durchgeführt, Ergebnis {Alpha,Bravo,Charlie} erzeugen .

Wenn Sie $find_dir steuern können Variableninhalte können Sie eval verwenden :

eval "find Directory/{$find_dir} arg1 arg2"

Linux
  1. So finden Sie die Länge der Zeichenfolge in Bash [Schneller Tipp]

  2. „Verschachteln“ von Variablen in bash

  3. Suchen und kopieren Sie die Datei mit Bash

  4. Bash-Funktion, um das neueste Dateiübereinstimmungsmuster zu finden

  5. Wie man alle Dateien in allen Unterverzeichnissen in Bash gzippt

Bash-Scripting – Variablen mit Beispielen erklärt

Bash Brace Expansion Tutorial:6 Beispiele zum Erweitern von Ausdrücken in geschweiften Klammern

Variablen in der Bash-Shell unter Linux verstehen

bash findet Verzeichnisse

bash - findet die Position des String-Index des Teilstrings

Ausführliche Ausgabe des Bash-Suchbefehls