Primeiro, você não precisa usar $(echo $FRUITS)
a for
declaração. Usar apenas $FRUITS
é suficiente. Então você pode acabar com uma das linhas dentro do loop, usando eval
.
O eval
simplesmente diz ao bash para fazer uma segunda avaliação da seguinte declaração (ou seja, uma a mais que a sua avaliação normal). Ele \$
sobrevive à primeira avaliação como $
e a próxima avaliação trata isso $
como o início de um nome de variável, que resolve como "Amarelo" etc.
Dessa forma, você não precisa ter uma etapa separada que faça uma sequência intermediária (que é o que acredito ser a principal intenção 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 ser um número inteiro. Você pode usar uma sequência, como o nome de um tipo de fruta. Aqui está um exemplo, usando a matriz associativa 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
!
sintaxe é um sinalizador na substituição de variável que basicamente diz "substituir duas vezes". Não altera o requisito de que o conteúdo esteja dentro do${…}
nome da variável. Portanto, não, você não pode evitar o uso de uma variável que contém o nome, a menos que use um método diferente (eval
).