2017-02-05 5 views
0

Schreiben Sie ein kleines Skript in bash (MacOS in der Tat), und ich möchte finden, mit mehreren Quellen. Normalerweise kein Problem, aber die Liste der zu durchsuchenden Quellverzeichnisse wird als String in einer Variablen gehalten. Auch das ist normalerweise kein Problem, aber einige von ihnen enthalten Leerzeichen in ihrem Namen.Finden Sie Platz Escape

Ich kann die vollständige Befehlszeichenfolge erstellen und wenn direkt an der Eingabeaufforderung eingegeben (Kopieren und Einfügen in der Tat) funktioniert es wie erforderlich und erwartet. Aber wenn ich versuche, es innerhalb des Skripts auszuführen, wird es auf die Leerzeichen im Namen übersprungen und ich konnte das nicht umgehen.

Ich kann nicht den gesamten Quellstring zitieren, da dieser dann nur als ein einzelnes Element gesehen wird, das natürlich nicht existiert. Ich entkomme jedes Leerzeichen mit einem umgekehrten Schrägstrich in der Zeichenfolge, die in der Variablen enthalten ist, und es ist einfach verloren. Wenn ich einen doppelten Backslash benutze, bleiben beide an ihrem Platz und es schlägt wieder fehl. Jede Art von Zitaten, die ich versucht habe, wird grundsätzlich ignoriert, die Anführungszeichen werden als normale Zeichen betrachtet, und die Aufteilung erfolgt in jedem Bereich.

Ich konnte bis jetzt nur eval über den gesamten Befehlsstring verwenden, um es zur Arbeit zu bringen, aber ich fühlte, dass es eine bessere Lösung als diese geben sollte.

Ironischerweise kann ich, wenn ich AppleScript benutze, eine geeignete Befehlszeichenkette erstellen und sie perfekt mit doShellScript ausführen (ok, das benutzt JXA, aber es ist dasselbe mit dem tatsächlichen AppleScript). Allerdings war ich bisher nicht in der Lage, den korrekten Escape-Mechanismus in einer Bash-Schrift zu finden, ohne auf eval zurückzugreifen.

Wer schlägt eine Lösung vor?

+0

Weniger Wörter und mehr Code, um die problematischen Teile zu zeigen, wäre besser .... – jm666

+0

Es tut mir leid, wenn Sie Wörter schwierig zu lesen haben. – UKenGB

Antwort

0

Wenn möglich, speichern Sie nicht alle Pfade in einer Zeichenfolge. Ein Array ist sicherer und bequemer:

paths=("first path" "second path" "and so on") 
find "${paths[@]}" 

Der Fund Befehl

find "first path" "second path" "and so on" 

erweitern Wenn Sie die Zeichenfolge verwenden müssen und wollen nicht eval verwenden, split the string in ein Array:

string="first\ path second\ path and\ so\ on" 
read -a paths <<< "$string" 
find "${paths[@]}" 

Pfade in Zeichenfolge sollten \ verwenden, um Leerzeichen zu vermeiden; Wrapping-Pfade innerhalb "" oder '' wird nicht funktionieren. eval könnte hier die bessere Option sein.

+0

Aber wie gesagt, die Pfade (nun, nur Verzeichnisnamen) sind in einer Zeichenfolge und nicht in einem Array. – UKenGB

+0

@UKenGB Entschuldigung, Ihre Frage war mir nicht sehr klar. Können Sie genau beschreiben, wie sie in der Zeichenfolge gespeichert sind? Mach ein Beispiel. Ist das Format '" erster Pfad "" zweiter Pfad "' oder 'erster \ Pfad zweiter \ Pfad' oder' erster Pfad zweiter Pfad'? – Socowi

+0

Für Apple/JavaScript werden sie als 'iTmeDIRS =' gespeichert. Hörbücher Home \\ Videos Filme Musik Podcasts TV \\ Shows 'und iTmeDIRS können dem Suchbefehl zugeführt werden, um als Quellverzeichnis für die Suche verwendet zu werden. Das funktioniert. Aber ich kann in einem Bash-Skript keinen Weg finden, diese Liste von Verzeichnissen in einer Variablen zu speichern, die auf die gleiche Weise für den Befehl find benutzt werden kann. Ich versuche jedoch, die Leerzeichen in den Namen zu zitieren/zu entkommen, es scheitert einfach. – UKenGB