Você precisa de eval:
for ((i=0; i < $1; ++i)); do
echo "iterator=$i";
# for debugging
echo eval "$3"
eval "$3"
done
É claro que você deve prestar atenção à citação correta na string de comando. Seu exemplo ls *$(($2 + $i ))*.gnu | wc -l
é perigoso nesse sentido porque as referências de variáveis são resolvidas em ""
, ou seja, antes de o script ser executado. Você precisa de aspas simples:
doNtimes.sh 10 0 'ls *$(($2 + $i ))*.gnu | wc -l'