时间差异很大的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脚本循环写法的主要内容,如果未能解决你的问题,请参考以下文章

时间差异很大的3种Shell脚本循环写法

shell脚本进阶一(for,while,continue,break,select等等)

Linux的shell脚本实战之while循环

Shell Script运行方式的差异

Linux学习总结(五十九)shell 脚本3-for while 循环

Linux Shell脚本 几种循环语句创建用户的方法