Tricky Brace-Erweiterung in der Shell

8

Wenn Sie eine POSIX-Shell verwenden,

%Vor%

wird zu

erweitert %Vor%

Was die Dateien quickly , manly und strongly berührt, aber ist es möglich, die Erweiterung dynamisch zu erstellen? Das folgende Beispiel veranschaulicht, was ich tun möchte, funktioniert aber aufgrund der Reihenfolge der Erweiterung nicht:

%Vor%

Gibt es einen Weg, dies zu erreichen? Es macht mir nichts aus, mich auf Bash zu beschränken, wenn es sein muss. Ich möchte auch Schleifen vermeiden. Die Erweiterung sollte als vollständiges Argument für ein beliebiges beliebiges Programm angegeben werden (d. H. Das Programm kann nicht einmal für jede Datei aufgerufen werden, es kann nur einmal für alle Dateien aufgerufen werden). Ich weiß über xargs , aber ich hoffe, dass alles irgendwie von der Shell aus erledigt werden kann.

    
dreamlax 11.05.2009, 04:44
quelle

4 Antworten

17

... Es ist so viel falsch mit eval . Was Sie fragen ist nur möglich mit eval , ABER was Sie wollen ist leicht möglich, ohne auf bash bug-central zurückgreifen zu müssen.

Verwenden Sie Arrays! Wenn Sie mehrere Elemente im one -Datentyp aufbewahren müssen, müssen Sie (oder sollte verwenden) ein Array verwenden.

%Vor%

Das tut genau das, was Sie wollen, ohne die tausend Bugs und Sicherheitsprobleme, die hier in den anderen Vorschlägen eingeführt und verborgen werden.

So funktioniert es:

  • "${foo[@]}" : Erweitert das Array mit dem Namen foo , indem jedes seiner Elemente in geeigneter Weise erweitert wird. Vergiss die Zitate nicht!
  • ${foo/a/b} : Dies ist eine Art von Parametererweiterung, die die erste a in foo Erweiterung durch eine b ersetzt. Bei dieser Art der Erweiterung können Sie % verwenden, um das Ende des erweiterten Werts zu symbolisieren , wie $ in regulären Ausdrücken.
  • Setzen Sie all das zusammen und "$ {foo [@] /% / ly}" wird jedes Element von foo erweitern, es als separates Argument angeben und das Ende jedes Elements durch ly ersetzen.
lhunath 11.05.2009, 06:26
quelle
3

In bash können Sie dies tun:

%Vor%

Diese letzte Zeile ist auskommentiert, berührt aber die angegebenen Dateien.

    
paxdiablo 11.05.2009 04:51
quelle
0

Ausgehend von den obigen Antworten:

%Vor%     
njsf 11.05.2009 05:08
quelle
0

Zsh kann das leicht tun:

%Vor%

Variabler Inhalt wird in Kommas aufgeteilt, dann wird jedes Element in die Zeichenfolge um die geschweiften Klammern verteilt:

%Vor%     
calandoa 19.09.2013 12:16
quelle

Tags und Links