采用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
答案 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
您不需要eval
或printf
。
像这样,你可以安全地构建数组:
$ 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>