def do_loop(self, params):
        """
\x1b[1mNAME\x1b[0m
        loop - Runs commands in a loop

\x1b[1mSYNOPSIS\x1b[0m
        loop <repeat> <pause> <cmd1> <cmd2> ... <cmdN>

\x1b[1mDESCRIPTION\x1b[0m
        Runs <cmds> <repeat> times (0 means forever), with a pause of <pause> secs inbetween
        each <cmd> (0 means no pause).

\x1b[1mEXAMPLES\x1b[0m
        > loop 3 0 "get /foo"
        ...

        > loop 3 0 "get /foo" "get /bar"
        ...

        """
        repeat = params.repeat
        if repeat < 0:
            self.show_output("<repeat> must be >= 0.")
            return

        pause = params.pause
        if pause < 0:
            self.show_output("<pause> must be >= 0.")
            return

        cmds = params.cmds
        i = 0
        with self.transitions_disabled():
            while True:
                for cmd in cmds:
                    try:
                        self.onecmd(cmd)
                    except Exception as ex:
                        self.show_output("Command failed: %s.", ex)
                if pause > 0.0:
                    time.sleep(pause)
                i += 1
                if repeat > 0 and i >= repeat:
                    break
\x1b[1mNAME\x1b[0m
        loop - Runs commands in a loop

\x1b[1mSYNOPSIS\x1b[0m
        loop <repeat> <pause> <cmd1> <cmd2> ... <cmdN>

\x1b[1mDESCRIPTION\x1b[0m
        Runs <cmds> <repeat> times (0 means forever), with a pause of <pause> secs inbetween
        each <cmd> (0 means no pause).

\x1b[1mEXAMPLES\x1b[0m
        > loop 3 0 "get /foo"
        ...

        > loop 3 0 "get /foo" "get /bar"
        ...