ubuntuusers.de

Bash: Leerzeichen in Variablen escapen (möglichst elegant)

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

ui

Anmeldungsdatum:
22. November 2008

Beiträge: 603

In einem Bash-Skript habe ich Variablen mit Dateipfaden. Manche Dateien haben leider Leerzeichen im Namen und da kracht es dann u.a. bei

1
if [ -f $dateinameMitLeerzeichen]

oder

1
rm $dateinameMitLeerzeichen

Ich könnte jetzt alle $dateinameMitLeerzeichen ersetzen durch "$dateinameMitLeerzeichen" oder '$dateinameMitLeerzeichen'. Aber gibt es noch einen eleganteren Weg (sprich ohne viel Tippen)? Ich bin kein Bash-Könner. Aber vielleicht gibt es ja sowas wie ne Bash-Option, die man oben im Skript setzen kann und gut ist.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Ich könnte jetzt alle $dateinameMitLeerzeichen ersetzen durch "$dateinameMitLeerzeichen"

Die meisten Editoren bieten dazu passend eine Suche&Ersetzen Funktion.

Aber vielleicht gibt es ja sowas wie ne Bash-Option, die man oben im Skript setzen kann und gut ist.

Das Problem ist daß man ja manchmal auch will, daß nach Leerzeichen getrennt wird. Das ist ja kein Bug in der Bash sondern ein Feature.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

ui schrieb:

Ich könnte jetzt alle $dateinameMitLeerzeichen ersetzen durch "$dateinameMitLeerzeichen" oder '$dateinameMitLeerzeichen'.

Das ist bei Bash-Skripten das einzig senkrechte, was man machen kann. Und du willst doppelte Anführungszeichen, sonst ersetzt die Bash die Referenz nicht mit dem Wert der Variablen.

Aber gibt es noch einen eleganteren Weg (sprich ohne viel Tippen)?

Man könnte natürlich einen guten Texteditor nutzen, der einem die Arbeit größtenteils abnimmt, z.B. kann man in vim nach Referenzen auf Variablen (mit Dollarzeichen beginnend, danach alphanumerischen Zeichen und Underscores) suchen und interaktiv bestätigen, dass Anführungszeichen drum herum gesetzt werden sollen (ohne das abschließende c fragt er nicht nach, bevor er das macht):

:%s/\$[[:alnum:]_]/"&"/gc

Andere Editoren bieten interaktives ersetzen mit Regulären Ausdrücken teilweise auch an.

Antworten |