外壳中的棘手支撑扩展

dre*_*lax 8 bash shell brace-expansion

使用POSIX shell时,如下所示

touch {quick,man,strong}ly
Run Code Online (Sandbox Code Playgroud)

扩展到

touch quickly manly strongly
Run Code Online (Sandbox Code Playgroud)

哪个会触及文件quickly,manlystrongly,但是可以动态创建扩展吗?例如,以下说明我想要做什么,但由于扩展顺序不起作用:

TEST=quick,man,strong    #possibly output from a program
echo {$TEST}ly
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?如果需要,我不介意将自己限制在Bash.我也想避免循环.扩展应该作为任意程序的完整参数给出(即,对于每个文件,程序不能被调用一次,对于所有文件只能调用一次).我知道xargs但我希望它能以某种方式从shell中完成.

lhu*_*ath 18

......使用有很多错误eval.你所要求的只是可能的eval,你可能想要的是很容易的,而不必诉诸bash bug-central.

使用数组!每当您需要在一种数据类型中保留多个项目时,您需要(或应该使用)一个数组.

TEST=(quick man strong)
touch "${TEST[@]/%/ly}"
Run Code Online (Sandbox Code Playgroud)

如果没有引入和隐藏在其他建议中的千个错误和安全问题,那就完全符合您的要求.

它的工作方式是:

  • "${foo[@]}":通过展开foo正确引用的每个元素来扩展命名的数组.不要忘记引号!
  • ${foo/a/b}:这是替换第一类型参数膨胀afoo通过的扩张b.在这种类型的扩展中,您可以使用它%来表示扩展值的结束,类似于$正则表达式.
  • 把所有这些放在一起,"$ {foo [@] /%/ ly}"将扩展每个元素foo,正确引用它作为一个单独的参数,并替换每个元素的结尾ly.