对于存储在变量中的命令,我有一些选择。 不幸的是,尽管有引号,但无论何时有空格,bash都会将其视为变量分隔符。
我知道,正确的做法是在bash中使用数组,但是我遇到的这种情况是基于遗留脚本的,这些遗留脚本在git中的commit上部署代码。不幸的是,我不得不留在可变字符串解决方案中,该解决方案一直很好,直到需要在参数之一中使用空格为止(以示例为例,这里有--filter='- /logs/'
参数。
示例脚本:
#!/bin/bash
RSYNC_OPTS="-r --delete --exclude .env --filter='- /logs/' --links"
mkdir a b
rsync $RSYNC_OPTS a b
我遇到以下错误:
未知的过滤器规则:''-'rsync错误:语法或用法错误(代码1) 在exclude.c(927)[client = 3.1.3]
据我了解,--filter='-
之后的空格尽管用作单引号,但其作用类似于参数分隔符。
直到现在我一直尝试:
${RSYNC_OPTS@Q}
RSYNC_OPTS
变量中转义空格或单引号当将bash作为变量的字符串发送时,如何使bash正确解释引号中的字符串?我希望将有一种解决方案,不涉及将RSYNC_OPTS更改为单字符串文本变量以外的其他变量。
答案 0 :(得分:3)
在这种情况下,bash数组是正确的解决方案。
RSYNC_OPTS=(-r --delete --exclude .env --filter='- /logs/' --links)
rsync "${RSYNC_OPTS[@]}" a b
答案 1 :(得分:0)
尝试使用"$RSYNC_OPTS"
(抑制水珠),也使用eval
,例如:
eval rsync "$RSYNC_OPTS" a b