开发者问题收集

从字符串变量中使用时包含空格的参数无法正确解析[重复]

2019-02-05
302

我有一些存储在变量中的命令选项。 不幸的是,只要有空格,bash 就会将其视为变量分隔符,尽管字符串在引号中。

我知道,正确的方法是在 bash 中使用数组,但我遇到的这种情况是基于在 git 中提交时部署代码的旧脚本。不幸的是,我不得不继续使用字符串变量解决方案,这个解决方案一直运行良好,直到需要在其中一个参数中使用空格(请看示例,有 --filter='- /logs/' 参数。

示例脚本:

#!/bin/bash

RSYNC_OPTS="-r --delete --exclude .env --filter='- /logs/' --links"
mkdir a b
rsync $RSYNC_OPTS a b

我收到以下错误:

Unknown filter rule: `'-' rsync error: syntax or usage error (code 1) at exclude.c(927) [client=3.1.3]

据我所知, --filter='- 后的空格充当参数分隔符,尽管用在单引号中。

到目前为止,我尝试过:

  • 变量的引用模式: ${RSYNC_OPTS@Q
  • RSYNC_OPTS 变量中转义空格或单引号
  • 用双引号更改单引号

如何让 bash 解释当将引号中的字符串作为变量中的字符串发送时,引号中的字符串是否正确?我希望有一个解决方案,不涉及将 RSYNC_OPTS 更改为单个字符串文本变量以外的其他变量。

2个回答

对于这种情况,bash 数组是正确的解决方案。

RSYNC_OPTS=(-r --delete --exclude .env --filter='- /logs/' --links)
rsync "${RSYNC_OPTS[@]}" a b
KamilCuk
2019-02-05

尝试使用 "$RSYNC_OPTS" (抑制通配符)并使用 eval ,例如:

eval rsync "$RSYNC_OPTS" a b
nullPointer
2019-02-05