2017-05-24 4 views
0

Es tut mir leid, wenn jemand diese Frage oder etwas in der Nähe schon gestellt hat, aber ich habe nichts in der Nähe gefunden, aber vielleicht liegt es an meiner Programmierschwäche.Unerklärter Zeilenumbruch

Ich habe bash dieses Skript:

... 
... 
## Read n line in vmlist 
VMTORESTORE=$(sed -n "$yn p" ./vmlist) 
## Replace " " between names by "\ " 
VMTORESTORE="$(echo "$VMTORESTORE" | sed 's/ /\\ /g' )" 
## Test variable 
echo $VMTORESTORE 
## Run Command 
ls -1 /vmfs/volumes/BACKUP_SAN/$VMTORESTORE | sed 's/ /\\ /g' 

Dies ist das Ergebnis:

Speicher \ Kamera

ls:/vmfs/Volumen/BACKUP_SAN/Save: Keine solche Datei oder directory

Kamera:

Ich verstehe nicht, warum das Echo das gute Ergebnis gab, während der Befehl einen Zeilenumbruch zwischen Save \ und Camera einfügt.

Vielen Dank im Voraus für Ihre Hilfe.

Proc

+0

Sagt der Fehler nicht 'ls:/vmfs/volumes/BACKUP_SAN/Save \: Keine solche Datei oder Verzeichnis? – 123

Antwort

0

Danke euch allen, ich habe keine so einfache Lösung erwartet. Sie hatten Recht, die Anführungszeichen wurden benötigt.

Aber in meinem Fall war das nicht genug. Der Weg zum gesuchten Ordner war:

„/ vmfs/Volumen/BACKUP_SAN/Save Camera /“

aber in der Regel in Linux, diese Art von Ordner zu erreichen Ich brauche \ vor Räumen so zu setzen:

"/ vmfs/Volumen/BACKUP_SAN/Save \ Camera /"

Deshalb habe ich in meinem Skript ersetzt alle "" mit "\"

Aber ist scheint in einem bash-Skript, das nicht so benötigt wird, Das funktioniert wie ein Zauber:

... 
... 
## Read n line in vmlist 
VMTORESTORE=$(sed -n "$yn p" ./vmlist) 
## Run Command 
ls -1 "/vmfs/volumes/BACKUP_SAN/$VMTORESTORE" 

Ich suchte die Komplikation, während es so einfach war.

Vielen Dank für Ihre Hilfe.

2

es ist eine gute Idee, die Variablen wie in zitieren:

ls -1 "/vmfs/volumes/BACKUP_SAN/$VMTORESTORE" 

Nehmen Sie dies als eine gute Praxis und aktualisieren Sie das Skript, wo immer erforderlich.

+0

Dies funktioniert immer noch nicht, da ein Backslash im Dateinamen vorhanden ist. – 123

+0

Ja, aber dies ist die richtige Lösung * anstelle * Backslashes hinzuzufügen, um den Raum zu verlassen. – chepner

0

Dies passiert, weil \ ein Escape-Zeichen in bash ist. Daher sollte Ihr Pfad nicht aus /, sondern aus \ bestehen, um den Standort save/camera zu definieren. Wenn Sie Befehle ohne " " verwenden, geschieht auch Globbing, also verwenden Sie die Adresse in " ".