bash及其引用规则的问题

时间:2013-10-18 15:28:20

标签: linux bash shell quotes

我遇到了bash引用规则的问题,我不知道如何解决它。 我希望在某种配置文件中有一个变量,可以指定命令行选项列表。在我的情况下,这是rsync: rsync有命令行选项'--rsh',它允许你指定它在另一侧使用的remoteshell。例如:

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

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

#!/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会这样做以及我如何解决这种奇怪的行为?

来自科隆的致谢和问候!

2 个答案:

答案 0 :(得分:3)

使用数组:

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

答案 1 :(得分:1)

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