将bash数组扩展为花括号语法

时间:2014-12-07 18:46:02

标签: bash

采用bash数组变量的好方法是什么:

lst=(a b c)

并将其转换为大括号语法,以便它给出一个等同于:

的语句
$ echo foo{a,b,c}
fooa foob fooc

?当然,我希望用lst的扩展替换花括号。在我的具体情况下,使用for循环是不可能的(或者说非常难看)。

我到目前为止最接近的是:

$ lst=(a b c); echo foo${lst[@]}
fooa b c

2 个答案:

答案 0 :(得分:8)

回想一下,如果ary是一个数组,则${ary[@]/#/foo}的扩展是ary的扩展,每个字段都附加foo。同样,${ary[@]/%/foo}会将foo附加到每个字段。看:

$ lst=( a b c )
$ echo "${lst[@]/#/foo}"
fooa foob fooc
$ echo "${lst[@]/%/foo}"
afoo bfoo cfoo

您不需要evalprintf

像这样,你可以安全地构建数组:

$ lst=( a 'field with space' b )
$ foolst=( "${lst[@]/#/foo}" )
$ declare -p foolst
declare -a foolst='([0]="fooa" [1]="foofield with space" [2]="foob")'

答案 1 :(得分:1)

一个简单的解决方案是使用printf

$ lst=( one 'two space' t33 )

$ printf '<%s> ' "${lst[@]}"; echo
<fooone> <footwo space> <foot33>