Bash: объявлять массив динамически на основе другого массива, сохраняя при этом структуру элемента
У меня есть скрипт, который можно запустить с разными "вкусами". Логика для каждого варианта почти идентична (за исключением значений переменных, которые он использует). Поэтому я решил объявить все переменные для каждого аромата, используя шаблон пространства имен (т.е. <flavorID>_<variable>
). Я пытаюсь объявить универсальную переменную во время выполнения на основе аромата, используемого для запуска скрипта. Другими словами, я хочу объявить переменную <variable>
и сделать его равным <flavorID>_<variable>
в зависимости от flavorID
из аргумента CL. Смотрите сценарий ниже для уточнения.
PS Я понимаю, что перебираю только одну переменную, но в моем реальном примере есть несколько массивов, которые мне нужно объявить.
stack-example.sh:
#!/bin/bash
FLAVOR_OPT=${1} #This gets set via command line option
if ! [[ "$FLAVOR_OPT" =~ (A|B|C) ]]; then
echo "Usage: $0 { A | B | C }"
exit 1
fi
## Flavor A Variables ##
FLAVOR_A_NAME="Vanilla"
FLAVOR_A_COLOR="White"
FLAVOR_A_LOCATIONS=(
"Baskin-Robbins"
"Cold Stone"
"Dairy Queen"
)
## Flavor B Variables ##
FLAVOR_B_NAME="Chocolate"
FLAVOR_B_COLOR="Brown"
FLAVOR_B_LOCATIONS=(
"Cold Stone"
"Yogurtland"
"Yogurt Heaven"
"Yogurt Mill"
)
## Flavor C Variables ##
FLAVOR_C_NAME="Strawberry"
FLAVOR_C_COLOR="Red"
FLAVOR_C_LOCATIONS=(
"Baskin-Robbins"
"Dairy Queen"
"Yogurtland"
"Yogurt Mill"
)
for var in "NAME" "COLOR"; do
flavor_var=FLAVOR\_$FLAVOR_OPT\_$var
declare ${var}="${!flavor_var}"
done
############## This is where I am getting stuck ##############
##############################################################
for var in "LOCATIONS"; do
flavor_var=FLAVOR\_$FLAVOR_OPT\_$var[*]
tmp=("${!flavor_var}")
declare ${var}="${tmp[@]}"
done
echo "NAME = $NAME"
echo "COLOR = $COLOR"
echo "LOCATIONS (count) = $LOCATIONS (count = ${#LOCATIONS[@]})"
Пример вывода с использованием сценария выше:
[sbadra@stack ~]$ ./stack-example.sh A
NAME = Vanilla
COLOR = White
LOCATIONS (count) = Baskin-Robbins Cold Stone Dairy Queen (count = 1)
[sbadra@stack ~]$ ./stack-example.sh B
NAME = Chocolate
COLOR = Brown
LOCATIONS (count) = Baskin-Robbins Dairy Queen Yogurtland Yogurt Mill (count = 1)
[sbadra@stack ~]$ ./stack-example.sh C
NAME = Strawberry
COLOR = Red
LOCATIONS (count) = (count = 1)
[sbadra@rtev22-ansible-dev ~]$