(转)linux shell 数字计算详解

摘要:
有几种方法可以在Linuxshell中执行数值计算:1.bcbc是一种常用的Linux计算工具,支持浮点运算:[webopa@namenode-backupexpensive_user]$a=`echo1+1|bc`[webopa@namenode-backupexpensive_user]$echo$a2123但是浮点运算的精度还不清楚:[webopa@namenode-backupexpensive_user]$b=`echo“1.2*1.2”|bc`[webopa@namenode-backupexpensive_user]$echo$b1.4[webopa@namenode-backupexpensive_user]$c=`echo“5.0/3.0”|bc`[webopa@namenode-backupexpensive_user]$echo$c1[webopa@namenode-backupexpensive_user]$d=`echo“scale=2;5.0/3.0”|bc`[webopa@namenode-backupexpensive_user]$echo$d1.66[webopa@namenode-backupexpensive_user]$e=`echo“scale=2;5.0/6.0”|bc`[webopa@namenode-backupexpensive_user]$echo$e。83123456789101112特别是最后一个,这到底是什么?小数点前的0在哪里。。。

代码中免不了要进行各种数据计算。抛开科学计算不提,普通的计算占地,百分比,同比,环比等需求就很常见。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

免责声明:文章转载自《(转)linux shell 数字计算详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tete009 Firefox 教程异步加载js文件的方法总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP高精度数学运算函数

php 浮点数计算比较及取整不准确。举例:$a = 0.2+0.7;$b = 0.9;var_dump($a == $b); //输出的结果为bool(false)PHP 官方手册说明:显然简单的十进制分数如 0.2 不能在不丢失一点点精度的情况下转换为内部二 进制的格式。printf("%0.20f", $a); //输出的结果为0.899999999...

vim 命令大全 / vi 命令大全

vim 命令大全 光标控制命令: 命令 光标移动 h 向左移一个字符 j 向下移一行 k 向上移一行 l 向右移一个字符 G 移到文件的最后一行 w 移到下一个字的开头 W 移到下一个字的开头,忽略标点符号 b 移到前一个字的开头 B 移到前一个字的开头,忽略标点符号 L 移到屏幕的最后一行 M 移到屏幕的中间一行 H 移到屏幕的第一行 e 移到下一...

linux应用程序调试----backtrace

打印堆栈是调试的常用方法,一般在系统异常时,我们可以将异常情况下的堆栈打印出来,这样十分方便错误查找。 先介绍下比较简单的backtrace方式,后面有机会可以尝试下core文件+gdb的方式。 backtrace打印堆栈方式 编译选项增加  -O0 -rdynamic -g -funwind-tables -ffunction-sections CFLA...

thinkphp6事件监听和触发多个事件

thinkphp6事件订阅,监听多个事件 创建一个事件类 创建一个监听类 修改配置文件确定触发事件 创建一个事件类 php think make:event User <?php namespace appevent; class User { public function __construct() {...

Linux 线程占用CPU过高定位分析

今天朋友问我一个Linux程序CPU占用涨停了,该如何分析, CPU占用过高,模拟CPU占用过高的情况 先上一段代码: 1 #include <iostream> 2 #include <thread> 3 #include <vector> 4 5 6 int main(int argc, char *...

zz-rtl8188eu的linux-usb-wifi调试及驱动编译150210

//zz//#######################################################################zz-rtl8188eu的linux-usb-wifi调试及驱动编译150210zz-Write:@2015-2-4 22:11:14@2015-2-11 00:32:07@REF:嵌入式linux us...