Answers:
我认为不存在为此内置的命令或shell,因为它是Bourne shell for
循环所设计的琐碎子集,因此自己实现这样的命令非常简单。
对于初学者,您可以使用虚拟for
循环:
for i in `seq 10`; do command; done
或等效于按照JimB的建议,使用内置的Bash生成序列:
for i in {1..10}; do command; done
command
每次执行都会迭代十次-它可以是管道,也可以是由;
或分隔的一系列命令&&
。您可以使用$i
变量来知道您正在进行的迭代。
如果您将此单行代码视为脚本,并且由于某些未指定(但可能有效)的原因而令人不快,则可以将其作为命令实现,也许在您的.bashrc上这样(未经测试):
#function run
run() {
number=$1
shift
for i in `seq $number`; do
$@
done
}
用法:
run 10 command
例:
run 5 echo 'Hello World!'
for
是用于迭代的内置bash。
seq
: {1..10}
.bashrc
if {1..$number}
交换`seq $number`
。
ps aux | grep someprocess
您似乎想在固定的时间内观看程序的更改。Eduardo给出了一个答案,可以准确回答您的问题,但是有另一种选择watch
::
watch 'ps aux | grep someprocess'
请注意,我已将该命令放在单引号中,以避免shell将命令解释为“ run watch ps aux”,并将结果通过管道传递grep someprocess
。执行上一个命令的另一种方法是:
watch ps aux \| grep someprocess
默认情况下,watch
每两秒钟刷新一次,可以使用该-n
选项进行更改。例如,如果要间隔1秒:
watch -n 1 'ps aux | grep someprocess'
纯娱乐
pgrep ssh ;!!;!!;!!;!!;!!;!!
for
似乎是最好的方法。无论如何,谢谢你的回答。
cmd ;!!
一行上重复在当前行之前输入的命令吗?它必须是两个单独的history
条目。
;
与&&
停在第一次失败。
与先前的回复类似,但是不需要for循环:
seq 10 | xargs -I -- echo "hello"
将seq的输出通过管道传递给xargs,不带参数或选项
echo "hello" 1 2 3 4 5 6 7 8 9 10
。您需要-n 1
为每个输入(数字)对一个进程运行xargs,对于-P 10
并行执行(10个并行进程)运行xargs 。最后以seq 10 | xargs -n 1 -P 10 echo
。
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
当然可以将其制成一个衬套:
x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done
并且似乎是最可移植的方式,因此不太可能使您安装程序。
以下内容不太便于移植:
{1..10}
:bash特定,如果参数很大,则会生成一条大行seq
:GNUyes
: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
sh, zsh, ksh
,并且bash
在大多数平台上都得到很好的支持。csh, tcsh, fish
有一些支持。使用parallel --embed
您甚至可以构建一个可以轻松移动到未安装GNU Parallel的系统的脚本。
那将是“监视”-应该成为几乎所有使用procps的unix系统的一部分
您可以看到fs的更改或系统中其他有趣的动作。例如,
watch "df -hP | grep /tmp"
只需将命令作为参数即可(请参阅参考资料man watch
)