Подтвердить что ты не робот

Как изменить значения элементов массива bash без цикла

array=(a b c d)

Я хотел бы добавить символ перед каждым элементом массива, чтобы иметь этот

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

Простым способом сделать это является цикл элементов массива и изменение значений один за другим

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

Но я хотел бы знать, есть ли способ сделать то же самое, не зацикливая на массиве, поскольку я должен выполнять одну и ту же инструкцию для всех элементов.

Спасибо заранее.

4b9b3361

Ответ 1

Использовать расширение параметра:

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

Из документации:

${параметр/шаблон/строка}

Замена шаблонов. Шаблон расширяется, чтобы создать шаблон так же, как в pathname               расширение. Параметр расширен и наибольшее совпадение шаблона с его значением               заменен на строку. Если шаблон начинается с /, все совпадения шаблона заменяются на               строка. Обычно заменяется только первое совпадение. Если шаблон начинается С#, он должен               совпадение в начале расширенного значения параметра. Если шаблон начинается с%, это               должен совпадать в конце расширенного значения параметра. Если строка равна null, совпадения               шаблон удаляется, и шаблон/следующий шаблон может быть опущен. Если параметр равен @или *,               операция замещения применяется в каждом позиционном параметре по очереди, а расширение - это результирующий список. Если параметр является переменной массива, подстроенной с помощью @или *,               операция замены применяется к каждому члену массива поочередно, а расширение               результирующий список.

Ответ 2

Таким образом, также соблюдайте пробелы в значениях массива:

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

Обратите внимание: это будет FAIL, если массив пуст, и вы установили ранее

set -u

Я не знаю, как устранить эту проблему, используя короткий код...