Bash 脚本 rsync 益智游戏

Bash 脚本 rsync 益智游戏

令人沮丧。下面的脚本适用于前两个目标,但不适用于第二个目标。

#!bin/bash
...
backitup () {
Todaysdate=`date "+%Y-%m-%dT%H_%M_%S"`
Sourcedir=$1
Destination=$2
Username=$(echo $Sourcedir | cut -f1 -d'@')
if [ "$Username" = "root" ] ; then
    RSYNCPATH="rsync"
else
    RSYNCPATH="sudo rsync"
fi

cmd="sudo rsync -vazP --rsync-path='$RSYNCPATH' --log-file=/var/log/rsync.log $Sourcedir /BACKUPS/$Destination/back-$Todaysdate"
                echo $cmd >> ~/cmd.txt
                $cmd
...
}
backitup root@HAZns01:/etc "HAZNS01/etc"
backitup root@HAZns01:/home/ftpusers "HAZNS01/ftpusers"
backitup jakadmin@HAZFAND10:/etc "HAZFAND10/etc"
backitup jakadmin@HAZFAND11:/etc "HAZFAND11/etc"

后两个调用给出:

unexpected remote arg: jakadmin@HAZFAND10:/etc

但是,如果我运行然后从命令行(bash cmd.txt)手动运行 cmd.txt 的内容,那么它运行正常。怎么可能? (当然,我已经正确设置了无密码 ssh)

我缺少什么?

答案1

请参见Bash常见问题解答/050

由于 WordSplitting 以及变量内的单引号是文字,因此此操作失败;不符合语法。

在编写 shell 脚本时应避免将命令放入变量中。

使用函数可以重用命令。用于set -x记录。或者仅在必要时使用数组来保存命令的各个部分及其参数。

顺便说一下,在一行中您使用$()命令替换。这是正确的方法。在另一行中,您使用了已弃用的反引号。至少要保持一致。

相关内容