2017-02-04 10 views
1

Warum ist die folgende nicht funktioniert (keine Ausgabe):Bash Expand Variable in Git Bash unter Windows funktioniert nicht?

fileRe="-regex '.*\.h'" 
find "." -type f $fileRe 

aber die folgenden Werke (und gibt die Ergebnisse)

find "." -type f -regex '.*\.h' 

Arbeiten mit: /c/Program Files/Git/bin/bash

dies nicht intuitiv ist?

+2

Shells Variablenerweiterungen sind nicht wie Makroerweiterungen (vielleicht ist das was du meinst mit _dies ist nicht intuitiv_). Sie möchten hier ein Array verwenden: 'fileRe = (-regex '. * \. H')' und 'find. -type f "$ {fileRe [@]}" '. –

+0

Könntest du ein bisschen mehr ausarbeiten? auf Linux funktioniert das oben immer? – Gabriel

+0

Was soll ich tun wenn: 'fileRe = (-regex '' $ 1 '')' Ich möchte das erweiterte Argument $ 1 ?? Dies funktioniert nicht – Gabriel

Antwort

1

Wenn Sie find "." -type f -regex '.*\.h' ein und drücken Sie Enter, die Shell interpretiert die einfachen Anführungszeichen als der umschließende Marker eine feste Zeichenkette, und verwendet den eingeschlossenen Wert als Argument für den find Befehl zu übergeben.

Im Unterschied dazu, wenn Sie fileRe="-regex '.*\.h'", der Wert innerhalb der doppelten Anführungszeichen gesetzt wird gespeichert wie sie ist (nach variable Expansion) und die eingebetteten Apostrophe sind wörtlich genommen.

Und dann, wenn Sie $fileRe zu find passieren, der Wert genommen wird, wie sie gespeichert wurde, es nicht neu interpretiert, so die wörtliche Apostrophe im Wert bleibt wörtliche Apostrophe.

Um das zu erreichen, was Sie wollen, können Sie stattdessen ein Bash-Array verwenden können:

fileRe=(-regex '.*\.h') 
find . -type f "${fileRe[@]}" 

Der Unterschied in dieser Version von Ihnen ist, dass die zu find gebenen Argumente sind -regex und .*\.h. Die einfachen Anführungszeichen sind nicht Teil des Werts, da sie beim Erstellen des Array-Werts verwendet wurden und nicht in einen doppelt zitierten Ausdruck eingebettet waren.

Dieses Verhalten ist in jeder Bash-Shell gleich, unabhängig vom Betriebssystem.