2012-10-09 83 views
21

我是shell腳本的新手。有人可以幫助我用命令逃離「\」的空間。 我有一個變量FILE_PATH = /路徑/我的/文本文件,
我想獨自逃生的空間 FILE_PATH = /路徑/到\我的/文\文件Unix命令轉義空格

我用TR -s命令嘗試,但它不利於

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

有人可以提出正確的命令!

+0

你有什麼**真實**問題? –

+0

只是想逃離的空間,以便我可以在其他命令如cp,rm等中使用 – Mojoy

+5

如果您想在其他命令中使用FILE_PATH,只需使用引號。 'rm「$ FILE_PATH」'工作得很好,如果它包含空格。 –

回答

8

還有更多的製作串不僅僅是逃避空間安全的,但你可以擺脫空間與:

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

你願意詳細說明嗎?我猜測你建議刪除shell保留的字符,例如'[](){}; ''[:space:]&'以及不可打印的字符。你還有什麼想法嗎? –

+0

@Barton它肯定會依賴於使用,但是你提到的所有字符都是可疑的。頭腦是試圖逃避角色的任何形式的保護是脆弱的,而不是沒有很小心就應該做的事情。 –

1

你可以用sed做到這一點:

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

'FILE_PATH = $(echo $ FILE_PATH | sed's// \\\/g「)' 您需要三個反斜槓,因爲您必須在shell和sed中都轉義反斜槓字符。 – sevcsik

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

這第二行需要是

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

但我不認爲這很重要。一旦你到達這個階段,你太遲了。該變量已設置,並且空格被轉義或變量不正確。

FILE_PATH = '/路徑/我的/文本文件'

+0

'FILE_PATH = echo $ FILE_PATH | tr -s「」「\\」'壞了。你需要'$()' –

+0

夠公平 - 我很快打字 - 但這不是主要的一點。 – hymie

+0

另外,'tr'不能用於此。 –

30

如果你正在使用bash,你可以使用它內置的printf的%Q格式(在bash型help printf):

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

這不僅會引用空間,而且還會引用shell的所有特殊字符。

+0

使用此我仍然有兩個連接空格的問題。我能做什麼? –

8

您可以使用 '單引號' 到包含空格的路徑上運行:

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

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

在腳本:

#!/bin/bash 

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

除非你需要做可變插值,否則我實際上會建議使用單引號而不是雙引號。有一些鬼鬼祟祟的字符,比如'!'bash會嘗試在雙引號內插入,但不是單引號。當然,你可以自由地對那些把爆炸字符放在文件名中的人施加麻煩。 –