58
array=(a b c d)

我想在数组的每个元素之前添加一个字符以便拥有这个

array=(^a ^b ^c ^d)

一种简单的方法是循环数组元素并逐个更改值

for i in "${#array[@]}"
do
    array[i]="^"array[i]
done

但是我想知道是否有任何方法可以在不循环数组的情况下做同样的事情,因为我必须对所有元素执行相同的指令。

提前致谢。

4

2 回答 2

91

使用参数扩展:

array=("${array[@]/#/^}")

从文档中:

${参数/模式/字符串}

模式替换。该模式被扩展以产生一个模式,就像在路径名扩展中一样。参数被扩展,模式与其值的最长匹配被替换为字符串。如果pattern 以/ 开头,则pattern 的所有匹配都被替换为字符串。通常只替换第一场比赛。如果pattern以#开头,则必须匹配参数扩展值的开头。如果模式以 % 开头,它必须匹配参数扩展值的末尾。如果 string 为 null,则删除 pattern 的匹配项,并且可以省略 / 后面的 pattern。如果参数是@或*,则对每个位置参数依次应用替换操作,扩展是结果列表。如果 parameter 是下标为 @ 或 * 的数组变量,则对数组的每个成员依次进行替换操作,展开是结果列表。

于 2012-10-05T10:19:59.407 回答
8

这种方式也尊重数组值中的空格:

array=( "${array[@]/#/^}" )

请注意,如果数组为空并且您之前设置过,这将失败

set -u

我不知道如何使用短代码消除这个问题......

于 2014-01-06T18:48:30.900 回答