Bueno ... ¿elegante ?, sí (solo una muestra rápida):
eval echo $(printf "%s" '{{a..z},{A..Z},{0..9}}'{,,} )
Esta expresión completa probablemente bloqueará su computadora:
eval echo $(printf "%s" '{{a..z},{A..Z},{0..9}}'{,,,,} )
Una opción sin bloqueo es usar varios bucles:
nl=$'\n'; tab=$'\t'
n=${1:-3}
eval set -- "$2"
eval "varnames=($(echo {a..z}))"
for i in "${varnames[@]:0:$n}"; do
header+='for '"$i"' do '
middle+='$'"$i"
traile+="done; "
done
loop="${header}${nl} printf %s \"$middle\";${nl}$traile"
#echo "$loop"
eval "$loop"
Llámalo como:
./script 3 '{a..z} {A..Z} {0..9}'
Donde el primer argumento es el número de caracteres y el segundo es la lista (separada por espacios) de los caracteres utilizados.
Eso generará una variable ( loop) con el script que se ejecutará y la última evaluación ejecutará ese script. Por ejemplo para:
$ ./script 5 '{a..z} {A..Z} {0..9}'
El valor de loopserá:
for a do for b do for c do for d do for e do
echo "$a$b$c$d$e";
done; done; done; done; done;