是否有标准的UNIX工具可重复执行多次命令?


13

这可能很简单,但是有没有一种简单的方法可以在控制台中一次编写命令,并让其执行n时间(n在运行时指定在哪里)?像这样:

repeat 100 echo hello

是否存在这样的命令(假定为典型的Linux安装)?

还是我会写一些bash循环?

Answers:


23

是的,这是可能的。Bash具有非常广泛的脚本语言。在这种情况下:

for i in {1..100}; do echo 'hello'; done

更多循环示例:http : //www.cyberciti.biz/faq/bash-for-loop/
完整的bash参考:http : //www.gnu.org/software/bash/manual/bashref.html


命令失败时会发生什么?
马扎

您的错误处理将其捕获,并找出要怎么做。
Xyon

我尝试过for i in {1..100}; do python3 foo.py ; done,实际上是要获取执行时间(以了解执行速度如何)time for i in {1..100}; do python3 foo.py ; done,然后CTRL-C将无法停止循环
极性

3

还是我会写一些bash循环?

是的,您会这样:

for(( i = 0; i < 100; i++ )); do echo "hello"; done

或更短:

for((i=100;i--;)); do echo "hello"; done

然后将这些内容放入函数中,瞧,您有以下命令:repeat(){for_stuff_here; 做“ $ @”;}
akira 2010年

3

除了更多内置方法之外,您还可以使用生成数字序列的外部实用程序。

# gnu coreutils provides seq
for i in $(seq 1 100) ; do printf "hello\n" ; done

# freebsd (and probably other bsd) provides jot
for i in $(jot - 1 100) ; do printf "hello\n" ; done

3

for循环语法很愚蠢。这更短:

seq 10|xargs -I INDEX echo "print this 10 times"

2

我没有找到执行此工作的“标准” Linux工具,但通常会在安装过程中保留我的点文件(.bashrc,.vimrc等),因此如果您从以下位置看,则以下内容非常“标准”:在新安装中保存点文件的观点:

在.bashrc或.bash_aliases的末尾,输入以下定义:

repeat() {
  n=$1    #gets the number of times the succeeding command needs to be executed
  shift   #now $@ has the command that needs to be executed
  while [ $(( n -= 1 )) -ge 0 ]    #loop n times;
  do
    "$@"    #execute the command; you can also add error handling here or parallelize the commands
  done
}

保存文件,然后在现有的Shell中重新打开Shell或执行source /path/to/.bashrcsource /path/to/.bash_aliases选择您要修改的。

而已!您应该可以通过以下方式使用它:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

等等


很好 最好将“ local”放在n = $ 1前面,以避免污染全局变量名称空间
Don Hatch 2014年

0

当前,没有其他答案使用标准Unix工具,这正是标题问题所要求的。

它们都使用非标准命令(seqjot)或shell扩展(C风格的for循环或大括号扩展),即它们都无法遵循POSIX标准。

这是一种可移植的方法,可以与任何POSIX兼容的外壳和操作系统一起使用:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.