0

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

我有一个shell脚本做一堆rsyncs。输入文件如下所示: /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'周围加上单引号,这会导致 rsync 失败并做一些奇怪的事情。$SOURCE_DEST'account@domain.com:/home/account/this subdirectory'

例子:

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
4

1 回答 1

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 的第一个和第二个“单词”。

正如 Johnsyweb 所指出的,您可能意味着该目录实际上确实有一个空间,并且您想将其传递给rsync. 在这种情况下,我会说:

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

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

于 2012-02-01T19:44:18.723 回答