从字符串变量使用时包含未正确解析空格的参数

时间:2019-02-05 09:31:08

标签: bash

对于存储在变量中的命令,我有一些选择。 不幸的是,尽管有引号,但无论何时有空格,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更改为单字符串文本变量以外的其他变量。

2 个答案:

答案 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