bash使用嵌入变量和单引号向数组添加值

bash使用嵌入变量和单引号向数组添加值

我确信这个主题已经完全清楚了:) 开玩笑吧,我认为我找到答案的部分问题是编写搜索词。

当我通过使用数组作为参数在 bash 脚本中发出命令时,我很幸运。

例如,我调用 rsync 并创建了一个类似的数组(spolier 警报 - 稍后将引用多余的变量):

#!/usr/bin/env bash
set -euo pipefail
rf=.rsync-filter
srcff="/home/roger/home$rf"

hm=/home/roger
syncto=/tmp/to-remote/home

rsarg=(-avv --prune-empty-dirs --stats)
rsarg+=(--dry-run)

rsync "${rsarg[@]}" "$hm" "$syncto/"  #works

exit

我遇到问题的地方是将 $srcff 变量添加到过滤规则并将其添加到 rsarg 数组。

rsarg+=("--filter='merge $srcff'") # no dice
# or this
rsarg+=("--filter='merge ${srcff}'") # sad trombone

运行后我得到:

$ ./home-sync-simple
Unknown filter rule: `'merge /home/roger/home.rsync-filter''
rsync error: syntax or usage error (code 1) at exclude.c(904) [client=3.1.1]

我可以通过将合并规则添加到数组外部的 rsync 行并减去嵌入变量来使其工作:

rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' "$hm" "$syncto/"

用数组外部的变量替换上面的过滤器,也会以同样的方式失败:

rsync "${rsarg[@]}" "--filter='merge $srcff'" "$hm" "$syncto/" 

我已经尝试了许多其他变体,我假设除了实际有效的变体之外的所有可能的变体。有时它会导致“过滤规则意外结束:合并”和其他情况。为了简洁起见,我排除了这些版本,因为我认为上面的版本更接近正确(他紧张地说道)。我猜我最终传递的参数太少/太多。

提前致谢!

答案1

如果这有效:

rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' ...

那我想你会的不是想要给 加上单引号rsync。在这里,贝壳在rsync看到它们之前就把它们吃掉了。您的其他示例在引号中包含引号,因此内部的引号会保留并传递以供rsync查看。

因此在构建数组时跳过单引号:

rsarg+=("--filter=merge $srcff")

请注意,从 shell 的角度来看,等号没有什么特别的,并且不需要将后面的部分与之前的部分区别对待。与or 、 or Even--foo=bar相同。--foo="bar""--foo=bar"--fo"o=ba"r

相关内容