Acho que talvez você esteja confiando demais nos tipos de array - e variáveis em geral. Se eu entendi o que você está fazendo corretamente, eu suspeito que isso deve fazer o mesmo:
for a in checking google\ wallet savings cash
do a=assets:$a
printf "$a\t%d\n" "$(ledger -f finances balance "$a")"
done
Isso provavelmente poderia ser melhorado de alguma forma, obtendo uma leitura de todos os valores de $a
acima de uma só vez em um fluxo e organizando-o com um editor de script como sed
ou similar. Em geral, uma variável de shell é um lugar muito ruim para manter informações de qualquer valor - ou de qualquer tamanho significativo. Uma variável de shell deve armazenar apenas informações suficientes para tornar a recuperação de informações reais de um arquivo mais gerenciável.
Escrito como uma função de shell, o acima pode parecer com:
assets() if [ "$#" -gt 0 ]
then while [ "$#" -gt 0 ]
do printf "assets:%s\t%d\n" "$1" "$(
ledger -f finances balance "assets:$1")"
shift;done
else assets checking google\ wallet savings cash
fi
... e pode ser chamado assim:
assets
... para sua lista padrão ou como ...
assets cash checking
... para uma lista diferente sem definir um único valor de variável do shell.