bash 脚本单引号和反斜杠创建

bash 脚本单引号和反斜杠创建

我正在尝试编写一个 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='sudorsync'

'\''您在 的输出中看到的内容是bash -x包含引号的参数的表示。它有点难以阅读,但'foo'\''bar'它是单引号的等价物"foo'bar"(它有两个单引号字符串,中间有一个转义单引号。)

变量扩展后引号不起作用,您无法在简单变量中存储参数包含空格的命令,您需要使用数组来代替。

看:

相关内容