除了编写循环之外,有没有办法重复最后一个命令 N 次。
例如,我可以使用双声 (!!) 重复最后一个命令一次,但如何重复 30 次呢?
答案1
使用zsh
, 和 ,前提是最后一个命令行只有一个命令或管道或 and-or 列表(例如echo x
, echo x | tr x y
, ,甚至像or /循环echo x && echo y
这样的复合命令,但不是):{ x; y; }
for
while
echo x; echo y
repeat 30 !!
要重复上一个命令行(即使它包含多个命令),请使用:
repeat 30 do !!; done
或者:
repeat 30 {!!}
仅对于bash
简单命令(在上面的示例中,仅是情况echo x
),您可以定义一个辅助函数,例如:
repeat() {
local n="$1"
shift
while ((n-- > 0)); do
"$@"
done
}
(并repeat 30 !!
像上面一样使用)。副作用是,因为代码将在函数中运行,所以它会看到不同的"$@"
,"$#"
并且类似的事情typeset
会以不同的方式工作,因此您不能执行以下操作:
eval 'echo "$1"'
repeat 30 !!
另一种模拟的方法zsh
是repeat 30 {!!}
声明一个别名,例如:
alias repeat='for i in $(seq'
(假设未修改$IFS
)
然后使用:
repeat 30); { !!; }
答案2
我能想出的最短的是:
date # or whatever command
for i in {1..30}; do !!; done
答案3
一种方法是使用行编辑器插入!!;
30 次。
readline
就像模式中的(bash
的行编辑器)一样vi
:
!!; Escdd30p
等效模式emacs
确实适用于zsh
行编辑器,但显然不适用于bash
s readline
。但是,您可以使用readline
kbd 宏来代替,它显然可以重复:
将 kbd 宏定义为!!;
:
Ctrl+X(!!; Ctrl+X)
您可以稍后调用 30 次,如下所示:
Alt+3Alt+0Ctrl+Xe
答案4
该seq
命令是标准 *nix 的一部分,因此不依赖于您的 shell。使用它和 shell 的循环结构,您可以执行以下操作:
for i in $(seq 30); do !!; done
或者
for i in `seq 30`; do !!; done