2012-10-09 14 views
21

Sono nuovo allo script di shell. Qualcuno può aiutarmi con il comando a sfuggire allo spazio con "\". Ho un FILE_PATH variabile =/path/to il mio file/testo,
voglio sfuggire gli spazi solo FILE_PATH =/path/to \ My/testo \ fileComando Unix per scappare dagli spazi

ho provato con comando tr -s ma esso non aiuta

FILE_PATH = echo FILE_PATH | tr -s " " "\\ "

qualcuno può suggerire il comando di destra !!

+0

Qual è il problema ** reale ** che stai riscontrando? –

+0

Voglio semplicemente sfuggire allo spazio in modo da poter utilizzare altri comandi come cp, rm, ecc. – Mojoy

+5

Se si desidera utilizzare FILE_PATH in altri comandi, è sufficiente utilizzare le virgolette. 'rm" $ FILE_PATH "' funziona bene se contiene spazi bianchi. –

risposta

8

C'è di più a fare una stringa di prevenire che gli spazi solo in fuga, ma si può sfuggire gli spazi con:

FILE_PATH=$(echo "$FILE_PATH" | sed 's/ /\\ /g') 
+0

Ti piacerebbe elaborare? Immagino che tu stia suggerendo l'eliminazione dei caratteri riservati dalla shell, ad esempio, '[]() {}; '"[: space:] &' così come i caratteri non stampabili Hai altro in mente? –

+0

@Barton Dipenderà sicuramente dall'uso, ma tutti i personaggi che hai citato sono sospetti. la mente è che il tentativo di sfuggire ai personaggi per qualsiasi tipo di protezione è fragile e non qualcosa che dovrebbe essere fatto senza grande cura. –

1

È possibile farlo con sed:

NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\ /g')" 
+0

'FILE_PATH = $ (echo $ FILE_PATH | sed" s// \\\/g ")' Sono necessari tre backslash perché è necessario sfuggire al carattere backslash sia nella shell che in sed. – sevcsik

-3
FILE_PATH=/path/to my/text file 
FILE_PATH=echo FILE_PATH | tr -s " " "\\ " 

Questo secondo la linea deve essere

FILE_PATH=echo $FILE_PATH | tr -s " " "\\ " 

ma non credo che importi. Una volta raggiunto questo stadio, sei in ritardo. La variabile è stata impostata e gli spazi sono sfuggiti o la variabile non è corretta.

FILE_PATH = '/ path/to il mio file/testo'

+0

'FILE_PATH = echo $ FILE_PATH | tr -s "" "\\" 'è rotto. È necessario '$()' –

+0

Abbastanza corretto - stavo scrivendo rapidamente - ma non era il punto principale. – hymie

+0

Inoltre, 'tr' non può essere usato per questo. –

30

Se si utilizza bash, è possibile utilizzare% q formattatore del suo printf integrato (tipo help printf in bash):

FILENAME=$(printf %q "$FILENAME") 

Questo non citerà solo lo spazio, ma anche tutti i caratteri speciali per la shell.

+0

Usando questo ho ancora problemi con due spazi concatenati. Cosa posso fare? –

8

si può usare 'apici' di operare su un percorso che contiene spazi:

cp '/path/with spaces/file.txt' '/another/spacey path/dir'

grep foo '/my/super spacey/path with spaces/folder/*'

in uno script:

#!/bin/bash 

spacey_dir='My Documents' 
spacey_file='Hello World.txt' 
mkdir '$spacey_dir' 
touch '${spacey_dir}/${spacey_file}' 
+2

A meno che non sia necessario eseguire l'interpolazione variabile, in realtà suggerirei di utilizzare virgolette singole anziché doppie. Ci sono alcuni personaggi subdoli come '!' Che bash cercheranno di interpolare tra virgolette doppie, ma non singole. Certo, sei libero di lanciare un vaiolo su chiunque metta i caratteri bang nei nomi dei file. –

1

utilizzare le virgolette per preservare il carattere SPACE