bash及其引用规则的问题

我遇到了bash的引用规则问题,我不知道如何解决这个问题。 我想在某种configuration文件中有一个variables,其中可以指定命令行选项列表。 在我的情况下是rsync:rsync有命令行选项'–rsh',它允许你指定它在另一端使用的遥控器。 例如:

rsync -v --rsh="ssh -p4711 -lhttp" /tmp/testfile remoteMachine.x:/tmp/testfile 

这完美的作品! 但是,如果您尝试在脚本中执行此操作,您希望允许在variables中指定所有选项,如下所示:

 #!/bin/bash OPTS="-v --rsh=\"ssh -p4711 -lhttp\"" rsync $OPTS testfile remoteMachine.x:/tmp/testfile 

在执行此脚本时,将会失败并显示以下错误:

 rsync: -p4711: unknown option 

这是,因为bash正在做一些讨厌的引用/转义,我不明白为什么(你可以看到什么bash使用'bash -x'):

 + OPTS='-v --rsh="ssh -p4711 -lhttp"' + rsync -v '--rsh="ssh' -p4711 '-lhttp"' testfile remoteMachine.x:/tmp/testfile 

我尝试了弱和强引号(“,”)的多种组合,但没有任何作品…你能帮我,为什么bash是这样做的,我怎么能解决这个奇怪的行为?

来自科隆的感谢和问候!

使用数组:

 OPTS=(-v --rsh="ssh -p4711 -lhttp") rsync "${OPTS[@]}" testfile remoteMachine.x:/tmp/testfile 

有两种选择:通过RSYNC_RSH环境变量传递--rsh选项,或直接使用--portlogin@host:path语法将端口和登录选项传递给rsync