这个问题已经在这里有一个答案:
我有存储在各种命令的一些选项。不幸的是,每当有一个空格bash的对待,尽管字符串为变量分隔在引号之中。
我知道,它是用在bash阵列做的是正确的方法,但这种情况我遇到的是基于其在git的承诺部署代码传统脚本。不幸的是我必须留在字符串中变量的解决方案,这是做得很好,直到有必要在一个参数使用空间(采取例如一看,有--filter='- /logs/'
参数。
示例脚本:
#!/bin/bash
RSYNC_OPTS="-r --delete --exclude .env --filter='- /logs/' --links"
mkdir a b
rsync $RSYNC_OPTS a b
我有以下错误:
未知过滤规则:` ' - ' rsync的错误:在exclude.c语法或使用错误(代码1)(927)[客户= 3.1.3]
据我了解,--filter='-
后空间表现得像参数的分隔符,尽管在单引号中使用。
到现在为止我尝试:
${RSYNC_OPTS@Q}
RSYNC_OPTS
可变空间或单引号如何使bash的解释引号的字符串正确发送它作为变量的字符串时?我希望会有解决方案,不涉及改变RSYNC_OPTS比单一的文本字符串变量别的东西。
与"$RSYNC_OPTS"
尝试(抑制通配符),还可以使用eval
,如:
eval rsync "$RSYNC_OPTS" a b
对于这样的情况时,bash阵列是适当的解决方案。
RSYNC_OPTS=(-r --delete --exclude .env --filter='- /logs/' --links)
rsync "${RSYNC_OPTS[@]}" a b