Repeat last command N times

With zsh, and provided the last command line was only one command or pipeline or and-or list (that is for instance echo x, echo x | tr x y, echo x && echo y, even compound commands like { x; y; } or for/while loops but not echo x; echo y):

repeat 30 !!

To repeat the previous command line even if it contained several commands, use:

repeat 30 do !!; done

Or:

repeat 30 {!!}

With bash and for simple-commands only (among the examples above, only the echo x case), you could define a helper function like:

repeat() {
  local n="$1"
  shift
  while ((n-- > 0)); do
    "$@"
  done
}

(and use repeat 30 !! like above). A side effect is that because the code will be running in a function, it will see different "$@", "$#" and things like typeset will work differently, so you can't do things like:

eval 'echo "$1"'
repeat 30 !!

Another approach to emulate zsh's repeat 30 {!!} would be to declare an alias like:

alias repeat='for i in $(seq'

(assuming an unmodified $IFS)

And then use:

repeat 30); { !!; }

The shortest I can come up with is:

date # or whatever command
for i in {1..30}; do !!; done

One approach could be to use the line editor to insert !!; 30 times.

Like with readline (bash's line editor) in vi mode:

!!;Escdd30p

The emacs mode equivalent does work with the zsh line editor but apparently not with bash's readline. However you could use readline kbd macros instead which apparently can be repeated:

Define the kbd macro as !!;:

Ctrl+X(!!;Ctrl+X)

Which you can later invoke 30 times as:

Alt+3Alt+0Ctrl+Xe