脚本1:

#!/bin/bash
i=0
for ((k=1;k<=10000;k++));do
i=`expr $i + 1`
done
echo $i


脚本2:

#!/bin/bash
i=0
for ((k=1;k<=10000;k++));do
let 'i=i+1'
done
echo $i


问题:哪个快?

答案:脚本2比脚本1快得多得多


有人会说这个问题很无聊,其实不无聊,如果不认真总结积累经验,bash想写好其实也不容易。

bash的常用整数计算方法有三种(以+1为例):

let 'i=i+1' (推荐)

i=`expr $i + 1`

i=$((i+1))


浮点数计算方法有两种:

bc方案:

# echo "scale=2;3/21" | bc


awk方案(推荐):

awk 'BEGIN{printf"%.2f\n",'$num1'/'$num2'}'


OK,回到前面的问题,为啥let比expr快?

[root@info-test-01 niewei]# type let
let is a shell builtin
[root@info-test-01 niewei]# type expr
expr is /usr/bin/expr

这里可以看到区别,因为let是内部命令。


最后再看看下面2个计算,哪个快?

time (awk 'BEGIN{ total=0; for(i=0; i<=100000; i++){total+=i;} print total;}')
time(total=0; for i in $(seq 100000); do total=$(($total+i)); done;echo $total;)


这些东西很简单,但是总结清楚形成良好习惯后对写高效bash很有帮助。