当使用 POSIX shell 时,如下
touch {quick,man,strong}ly
扩展为
touch quickly manly strongly
quickly
、manly
和strongly
文件,但是否可以动态创建扩展?例如,下面说明了我想做的事情,但由于扩展顺序而不起作用:
TEST=quick,man,strong #possibly output from a program
echo {$TEST}ly
有什么办法可以实现吗?如果需要,我不介意限制自己使用 Bash。我也想避免循环。扩展应该作为任意程序的完整参数给出(即程序不能为每个文件调用一次,它只能为所有文件调用一次)。我知道 xargs
,但我希望这一切都可以通过 shell 以某种方式完成。
最佳答案
...使用eval
有很多错误。您所要求的只有通过 eval
才能实现,但是您可能想要 的东西很容易实现,而无需求助于 bash bug-central。
使用数组!每当您需要将多个 项目保存在一个 数据类型中时,您就需要(或者,应该 使用)一个数组。
TEST=(quick man strong)
touch "${TEST[@]/%/ly}"
这正是您想要的,没有引入和隐藏在此处其他建议中的数千个错误和安全问题。
它的工作方式是:
"${foo[@]}"
:通过扩展其每个元素来扩展名为foo
的数组,正确引用。不要忘记引号!${foo/a/b}
:这是一种参数扩展,用于替换foo
扩展中的第一个a
通过b
。在这种类型的扩展中,您可以使用%
来表示扩展值的结尾,有点像正则表达式中的$
。- 将所有这些放在一起,“${foo[@]/%/ly}”将扩展
foo
的每个元素,将其作为单独的参数正确引用,并将每个元素的末尾替换为ly
。
关于bash - shell 中棘手的大括号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846730/