2016-06-01 17 views
1

Wenn ich wie folgt vor:Wildcard innerhalb von Zitaten

rmdir /path/to/dir/*.lproj 

es funktioniert gut.

Wenn ich tun:

APP_RESOURCES="/path/to/dir" 
rmdir "$APP_RESOURCES/*.lproj" 

Es funktioniert nicht und sagt, es ist buchstäblich für ein Verzeichnis mit einem astrix-Symbol namens aussieht. Der Platzhalter wird nicht interpretiert. Wie kann dies innerhalb von Zitaten funktionieren?

Antwort

4

Expansion wird von der Shell behandelt, so dass Sie so etwas zu schreiben haben: in doppelten Anführungszeichen

APP_RESOURCES="/path/to/dir" 
rmdir "${APP_RESOURCES}/"*.lproj 
+1

Warum der Downvote? – ritesht93

+0

Nicht meine Down-Abstimmung. Es scheint nicht zu funktionieren. Es beschwert sich immer noch, dass es das Verzeichnis '/ Pfad/zu/dir/*. Lproj' –

+0

@ User2910293 nicht finden kann Ich habe die Antwort bearbeitet, haben Sie die neueste? – ritesht93

3

No Globbing erfolgt. Do

APP_RESOURCES="/path/to/dir" 
rmdir "$APP_RESOURCES"/*.lproj 

Siehe dieses [ question ] für einige Details.

+0

Dies funktioniert. Vielen Dank! Wusste nicht, dass Sie einfach so verketten können :) –

+0

@ User2910293: Bitte sehen Sie meine eigene Frage (Link in der Antwort) zu diesem Thema. – sjsam

+0

Das ist eine sehr interessante Lektüre, danke! Das hat mir wirklich geholfen. Den Teil der angenommenen Antwort jetzt beenden (halbwegs). Ich finde diese Dinge meistens durch Trail und Fehler, da ich nie wirklich anspruchsvolle Bash-Skripte schreibe; Meistens sind es nur einfache Installer oder Cleanup-Skripte, denen diese Dinge nicht so oft begegnen. –

2

Sie zitieren Ihre variablen Erweiterungen, machen Sie das weiter. Schlimme Sache ist, dass Sie versuchen, Ihr Globbing zu zitieren. Für die Shell sollten Sie nicht zitieren glob:

app_resource="/path/to/dir" 
rmdir "$app_resource"/*.lproj 

Dies wird jedoch nach wie vor zu /path/to/dir/*.lproj in Fällen expandieren, in denen keine Übereinstimmung gefunden wird, bedenken Sie:

% app_resource="/path/to/dir" 
% echo "$app_resource/something/that/doesnt/exists/"*.abc 
/path/to/dir/something/that/doesnt/exists/*.abc 

Ein Weg, um das überprüfen Wenn die Datei/das Verzeichnis existiert:

app_resource="/path/to/dir" 
dir_to_remove="$app_resource/"*.lproj 
[ -d "$dir_to_remove" ] && rmdir "$dir_to_remove" 
+0

Vielen Dank für diesen Zusatz! Das verdeutlicht viel. Glücklicherweise ist es in diesem Fall 100% sicher, dass das Verzeichnis existiert, weil früher Skripte laufen. Natürlich ist 100% sehr gefährlich zu sagen, aber in dieser Situation ist es nicht schädlich. Ich habe das zu meiner Codebox (Schnipsel) hinzugefügt; super praktisch zu wissen :) –

+0

@ User2910293 Und da Sie direkt zu 'rmdir' senden, bekommen Sie nur:' rmdir: konnte '....' nicht löschen: Keine solche Datei oder Verzeichnis'. Also nicht der schlimmste Fehler. – andlrc