我偶尔会运行这样的bash命令行:
n=0; while [[ $n -lt 10 ]]; do some_command; n=$((n+1)); done
Run Code Online (Sandbox Code Playgroud)
some_command连续运行多次 - 在这种情况下为10次.
通常some_command是一系列命令或管道.
有没有更简洁的方法来做到这一点?
Joe*_*erg 430
for run in {1..10}
do
command
done
Run Code Online (Sandbox Code Playgroud)
或者作为那些想要轻松复制和粘贴的人的单行:
for run in {1..10}; do command; done
Run Code Online (Sandbox Code Playgroud)
Bat*_*hyX 198
使用常量:
for ((n=0;n<10;n++)); do some_command; done
Run Code Online (Sandbox Code Playgroud)
使用变量(可以包括数学表达式):
x=10 for ((n=0; n < (x / 2); n++)); do some_command; done
Run Code Online (Sandbox Code Playgroud)
mit*_*tnk 115
破解它的另一种简单方法:
seq 20 | xargs -Iz echo "Hi there"
Run Code Online (Sandbox Code Playgroud)
运行回声20次.
请注意,seq 20 | xargs -Iz echo "Hi there z"将输出:
嗨那里有1
你好2
...
Wil*_*lva 70
如果您使用的是zsh shell:
repeat 10 { echo 'Hello' }
Run Code Online (Sandbox Code Playgroud)
其中10是命令重复的次数.
Ole*_*nge 25
使用GNU Parallel,您可以:
parallel some_command ::: {1..1000}
Run Code Online (Sandbox Code Playgroud)
如果您不希望将数字作为参数,并且一次只运行一个作业:
parallel -j1 -N0 some_command ::: {1..1000}
Run Code Online (Sandbox Code Playgroud)
观看介绍视频以获得快速介绍:https: //www.youtube.com/playlist?list = PL284C9FF2488BC6D1
浏览教程(http://www.gnu.org/software/parallel/parallel_tutorial.html).你命令行爱你.
ste*_*eel 16
bash配置文件中的一个简单函数(~/.bashrc通常)可以很好地工作.
function runx() {
for ((n=0;n<$1;n++))
do ${*:2}
done
}
Run Code Online (Sandbox Code Playgroud)
像这样称呼它.
$ runx 3 echo 'Hello world'
Hello world
Hello world
Hello world
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 11
你的例子的另一种形式:
n=0; while (( n++ < 10 )); do some_command; done
Run Code Online (Sandbox Code Playgroud)
Jam*_*ven 10
xargs为快:
#!/usr/bin/bash
echo "while loop:"
n=0; time while (( n++ < 10000 )); do /usr/bin/true ; done
echo -e "\nfor loop:"
time for ((n=0;n<10000;n++)); do /usr/bin/true ; done
echo -e "\nseq,xargs:"
time seq 10000 | xargs -I{} -P1 -n1 /usr/bin/true
echo -e "\nyes,xargs:"
time yes x | head -n10000 | xargs -I{} -P1 -n1 /usr/bin/true
echo -e "\nparallel:"
time parallel --will-cite -j1 -N0 /usr/bin/true ::: {1..10000}
Run Code Online (Sandbox Code Playgroud)
在现代的64位Linux上,给出:
while loop:
real 0m2.282s
user 0m0.177s
sys 0m0.413s
for loop:
real 0m2.559s
user 0m0.393s
sys 0m0.500s
seq,xargs:
real 0m1.728s
user 0m0.013s
sys 0m0.217s
yes,xargs:
real 0m1.723s
user 0m0.013s
sys 0m0.223s
parallel:
real 0m26.271s
user 0m4.943s
sys 0m3.533s
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为xargs命令是一个/usr/bin/true多次生成命令的单个本机进程,而不是所有在Bash中解释的for和while循环.当然这仅适用于单个命令; 如果你需要在循环的每次迭代中做多个命令,它将比传递sh -c 'command1; command2; ...'到xargs 一样快,或者更快
该-P1也可以改变,比方说,-P8产卵并行8个流程,以获得速度的另一大助力.
我不知道为什么GNU并行是如此之慢.我原以为它可以与xargs相媲美.
小智 7
xargs和seq会有所帮助
function __run_times { seq 1 $1| { shift; xargs -i -- "$@"; } }
Run Code Online (Sandbox Code Playgroud)
风景 :
abon@abon:~$ __run_times 3 echo hello world
hello world
hello world
hello world
Run Code Online (Sandbox Code Playgroud)
首先,您可以将其包装在一个函数中:
function manytimes {
n=0
times=$1
shift
while [[ $n -lt $times ]]; do
$@
n=$((n+1))
done
}
Run Code Online (Sandbox Code Playgroud)
称之为:
$ manytimes 3 echo "test" | tr 'e' 'E'
tEst
tEst
tEst
Run Code Online (Sandbox Code Playgroud)
小智 5
for _ in {1..10}; do command; done
Run Code Online (Sandbox Code Playgroud)
请注意下划线而不是使用变量.
所有现有的答案似乎都需要bash,并且不适用于标准 BSD UNIX /bin/sh(例如,ksh在 OpenBSD 上)。
下面的代码应该适用于任何 BSD:
$ echo {1..4}
{1..4}
$ seq 4
sh: seq: not found
$ for i in $(jot 4); do echo e$i; done
e1
e2
e3
e4
$
Run Code Online (Sandbox Code Playgroud)
小智 5
我用这个循环解决了,其中 repeat是一个代表循环数的整数
repeat=10
for n in $(seq $repeat);
do
command1
command2
done
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用此命令重复您的命令 10 次或更多次
for i in {1..10}; do **your command**; done
Run Code Online (Sandbox Code Playgroud)
例如
for i in {1..10}; do **speedtest**; done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
194057 次 |
| 最近记录: |