2012-02-01 60 views
0

Shell(/bin/bash)將單引號添加到從for循環中的文件讀入的變量中,並導致rsync失敗。Shell將單引號添加到rsync失敗的變量

我有一個shell腳本做一堆rsync s。輸入文件看起來是這樣的: /home/account/this子目錄

的for循環看起來是這樣的:

IFS=$'\n' 
for SOURCE_DEST in `cat file_list` 
do 
    rsync -av -e 'ssh -p 2222' [email protected]:$SOURCE_DEST 
done 

沒有IFS=$'\n',默認導致$SOURCE_DEST只包含:的 /home/account/this代替/home/account/this subdirectory

但是,當我使用IFS=$'\n'運行此腳本時,它會在$SOURCE_DEST周圍提供單引號,例如:'[email protected]:/home/account/this subdirectory',這會導致rsync失敗並執行奇怪的操作。

例子:

rsync --delete-after -av -e 'ssh -p 2222' '[email protected]:/home/account/this subdirectory' 

其失敗,我需要的是這個沒有單引號:

rsync --delete-after -av -e 'ssh -p 2222' [email protected]:/home/account/this subdirectory 

回答

1

我要去假設沒有名中包含空格,因爲你」重新使用空格作爲分隔符,所以類似這樣的事情如何:

while read line 
do 
    line=($line) # split line on its spaces 
    rsync -av -e 'ssh -p 2222' [email protected]:${line[0]} ${line[1]} 
done < file_list 

這會讀取您的file_list一次一行,在空間分割,然後用第一個和第二個「單詞」作爲參數。

正如Johnsyweb指出的那樣,您可能意味着該目錄實際上確實有一個空間,並且您想將其傳遞給rsync。在這種情況下,我會說:

while read line 
do 
    rsync -av -e 'ssh -p 2222' "[email protected]:${line// /\ }" 
done < file_list 

這應該會導致所有空間都被轉義,我認爲這可能是您之前缺少的。

+1

如果我正確地閱讀了這個問題,'$ {SOURCE_DEST}'應該是'/ home/account /這個子目錄',它包含一個空格。 – Johnsyweb 2012-02-01 19:46:41

+0

嗯。你可能是對的 - 起初我想過,但不知道如何理解它。如果是這樣,不應該更難。那麼我也會更新解決方案。 – FatalError 2012-02-01 19:52:16

+1

是的,應該有一個空間,因爲它將源路徑複製到DEST路徑。 – 2012-02-01 21:22:35