如何在没有循环的情况下更改bash数组元素的值

时间:2012-10-05 10:10:44

标签: arrays bash

array=(a b c d)

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

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

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:61)

使用参数扩展:

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

来自文档:

  

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

     

模式替换。扩展模式以生成与路径名一样的模式                 扩张。参数被扩展,模式与其值的最长匹配是                 用字符串替换。如果模式以/开头,则模式的所有匹配都将替换为                 串。通常只替换第一场比赛。如果模式以#开头,则必须                 匹配参数的扩展值的开头。如果模式以%开头,那么                 必须在参数的扩展值的末尾匹配。如果string为null,则匹配                 删除模式,可以省略/以下模式。如果参数是@或*,                 替换操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是使用@或*下标的数组变量,则                 替换操作依次应用于数组的每个成员,并且扩展为                 结果清单。

答案 1 :(得分:5)

这种方式也支持数组值中的空格:

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

注意,如果数组为空并且之前设置了

,这将失败
set -u

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