我偶尔会运行这样的一个bash命令行:
n=0; while [[ $n -lt 10 ]]; do some_command; n=$((n+1)); done
要连续运行some_command
多次 - 在这种情况下为10次。
通常some_command
是一系列命令或管道。
是否有更简洁的方法来做到这一点?
如果您的范围中有一个变量,请像这样使用seq
:
count=10
for i in $(seq $count); do
command
done
简单来说:
for run in {1..10}; do
command
done
对于那些想要轻松复制和粘贴的人,可以将其简化为一行代码:
for run in {1..10}; do command; done
for (n=0;n<k;n++)
зҡ„еҪўејҸеҸҜиғҪжӣҙеҘҪпјӣжҲ‘жҖҖз–‘{1..k}
дјҡз”ҹжҲҗдёҖдёӘеҢ…еҗ«жүҖжңүж•ҙ数并д»Ҙз©әж јеҲҶйҡ”зҡ„еӯ—з¬ҰдёІгҖӮ - Joe Kobergn=15; for i in $(seq -f "%02g" ${n}); do echo $i; done
输出结果为:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15 - user1830432使用常量:
for ((n=0;n<10;n++)); do
some_command;
done
使用变量(可以包括数学表达式):
x=10; for ((n=0; n < (x / 2); n++)); do some_command; done
x=10
for ((n=0; n < $x; n++));
- Jelphyfor run in {1..10}; do echo "on run $run"; done
,这同样是可以接受的。 - Douglas Adamsn
已经设置为特定值怎么办?for (( ; n<10; n++ ))
不起作用 / 编辑:最好使用其他答案之一,比如 while (( n++...
- phil294另一个简单的方法来破解它:
seq 20 | xargs -Iz echo "Hi there"
执行echo命令20次。
请注意,seq 20 | xargs -Iz echo "Hi there z"
输出如下:
Hi there 1
Hi there 2
...
seq 20 | xargs -I{} echo "你好 {}"
- mitnkseq
中去掉数字?这样它就只会打印出“Hi there”20次(没有数字)? 编辑:只需使用 -I {}
,然后在命令中不再有任何 {}
。 - Mike GrafIIIII
,这样看起来很好,例如:seq 20 | xargs -IIIIII timeout 10 yourCommandThatHangs
。 - rubo77如果您使用的是zsh shell:
repeat 10 { echo 'Hello' }
其中 10 是命令将被重复执行的次数。
{ echo "运行次数 $n" }
。 - Joshua Pinterparallel some_command ::: {1..1000}
如果您不想将数字作为参数,并且每次只运行单个作业:
parallel -j1 -N0 some_command ::: {1..1000}
观看简介视频以快速了解: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
按照教程步骤进行 (http://www.gnu.org/software/parallel/parallel_tutorial.html)。你的命令行会因此而爱上你。
-j1 -N0
这样晦涩难懂的参数,从而关闭并行处理呢? - Ross Pressersome_command
?并且:您能否比parallel -j1 -N0 some_command ::: {1..1000}
更简洁地表达它? - Ole Tangeparallel -N0 -j1 --retries 4 --results outputdir/ some_command
- Ole Tange在bash配置文件中(通常是~/.bashrc
),一个简单的函数可以很好地工作。
function runx() {
for ((n=0;n<$1;n++))
do ${*:2}
done
}
这样调用它。
$ runx 3 echo 'Hello world'
Hello world
Hello world
Hello world
do ${*:2}
,我还添加了eval do eval ${*:2}
,以确保它适用于不以可执行文件开头的命令。例如,如果您想在运行诸如SOME_ENV=test echo 'test'
这样的命令之前设置环境变量。 - 5_nd_5function runx() {
success=0
for ((n=0;n<$1 && success==0;n++))
do
${*:2}
success=$?
done
}
- Csenefor _ in {1..10}; do command; done
注意使用下划线而不是变量。
i
而不是 _
,因为 _
可能会被解释为上一个命令的结果。你也可以通过 for i in {1..10}; do echo "Run $i"; done
来获取迭代次数。 - Joshua Pinterwatch -n 1 some_command
}ls
命令之前添加--differences
。}The --cumulative option makes highlighting "sticky", presenting a running display of all positions that have ever changed. The -t or --no-title option turns off the header showing the interval, command, and current time at the top of the display, as well as the following blank line.
你举的例子还有另一种形式:
n=0; while (( n++ < 10 )); do some_command; done
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}
在现代的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
这是有道理的,因为xargs
命令是一个单独的本地进程,它会多次生成/usr/bin/true
命令,而不是在Bash中解释所有的for
和while
循环。当然,这仅适用于单个命令;如果您需要在每次迭代循环中执行多个命令,则与将sh -c 'command1; command2; ...'
传递给xargs相比,速度可能会更快。
-P1
也可以改为-P8
,并行生成8个进程以获得另一个大的速度提升。
我不知道为什么GNU parallel如此缓慢。我认为它应该与xargs相当。
let ++n
代替n=$((n+1))
(少3个字符)。 - musiphilzsh
有repeat 10 do some_command; done
。该命令可以重复执行某个命令10次。 - chepnersh:1:[[: not found
错误提示。 - bstpierre