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.
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 [@]}" '. –
Könntest du ein bisschen mehr ausarbeiten? auf Linux funktioniert das oben immer? – Gabriel
Was soll ich tun wenn: 'fileRe = (-regex '' $ 1 '')' Ich möchte das erweiterte Argument $ 1 ?? Dies funktioniert nicht – Gabriel