【发布时间】:2012-09-26 11:29:26
【问题描述】:
array=(a b c d)
我想在数组的每个元素之前添加一个字符以便拥有这个
array=(^a ^b ^c ^d)
一种简单的方法是循环数组元素并逐个更改值
for i in "${#array[@]}"
do
array[i]="^"array[i]
done
但我想知道是否有任何方法可以在不循环数组的情况下做同样的事情,因为我必须对所有元素执行相同的指令。
提前致谢。
【问题讨论】:
array=(a b c d)
我想在数组的每个元素之前添加一个字符以便拥有这个
array=(^a ^b ^c ^d)
一种简单的方法是循环数组元素并逐个更改值
for i in "${#array[@]}"
do
array[i]="^"array[i]
done
但我想知道是否有任何方法可以在不循环数组的情况下做同样的事情,因为我必须对所有元素执行相同的指令。
提前致谢。
【问题讨论】:
使用参数扩展:
array=("${array[@]/#/^}")
来自文档:
${参数/模式/字符串}
模式替换。该模式被扩展以产生一个模式,就像在路径名中一样 扩张。参数被扩展并且模式与其值的最长匹配是 替换为字符串。如果 pattern 以 / 开头,则所有匹配的 pattern 都替换为 细绳。通常只替换第一场比赛。如果模式以 # 开头,则必须 匹配参数扩展值的开头。如果模式以 % 开头,它 必须在参数扩展值的末尾匹配。如果字符串为空,则匹配 模式被删除, / 后面的模式可以省略。如果参数是@或*, 替换操作依次应用于每个位置参数,扩展是结果列表。如果 parameter 是以 @ 或 * 为下标的数组变量,则 对数组的每个成员依次进行替换操作,展开为 结果列表。
【讨论】:
declare -p array。
这种方式也尊重数组值中的空格:
array=( "${array[@]/#/^}" )
注意,如果数组为空并且您之前设置过,这将失败
set -u
我不知道如何使用短代码来消除这个问题...
【讨论】:
array=("${array[@]:+${array[@]/#/^}}"),但我无法通过 bash-4.4.0 和 bash-4.1.5 重现它(空数组 + set -u)。不过,在后者中,您需要此构造来迭代带有 for 的数组。
declare -a arr=(12 123); echo "${arr[@]/12/00}"我想要00 123,但我得到00 003。