(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
erweitertfind 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"