2

Мне нужно выполнить цикл 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 ответа2

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
1

Ваш код должен выглядеть так

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

Как объяснено здесь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .