我想比较两个名称相似的文件,所以我想要一个扩展为
foo-averylongstring-bar baz-averylongstring-quux
的 Bash 表达式。
不幸的是,像 {foo,baz}-averylongstring-{bar,quux}
这样的大括号表达式也会创建两个无效的组合,例如
baz-averylongstring-bar
。 Bash 文档中有一些关于美元符号阻止扩展的内容,但据我了解,
${...}
是变量扩展而不是大括号扩展。
我认为最简单的解决方案是将长的公共字符串放入短变量中:
x='averylong...string'
diff foo-$x-baz bar-$x-quux
如果我们在一种语言中有某种并行迭代,我们可以做如下事情:
1> `diff @(mapcar (ret `@1-longstring-@2`) '#"foo baz" '#"bar quux")`
"diff foo-longstring-bar baz-longstring-quux"
如果能在大括号扩展中内置一个简洁的符号,那就太好了。唯一的问题是,我们尝试的任何方式都会破坏向后兼容性。想象一下,方括号尚未用于字符类通配符。我们可以让方括号中的所有项目都属于并行扩展:
[foo,baz]-longstring-[bar,quux]
由于我们没有方括号,我们可以用大括号玩一些游戏,比如使用 |
来指示要并行的表达式:
{|foo,baz}-longstring-{|bar,quux}
我已经编写了大括号扩展的实现,因此对我来说,这是扩展它的一个有趣的可能性。因为它是一个库函数,所以我可以使用标志来启用或禁用 |
字符的识别。Bash 也可以做同样的事情;有一些
shopt
来实现这样的事情。