É um pouco incerto quanto ao que você está tentando fazer (por exemplo, você está tentando processar arquivos no formato 2012.mm.dd ou 2012.mmdd? (Você listou ambos).
Você pode "dividir" uma string no bash usando {$ n: x: y}, onde x é a posição inicial e y é o número de caracteres, então algo como isto [com ajustes para seu caso de uso] deve funcionar :
for n in *.txt
do
echo "Processing $n"
grdtrack $n -G{$n:0:4}{$n:5:4}.grd > {$n}h.txt
done
Isso processará os arquivos txt e analisará um parâmetro -G20121202.grd, redirecionando a saída para um novo arquivo de texto.
Veja aqui para mais informações sobre manipulação de strings no bash.