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"))