Bash
如何添加和附加到數組的每個成員?
我有一個數組:
CATEGORIES=(one two three four)
我可以使用參數擴展添加到每個數組成員:
echo ${CATEGORIES[@]/#/foo }
我可以以相同的方式附加到每個數組成員:
echo ${CATEGORIES[@]/%/ bar}
我怎樣才能做到這兩點?這些都不起作用:
echo ${CATEGORIES[@]/(.*)/foo \1 bar} echo ${CATEGORIES[@]/(.*)/foo $1 bar} echo ${CATEGORIES[@]/(.*)/foo ${BASH_REMATCH[1]} bar}
根據您的最終目標,您可以使用
printf
:$ a=(1 2 3) $ printf "foo %s bar\n" "${a[@]}" foo 1 bar foo 2 bar foo 3 bar
printf
重複使用格式字元串,直到所有參數都用完,因此它提供了一種將某些格式應用於一組字元串的簡單方法。
作為記錄,
zsh
有一個${^array}
運算符可以在數組元素上打開類似大括號的擴展。所以:$ a=(one two three) $ b=('foo '${^a}' bar') $ printf '<%s>\n' $b <foo one bar> <foo two bar> <foo three bar>
搜尋和替換也適用於
zsh
.$ printf '<%s>\n' ${a//(#m)*/foo $MATCH bar} <foo one bar> <foo two bar> <foo three bar>
以及
printf -v
在數組上:$ b=(); printf -v b 'foo %s bar' "$a[@]" $ printf '<%s>\n' $b <foo one bar> <foo two bar> <foo three bar>
如果寫成,你
echo ${CATEGORIES[@]/(.*)/foo \1 bar}
會工作:ksh93
$ printf '<%s>\n' "${CATEGORIES[@]/@(.*)/foo \1 bar}" <foo one bar> <foo two bar> <foo three bar>