(轉)linux shell 數字計算詳解


代碼中免不了要進行各種數據計算。拋開科學計算不提,普通的計算占地,百分比,同比,環比等需求就很常見。linux shell中進行數字計算,主要有如下幾種方式:

1.bc

bc是比較常用的linux計算工具了,而且支持浮點運算:

[webopa@namenode-backup expensive_user]$ a=`echo 1+1 | bc` [webopa@namenode-backup expensive_user]$ echo $a 2
  • 1
  • 2
  • 3

但是浮點數運算的精度問題,暫時還沒明白什么情況:

[webopa@namenode-backup expensive_user]$ b=`echo "1.2*1.2" | bc` [webopa@namenode-backup expensive_user]$ echo $b 1.4 [webopa@namenode-backup expensive_user]$ c=`echo "5.0/3.0" | bc` [webopa@namenode-backup expensive_user]$ echo $c 1 [webopa@namenode-backup expensive_user]$ d=`echo "scale=2;5.0/3.0" | bc` [webopa@namenode-backup expensive_user]$ echo $d 1.66 [webopa@namenode-backup expensive_user]$ e=`echo "scale=2;5.0/6.0" | bc` [webopa@namenode-backup expensive_user]$ echo $e .83
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

尤其最后一個,這到底什么鬼,小數點前的那個0跑哪里去了。。。

2.expr

不支持浮點數計算。這又是個大坑.而且要注意數字與運算符中的空格

[webopa@namenode-backup expensive_user]$ a=`expr 1+1` [webopa@namenode-backup expensive_user]$ echo $a 1+1 [webopa@namenode-backup expensive_user]$ a=`expr 1 + 1` [webopa@namenode-backup expensive_user]$ echo $a 2 [webopa@namenode-backup expensive_user]$ b=`expr 10 / 2` [webopa@namenode-backup expensive_user]$ echo $b 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.$(())

同expr,不支持浮點數運算

[webopa@namenode-backup expensive_user]$ a=$((1+1)) [webopa@namenode-backup expensive_user]$ echo $a 2 [webopa@namenode-backup expensive_user]$ b=$((1 + 3 )) [webopa@namenode-backup expensive_user]$ echo $b 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.let

不支持浮點數運算,而且不支持直接輸出,只能賦值

[webopa@namenode-backup expensive_user]$ let a=1+1 [webopa@namenode-backup expensive_user]$ echo $a 2 [webopa@namenode-backup expensive_user]$ let b=50/5 [webopa@namenode-backup expensive_user]$ echo $b 10 [webopa@namenode-backup expensive_user]$ let c=1.2*2 -bash: let: c=1.2*2: syntax error: invalid arithmetic operator (error token is ".2*2")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.awk

普通的運算:

[webopa@namenode-backup expensive_user]$ a=`echo | awk '{print 1.0/2.0}'` [webopa@namenode-backup expensive_user]$ echo $a 0.5
  • 1
  • 2
  • 3

控制精度:

[webopa@namenode-backup expensive_user]$ b=`echo | awk '{printf("%.2f",1.0/2.0)}'` [webopa@namenode-backup expensive_user]$ echo $b 0.50
  • 1
  • 2
  • 3

傳遞參數:

[webopa@namenode-backup expensive_user]$ c=`echo | awk -v a=1 -v b=3 '{printf("%.4f",a/b)}'` [webopa@namenode-backup expensive_user]$ echo $c 0.3333
  • 1
  • 2
  • 3

綜合來看,還是awk最靠譜,其他的方式都有這樣那樣的問題。所以我平時一般都用awk來搞數學計算。

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/bitcarmanlee/article/details/51325046


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM