我正在尝试编写一个 bash 脚本,用于使用 rsync 将快照备份到服务器。
我要调用的命令是
rsync -aPh -e ssh --rsync-path='sudo rsync' --link-dest=../last /home/username/files remoteuser@server:/srv/backups/snapshots/username/snapshot_xxx
我的脚本看起来像
OPT="-aPh -e ssh --rsync-path='sudo rsync'"
LINK="--link-dest=../last/"
SRC="/home/username/files/"
SNAP="remoteuser@server:/srv/backups/snapshots/username/"
date=`date "+%Y-%b-%d_%T"`
# Run rsync to create snapshot
rsync $OPT $LINK $SRC ${SNAP}$date
使用 bash -x 运行此脚本我得到的命令是
rsync -aPh -e ssh '--rsync-path='\''sudo' 'rsync'\''' --link-dest=../last /home/username/files remoteuser@server:/srv/backups/snapshots/username/snapshot_xxx
这会导致以下错误:
bash: -c: 第 0 行:寻找匹配的 ''' 时出现意外的 EOF
bash: -c: 第 1 行:语法错误:意外的文件结尾
如何防止 bash 插入额外的单引号和转义的单引号?
答案1
Bash 不会插入额外的引号,但您在这里插入了:
OPT="-aPh -e ssh --rsync-path='sudo rsync'"
^ ^
该赋值设置OPT
为字符串-aPh -e ssh --rsync-path='sudo rsync'
。当它在命令行中展开时rsync
,它会在空格上分割为五个不同的参数:aPh
、-e
和。ssh
--rsync-path='sudo
rsync'
'\''
您在 的输出中看到的内容是bash -x
包含引号的参数的表示。它有点难以阅读,但'foo'\''bar'
它是单引号的等价物"foo'bar"
(它有两个单引号字符串,中间有一个转义单引号。)
变量扩展后引号不起作用,您无法在简单变量中存储参数包含空格的命令,您需要使用数组来代替。
看: