En primer lugar, no necesita usar $(echo $FRUITS)
en la for
declaración. Usar solo $FRUITS
es suficiente. Luego, puede eliminar una de las líneas dentro del bucle utilizando eval
.
El eval
simplemente le dice a bash para realizar una segunda evaluación de la siguiente declaración (es decir, uno más que su evaluación normal). La \$
sobrevive a la primera evaluación, $
y la próxima evaluación a continuación, trata a este $
como el inicio de un nombre de variable, que se resuelve a "Amarillo", etc.
De esta manera, no necesita tener un paso separado que haga una cadena provisional (que es lo que creo que fue la intención principal de su pregunta).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Para un método alternativo, como mencionó Patrick en un comentario (arriba), puede usar una matriz asociativa , en la que el índice de un elemento no necesita ser un número entero. Puede usar una cadena, como el nombre de un tipo de fruta. Aquí hay un ejemplo, usando la matriz asociativa de 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
!
sintaxis es un indicador de sustitución de variables que básicamente dice "sustituir dos veces". No cambia el requisito de que lo que hay dentro${…}
debe ser un nombre de variable. Entonces, no, no puede evitar usar una variable que contenga el nombre, a menos que use un método diferente (eval
).