2012-02-01 32 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