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

sal*_*oua 44 arrays bash

array=(a b c d)
Run Code Online (Sandbox Code Playgroud)

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

array=(^a ^b ^c ^d)
Run Code Online (Sandbox Code Playgroud)

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

for i in "${#array[@]}"
do
    array[i]="^"array[i]
done
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

cho*_*oba 66

使用参数扩展:

array=("${array[@]/#/^}")
Run Code Online (Sandbox Code Playgroud)

从文档:

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

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


soc*_*air 5

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

array=( "${array[@]/#/^}" )
Run Code Online (Sandbox Code Playgroud)

注意,如果数组为空并且您先前已设置,则这将失败

set -u
Run Code Online (Sandbox Code Playgroud)

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