Bash não analisa expansões de variáveis aninhadas. Você pode fazer o que quiser com eval
: construa o fragmento de shell ${!apple_@}
e use-o em um comando executado com eval
.
prefix=apple_
eval 'vars=(${!'"$prefix"'@})'
Certifique-se de que prefix
contenha apenas caracteres identificadores válidos, caso contrário, o snippet pode resultar em qualquer coisa.
eval
é normalmente necessário para trabalhar com variáveis cujo nome é calculado dinamicamente, mas neste caso específico há uma maneira completamente diferente de fazer a mesma coisa: use o sistema de conclusão. O sistema de conclusão do Bash funciona até mesmo de um script. O compgen
incorporado lista uma conclusão por linha, o que é ambíguo quando as conclusões podem conter novas linhas, mas esse não é o caso aqui - elas nem contêm caracteres curinga, portanto, a saída pode ser dividida com uma expansão simples sem aspas. Isso não produzirá nada com segurança se o prefixo contiver caracteres que não são válidos em identificadores.
vars=($(compgen -v "$prefix"))