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

mah*_*ich 205 linux bash

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

就像是:

run -n 10  'ps aux|grep someprocess'
Run Code Online (Sandbox Code Playgroud)

我想以交互方式使用它。

更新:我问这个问题的原因是,我确实在很多机器上工作,我不想将我所有的改编脚本等导入到每个盒子中以在每台机器上获得相同的功能。

Edu*_*nec 278

我不认为存在用于此的命令或 shell 内置命令,因为它是 Bourne shellfor循环设计的一个微不足道的子集,因此自己实现这样的命令非常简单。

根据 JimB 的建议,使用 Bash 内置来生成序列:

for i in {1..10}; do command; done
Run Code Online (Sandbox Code Playgroud)

对于非常旧版本的 bash,您可以使用以下seq命令:

for i in `seq 10`; do command; done
Run Code Online (Sandbox Code Playgroud)

command每次执行十次迭代- 它可以是一个管道或一系列由;或分隔的命令&&。您可以使用该$i变量来了解您所在的迭代。

如果您将此单行脚本视为脚本,因此出于某些未指定(但可能有效)的原因,您可以将其作为命令来实现,也许在您的 .bashrc 上是这样的(未经测试):

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

用法:

run 10 command
Run Code Online (Sandbox Code Playgroud)

例子:

run 5 echo 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

  • @mahatmanich,循环不是脚本。没有什么可以阻止您在交互式终端上使用 for... 。 (16认同)
  • @mahatmanich - `for` * 是用于迭代的内置 bash。 (6认同)
  • @Eduardo Ivanec - 仅供参考,bash 具有内置范围,如 `seq`: `{1..10}` (4认同)
  • 嗯,上面的单行是一种标准的方法,而且相当简单。为什么对你不好?也许你问错了问题?您的脚本或您想要多次重复的操作的主要目标是什么?如果我们换一种方式来解决问题,也许会有更好的解决方案。 (3认同)

Lek*_*eyn 39

ps aux | grep someprocess看起来您想在固定时间内观看节目的变化。Eduardo 给出的答案准确地回答了您的问题,但还有一个替代方案watch

watch 'ps aux | grep someprocess'
Run Code Online (Sandbox Code Playgroud)

请注意,我已将命令放在单引号中,以避免 shell 将命令解释为“run watch ps aux”并将结果通过grep someprocess. 执行上一个命令的另一种方法是:

watch ps aux \| grep someprocess
Run Code Online (Sandbox Code Playgroud)

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

watch -n 1 'ps aux | grep someprocess'
Run Code Online (Sandbox Code Playgroud)


小智 27

只是为了好玩

pgrep ssh ;!!;!!;!!;!!;!!;!!
Run Code Online (Sandbox Code Playgroud)

;是一个命令分隔符,并!!在 bash 中重放最后一个命令。所以这会运行pgrep ssh,然后重播 6 次。

  • ; 只是命令分隔符。!! 在 bash 中重放最后一个命令。所以这次运行'pgrep ssh'然后重播它6次。 (6认同)
  • `cmd ;!!` 不会在一行上重复在当前行*之前*输入的命令吗?它必须是两个单独的“历史”条目。 (4认同)
  • 有人可以解释一下吗?看起来非常耐人寻味。 (2认同)
  • 用 `&&` 替换 `;` 以在第一次失败时停止。 (2认同)

小智 20

与之前的回复类似,但不需要 for 循环:

seq 10 | xargs -I -- echo "hello"
Run Code Online (Sandbox Code Playgroud)

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

  • 这只会执行一次`echo "hello" 1 2 3 4 5 6 7 8 9 10`。您需要使用 `-n 1` 为每个输入(数字)的一个进程运行 xargs,并使用 `-P 10` 为并行执行(10 个并行进程)运行。以`seq 10 结尾 | xargs -n 1 -P 10 echo`。 (2认同)

小智 17

尝试这个:

yes ls | head -n5 | bash
Run Code Online (Sandbox Code Playgroud)

这需要在子 shell 中执行命令,这是一个轻微的性能损失。天啊。基本上,你得到“yes”命令来重复字符串“ls”N次;而“head -n5”在重复 5 次时终止循环。最后一个管道将命令发送到您选择的 shell。

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


Cir*_*郝海东 7

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
Run Code Online (Sandbox Code Playgroud)

这当然可以制成单衬:

x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done
Run Code Online (Sandbox Code Playgroud)

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

以下是不太便携的:

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

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

sudo apt-get install parallel
seq 100 | parallel echo {}
Run Code Online (Sandbox Code Playgroud)

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

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


Nei*_*eil 6

在 macOS 上,您可以使用该repeat命令。

repeat 10 ps aux | grep someprocess
Run Code Online (Sandbox Code Playgroud)

  • @PatrickSteil事实上这是一个zsh关键字http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html,```重复单词做列表完成单词被扩展并被视为算术表达式,它必须计算为数 n. 然后list被执行n次。当 shell 以模拟另一个 shell 的模式启动时,默认情况下会禁用重复语法。可以使用命令“enable -r Repeat”启用它``` (2认同)