#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 -> Расширение параметров -> Замена шаблона
… Если шаблон начинается с #, он должен совпадать с началом расширенного значения параметра. …