如何使用bash shell多次运行命令?

有没有办法运行一个命令(例如ps aux|grep someprocessn次?

就像是:

 run -n 10 'ps aux|grep someprocess' 

我想交互使用它,请不要发布脚本。

更新:我问这个问题的原因是,我在很多机器上工作,而且我不想将所有的脚本等导入到每个机器中,以便在每台机器上获得相同的function。

我不认为这个命令或shell内置的存在,因为它是Bourne shell for循环所devise的一个简单的子集,因此你自己实现一个这样的命令是非常简单的。

对于初学者,你可以使用一个虚拟for循环:

 for i in `seq 10`; do command; done 

或者等同于JimB的build议,使用Bash内build生成序列:

 for i in {1..10}; do command; done 

每次执行十次执行command – 它可以是一个pipe道或一系列由之隔开的命令;&& 。 你可以使用$ivariables来知道你在哪个迭代中。

如果你认为这是一个脚本,所以对于一些不确定的(但也许是有效的)理由是不可取的,你可以把它作为一个命令来实现,也许在你的.bashrc(未经testing)中这样做:

 #function run run() { number=$1 shift for i in `seq $number`; do $@ done } 

用法:

 run 10 command 

例:

 run 5 echo 'Hello World!' 

ps aux | grep someprocess ps aux | grep someprocess看起来像你想观看一个固定的时间程序的变化。 爱德华多给出了一个答案,完全回答你的问题,但有一个select: watch

 watch 'ps aux | grep someprocess' 

请注意,我已经把这个命令放在避免shell将命令解释为“运行监视ps aux and pipe the result through grep someprocess来pipe理and pipe the result through地方。另一种执行前面命令的方法是:

 watch ps aux \| grep someprocess 

默认情况下,每两秒钟刷新一次,可以使用-n选项进行更改。 比如,如果要间隔1秒:

 watch -n 1 'ps aux | grep someprocess' 

只是为了好玩

 pgrep ssh ;!!;!!;!!;!!;!!;!! 

尝试这个:

 yes ls | head -n5 | bash 

这要求命令在一个子shell中执行,性能会受到一点损失。 因人而异。 基本上,你得到“是”命令重复string“ls”N次; 而“head -n5”以5次重复结束循环。 最后一个pipe道将命令发送到您select的shell。

顺便说一下,类似csh的shell有一个内置的repeat命令。 你可以用它在bash子shell中执行你的命令!

类似于以前的回复,但不需要for循环:

 seq 10 | xargs -I -- echo "hello" 

pipe道输出seq到没有参数或选项的xargs

POSIX的方式

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01

 x=10 while [ $x -gt 0 ]; do command x=$(($x-1)) done 

这当然可以做成一个class轮:

 x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done 

似乎是最便携的方式,因此不太可能让你安装程序。

以下便携性较差:

  • 括号扩展{1..10} :bash特定的,如果参数很大,会产生一个巨大的行
  • seq :GNU
  • yes :GNU

如果您厌倦了可移植性,请考虑GNU parallel

 sudo apt-get install parallel seq 100 | parallel echo {} 

它并行运行命令,并有许多很酷的选项。

另见: https : //stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash

上面的@ eduardo-ivanec的run函数的鱼壳实现

 function run set number $argv[1] for i in (seq $number) eval $argv[2..-1] end end