Shell正在为rsync失败的变量添加单引号

时间:2012-02-01 19:33:10

标签: shell rsync quote

Shell(/bin/bash)正在为从for循环中的文件读入的变量添加单引号,导致rsync失败。

我有一个shell脚本执行一堆rsync s。输入文件如下所示: /home/account/this子目录

for循环如下所示:

IFS=$'\n'
for SOURCE_DEST in `cat file_list`
do
    rsync -av -e 'ssh -p 2222' account@domain.com:$SOURCE_DEST
done

如果没有IFS=$'\n',默认情况下$SOURCE_DEST只会包含: /home/account/this代替/home/account/this subdirectory

但是,当我使用IFS=$'\n'运行此脚本时,它会在$SOURCE_DEST周围放置单引号,例如:'account@domain.com:/home/account/this subdirectory',这会导致rsync失败并执行奇怪的操作。

示例:

rsync --delete-after -av -e 'ssh -p 2222' 'account@domain.com:/home/account/this subdirectory'

失败了,我需要的是没有单引号:

rsync --delete-after -av -e 'ssh -p 2222' account@domain.com:/home/account/this subdirectory

1 个答案:

答案 0 :(得分:1)

我将假设没有名称包含空格,因为你使用空格作为分隔符,那么如何做这样的事情:

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

这一次读取你的file_list一行,在空格处分割它,然后使用它作为args的第一个和第二个“word”。

正如Johnsyweb所指出的那样,你可能意味着该目录实际上确实有一个空格,你想将它传递给rsync。在那种情况下,我会说:

while read line
do
    rsync -av -e 'ssh -p 2222' "account@domain.com:${line// /\ }"
done < file_list

这应该导致所有空间被转义,我认为这可能是你以前缺少的。