Bash

如何添加和附加到數組的每個成員?

  • February 26, 2018

我有一個數組:

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>

引用自:https://unix.stackexchange.com/questions/205170