bash - shell 中棘手的大括号扩展

标签 bash shell brace-expansion

当使用 POSIX shell 时,如下

touch {quick,man,strong}ly

扩展为

touch quickly manly strongly

quicklymanlystrongly 文件,但是否可以动态创建扩展?例如,下面说明了我想做的事情,但由于扩展顺序而不起作用:

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/

相关文章:

bash - 无法在我的 Node.js 应用程序中读取我的环境变量

linux - Shell 脚本 - 从用户输入 4 行

bash - 在 bash 大括号扩展中更改分隔符/delim

bash - echo 以特殊字符为元素的组合

bash - 替换多个文件中的多个字符串

linux - 找到所有扩展名为 .sh .cpp .c 的文件并将它们复制到我桌面的一个目录中,如果有同名文件,重命名它

bash - bash 中确定变量 $p 是否为目录的条件测试是什么?

linux - 如何在 Linux 命令中两次引用上一条命令的输出?

vb.net - 如何与流程输出交互?

linux - 了解 bash 大括号扩展