По-перше, вам не потрібно використовувати $(echo $FRUITS)
у for
виписці. Використовувати просто $FRUITS
достатньо. Тоді ви можете скористатися однією з ліній всередині циклу, використовуючи eval
.
eval
Просто каже Баш , щоб зробити другу оцінку наступного твердження (тобто більш ніж одна його нормальна оцінка). \$
Виживає першу оцінку , як $
і наступна оцінка потім розглядає це $
як початок імені змінної, яка вирішує «жовтий» і т.д.
Таким чином, вам не потрібно мати окремий крок, який робить проміжний рядок (саме це, на мою думку, було головним завданням вашого питання).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Для альтернативного методу, про який згадував Патрік у коментарі (вище), ви можете замість цього використовувати асоціативний масив , в якому індекс елемента не повинен бути цілим числом. Можна використовувати рядок, наприклад, назву виду фруктів. Ось приклад використання асоціативного масиву bash:
# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"
for fruit in BANANA APPLE "MARTIAN ORANGE" ;do
echo "$fruit" is "${colour[$fruit]}"
done
!
Синтаксис прапор на змінну підстановки, в основному говорить «замінити двічі». Це не змінює вимогу, що те, що знаходиться всередині,${…}
повинно бути ім'ям змінної. Тому ні, ви не можете уникнути використання змінної, яка містить ім'я, якщо ви не використовуєте інший метод (eval
).