在 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
//es
akanga
(这是默认行为):
$ 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 复制的)。
请注意,zsh
andfish
扩展的工作方式类似于大括号扩展。在 中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