Баш за цикл с неизвестным массивом
Мне нужно выполнить цикл for для элементов в массиве edg_cdi, но я знаю, что это тот массив только потому, что мой входной параметр выбран ='cdi'. Если он был выбран ='cdt' (или многие другие), выбранный массив будет другим.
chosen='cdi'
edg_cdi=('40' '46' '37' '43')
edg_cdt=('69' '24' '177' '25')
string='edg_'
wholename=$string$chosen
for i in "${ WHAT_TO_WRITE_HERE [@]}"
do
echo $i
done
Желаемый результат - четыре эха:
40
46
37
43
2 ответа
Решение
Вы можете использовать переменную косвенность с правильным массивом (в отличие от ответа @user1330614, который подделывает массив с простой переменной). Хитрость в том, что вы должны включить элемент массива (или [@]
для всех элементов) в переменной, через которую вы косвенно обращаетесь. Как это:
edg_cdi=('40' '46' '37' '43')
wholename="edg_cdi" # Same value original code generates
wholearray="${wholename}[@]" # This includes the array name AND "[@]"
for i in "${!wholearray}"; do
#...etc
Например, чтобы получить n-й элемент массива, вы можете использовать что-то вроде:
n=3 # The element number we want
wholename_n="${wholename}[n]" # Note that n does not have a $; it won't be resolved until use
dosomethingwith "${!wholename_n}" # this resolves n and gets the 3rd element
n=2
dosomethingwith "${!wholename_n}" # this re-resolves n and gets the 2nd element
Ваш код должен выглядеть так
chosen='cdi'
edg_cdi="40 46 37 43"
edg_cdt="69 24 177 25"
string='edg_'
wholename=$string$chosen
for i in ${!wholename}
do
echo $i
done
Как объяснено здесь