Оболочка: Как добавить префикс при циклическом просмотре массива?

#arrays #bash #shell

#массивы #bash #оболочка

Вопрос:

Я пытаюсь выполнить цикл по массиву и добавить префикс к каждому значению в массиве. Упрощенная версия кода:

 #!/bin/sh
databases=( db1 db2 db3 )
for i in live_${databases[@]} stage_${databases[@]}
do
    ....
done
  

Однако он добавляет префикс только к первому значению в массиве — значения, которые он перебирает, являются:

 live_db1 db2 db3 stage_db1 db2 db3
  

Есть мысли? Спасибо.

Комментарии:

1. ( «добавить» для префикса; «добавить» имело бы смысл для суффикса 😉 )

Ответ №1:

 databases=( db1 db2 db3 )
for i in ${databases[@]/#/live_} ${databases[@]/#/stage_}
do
    ....
done
  

Ответ №2:

Попробуйте что-то вроде этого:

 #!/bin/sh
databases="db1 db2 db3"
for i in $databases
do
    x="live_$i"
    y="stage_$i"
    echo "$x $y"
done
  

Комментарии:

1. Я бы предпочел, чтобы префикс добавлялся в for строке. Причина в том, что у меня также есть 3-й массив для перебора, который не принимает префикс. ( for i in $core live_$dbs stage_$dbs ). Хотя спасибо — возможно, строки были бы лучшей альтернативой массивам.

2. Что ж, я смог найти решение. Я добавил отдельный цикл for через $databases, добавляющийся live_$i stage_$i к $ core, а затем изменил основной цикл for, чтобы он проходил только через $ core. Спасибо за помощь.

Ответ №3:

 for i in $( for d in ${databases[@]}; do echo "live_$d stage_$d"; done )
do
    ....
done
  

Ответ №4:

Просто добавляю к ответу Джона Кугельмана. Подробности можно найти в:

справочная страница bash -> Расширение параметров -> Замена шаблона

… Если шаблон начинается с #, он должен совпадать с началом расширенного значения параметра. …