Primeiro, você não precisa usar $(echo $FRUITS)
na instrução for
. Usando apenas $FRUITS
é suficiente. Então você pode acabar com uma das linhas dentro do loop, usando eval
.
O eval
diz ao bash para fazer uma segunda avaliação da seguinte declaração (ou seja, mais uma do que a avaliação normal). O \$
sobrevive à primeira avaliação como $
e a próxima avaliação trata esse $
como o início de um nome de variável, que é resolvido como "Amarelo", etc.
Desta forma, você não precisa ter uma etapa separada, que faça uma sequência provisória (que é o que acredito ser a intenção principal da sua pergunta).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Para um método alternativo, como mencionado por Patrick em um comentário (acima), você pode usar uma matriz associativa , na qual o índice de um elemento não precisa seja um inteiro. Você pode usar uma string, como o nome de um tipo de fruta. Aqui está um exemplo, usando o array associativo do 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