How to change values of bash array elements without loop

ArraysBash

Arrays Problem Overview


array=(a b c d)

I would like to add a character before each element of the array in order to have this

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

An easy way to do that is to loop on array elements and change values one by one

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

But I would like to know if there is any way to do the same thing without looping on the array as I have to do the same instruction on all elements.

Thanks in advance.

Arrays Solutions


Solution 1 - Arrays

Use Parameter Expansion:

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

From the documentation:

> ${parameter/pattern/string} > --- > Pattern substitution. The pattern is expanded to produce a pattern just as in pathname > expansion. Parameter is expanded and the longest match of pattern against its value is > replaced with string. If pattern begins with /, all matches of pattern are replaced with > string. Normally only the first match is replaced. If pattern begins with #, it must > match at the beginning of the expanded value of parameter. If pattern begins with %, it > must match at the end of the expanded value of parameter. If string is null, matches of > pattern are deleted and the / following pattern may be omitted. If parameter is @ or *, > the substitution operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the > substitution operation is applied to each member of the array in turn, and the expansion is > the resultant list.

Solution 2 - Arrays

This way also honor whitespaces in array values:

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

Note, this will FAIL if array was empty and you set previously

set -u

I don't know how to eliminate this issue using short code...

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsalouaView Question on Stackoverflow
Solution 1 - ArrayschorobaView Answer on Stackoverflow
Solution 2 - ArrayssocketpairView Answer on Stackoverflow