用数组元素进行大括号扩展

用数组元素进行大括号扩展

在 Bash 中我们已经可以这样做:

echo foo.{a,b,c}
# == foo.a foo.b foo.c

我们如何大致得到:

arr=(a b c)
echo foo.{${arr[@]}}
# == foo.a foo.b foo.c

答案1

您可以使用参数扩展

$ arr=(a b c)

$ echo "${arr[@]/#/foo.}"
foo.a foo.b foo.c

答案2

如果您不必使用bash

rc//esakanga

(这是默认行为):

$ arr=(a b c)
$ echo foo.$arr
foo.a foo.b foo.c

zsh

$ arr=(a b c)
$ echo foo.$^arr
foo.a foo.b foo.c

或者

$ set -o rcexpandparam
$ arr=(a b c)
$ echo foo.$arr
foo.a foo.b foo.c

^启用rcexpandparam该扩展,例如=启用shwordsplit~ globsubst

(也是默认行为)

$ set arr a b c
$ echo foo.$arr
foo.a foo.b foo.c

所有这些 shell 都有比 bash 更好的数组设计(本身是从 ksh 复制的)。

请注意,zshandfish扩展的工作方式类似于大括号扩展。在 中rc,使用 时有所不同echo $arr.$arr,它给出:

a.a b.b c.c

而在fish/中zsh -o rcexpandparam,它给出的结果与 相同echo {a,b,c}.{a,b,c},即:

a.a a.b a.c b.a b.b b.c c.a c.b c.c

相关内容