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

array=(a b c d)

我想在数组的每个元素之前添加一个字符,以使它具有

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

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

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

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

提前致谢。

saloua asked 2020-08-01T15:23:18Z
2个解决方案
65 votes

使用参数扩展:

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

从文档中:

$ {parameter / pattern / string}

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

choroba answered 2020-08-01T15:23:48Z
5 votes

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

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

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

set -u

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

socketpair answered 2020-08-01T15:24:18Z
translate from https://stackoverflow.com:/questions/12744031/how-to-change-values-of-bash-array-elements-without-loop