Во-первых, вам не нужно использовать $(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
).