2009-07-27 9 views
0

Ich habe ein Shell-Skript geerbt. Eines der Dinge, die es tut, ist das Parsen einer Liste von Dateinamen. Für jeden Dateinamen in der Liste ist das Kommando folgenden:bash Parameter Erweiterung ändert ursprünglichen String

fs_item="`echo ${fs_item%/}`" 

Diesen Befehl (ein Teil von tut es der Aufgabe, die in diesem Fall denke ich, ist alles nach dem letzten Schrägstrich entfernen) mit einem Leerzeichen ersetzt Leerzeichen in Dateinamen :

in: aa bbbb    ccc 
out: aa bbbb ccc 

Von diesem Punkt ist der Dateiname gebrochen.

Also, die Frage ist: Kann ich irgendwie sagen Bash nicht Räume zu ersetzen?

+0

Das ist mir unklar, .. wenn Sie nicht über die Linie fs_item wollen = "' echo $ {fs_item% /} '" Räume zu ersetzen, dann entfernen Sie diese Zeile. – nos

+0

Ich habe einen Kommentar hinzugefügt. Der Befehl gibt es aus einem anderen Grund, Bot ersetzt Leerzeichen –

+0

$ {foo% /} entfernt nur einen abschließenden Schrägstrich, wenn es einen gibt. Wenn mehrere Schrägstriche vorhanden sind, wird nur die letzte entfernt. –

Antwort

0

Ist das Echo wirklich notwendig? Man könnte es einfach entfernen:

fs_item="${fs_item%/}" 

Wenn Ihr aktuelles Problem etwas anders ist, und Sie können nicht loswerden der Echo bekommen (oder einem anderen Befehlsaufruf), einige Zitate Hinzufügen funktionieren sollte:

fs_item="`echo \"${fs_item%/}\"`" 

Die Leerzeichen verschwinden beim Ausführen des rückgestrichenen Befehls echo. Das interne Feldtrennzeichen enthält das Leerzeichen, so dass Wörter, die durch eine Folge von einem oder mehreren Leerzeichen getrennt sind, als separate Argumente an echo übergeben werden. Dann druckt echo nur die Argumente, die durch ein einzelnes Leerzeichen getrennt sind.

Da wir auf dem internen Feldtrenn Thema sind, sollte der IFS verändern sich auch arbeiten (aber in der Regel hat andere möglicherweise unerwünschte Auswirkungen an anderer Stelle in Ihrem Skript):

IFS=$'\n' 

Hier wird die interne Feldtrenn die Newline-Zeichen. Danach werden die Leerzeichen nicht mehr als Trennzeichen für Listen betrachtet. Der echo-Befehl empfängt nur ein Argument (außer Sie haben Dateinamen mit dem Zeilenumbruchzeichen in ihnen) und Leerzeichen bleiben intakt.

+0

Das Hinzufügen von Anführungszeichen fügt nur eine zusätzliche Ebene der Verschleierung hinzu. Das Echo muss gelöscht werden. –

+0

Basierend auf den Kommentaren in der ursprünglichen Frage vermute ich, dass das eigentliche Problem scheinbar nicht möglich ist, so zu vereinfachen. Aber gut genug, ich werde das auch in meiner Post erwähnen. –

0

Versuchen Sie, IFS auf etwas anderes einzustellen, z. IFS = ","

1

Entfernen Sie die Backticks und den Echo-Befehl. In dieser Situation ist es schlimmer als nutzlos, da es nichts hinzufügt und das Problem verursacht, das Sie hier zu lösen versuchen.

fs_item="${fs_item%/}"