![扩展包含等号和花括号的变量](https://linux22.com/image/136348/%E6%89%A9%E5%B1%95%E5%8C%85%E5%90%AB%E7%AD%89%E5%8F%B7%E5%92%8C%E8%8A%B1%E6%8B%AC%E5%8F%B7%E7%9A%84%E5%8F%98%E9%87%8F.png)
我正在编写一个使用 rsync 并根据某些设置排除文件的脚本。我最终得到一个格式为 的排除标志--exclude={foo, bar, baz}
。
然而,在尝试在命令中扩展它时rsync
,我注意到该标志被转义了。从bash调试器中,我可以看到我的rsync $excludes
comes命令rsync '--exclude={foo,bar,baz}'
,而不是预期的rsync --exclude={foo,bar,baz}
.通过一些测试,我发现任何包含=
、{
、 或 的字符串}
在展开时都会用单引号括起来。如果没有在构造的字符串上使用 eval,有没有办法解决这个问题?
答案1
引用时不会发生大括号扩展。您还应该将参数存储在数组而不是变量中(如果可能)。
我认为以下内容应该适合您:
excludes=( $(--exclude={foo,bar,baz}) )
rsync "${excludes[@]}"
答案2
从 bash 调试器中,...任何包含 =、{ 或 } 的字符串在展开时都将用单引号括起来。
如果您指的是xtrace
输出 ( set -x
),它确实喜欢在包含特殊字符时用单引号显示参数。输出的格式可用作 shell 的输入。
但这并不意味着引号是字符串的一部分。
比较:
$ echo abc def\ ghi
+ echo abc 'def ghi'
abc def ghi
$ echo abc \'def\ ghi\'
+ echo abc ''\''def ghi'\'''
abc 'def ghi'
尽管据我所知,它并不费心引用包含等号的字符串。