扩展包含等号和花括号的变量

扩展包含等号和花括号的变量

我正在编写一个使用 rsync 并根据某些设置排除文件的脚本。我最终得到一个格式为 的排除标志--exclude={foo, bar, baz}

然而,在尝试在命令中扩展它时rsync,我注意到该标志被转义了。从bash调试器中,我可以看到我的rsync $excludescomes命令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'

尽管据我所知,它并不费心引用包含等号的字符串。

相关内容