时间差异很大的3种Shell脚本循环写法
Posted dingdingfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间差异很大的3种Shell脚本循环写法相关的知识,希望对你有一定的参考价值。
是在看这篇文章时发现这个现象的。
首先看3个Shell脚本。
a.sh:
#!/bin/sh
MAX_VAL=50000
date
i=0
while [ $i -lt $MAX_VAL ]; do
echo ""
i=`expr $i + 1`
done > /dev/null
date
b.sh:
#!/bin/sh
MAX_VAL=50000
date
i=0
for i in `seq 1 $MAX_VAL` ; do
echo ""
done > /dev/null
date
c.sh:
#!/bin/sh
MAX_VAL=50000
date
i=0
for i in 1..$MAX_VAL; do
echo ""
done > /dev/null
date
b.sh和c.sh是类似的,区别在于b.sh用的是seq命令,而c.sh用的内置命令。
运行情况如下:
$ ./a.sh
Sat Oct 8 05:31:33 UTC 2022
Sat Oct 8 05:32:00 UTC 2022
$ ./b.sh
Sat Oct 8 05:32:12 UTC 2022
Sat Oct 8 05:32:12 UTC 2022
$ ./c.sh
Sat Oct 8 05:32:15 UTC 2022
Sat Oct 8 05:32:15 UTC 2022
分布为27秒,0秒和0秒。差异太大了。
补记:
2022年11月3日,感觉这个差异被人为放大了,不应该使用eval,而应该直接使用built-in。修改后的a.sh如下:
#!/bin/sh
MAX_VAL=50000
date
i=0
while [ $i -lt $MAX_VAL ]; do
echo ""
((i=i+1))
done > /dev/null
date
这样差异就很小了,不过还是要慢一些的。
以上是关于时间差异很大的3种Shell脚本循环写法的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本进阶一(for,while,continue,break,select等等)