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

  1. Linux shell tr 命令详解

    该随笔摘自 https://www.jb51.net/article/103892.htm Linux shell tr 命令详解 1. 用途 tr,translate的简写,主要用于压缩重复字符,删 ...

  2. Linux Shell 编程基础详解——吐血整理,墙裂推荐!

    第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...

  3. Linux Shell 数字计算与比较

    直接上脚本, 使用$(())以及$[]进行数字计算 数值比较:n1 -eq n2检查n1是否等于n2         n1 -le n2检查n1是否小于等于n2n1 -ge n2检查n1是否大于等于n ...

  4. Linux shell sed 命令详解

    详细的sed命令详解,请参考https://my.oschina.net/u/3908182/blog/1921761 sed命令常见用途 查找关键词做全局替换 查找某行的关键词做替换 查找关键字所在 ...

  5. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  6. Linux shell join命令详解

    Linux join命令 2012-02-09 17:49:00| 分类: SHELL | 标签:linux join 文件连接 |字号 订阅join命令 功能:“将两个文件里指定栏位同样的行连接起来 ...

  7. linux shell 字符串操作详解(获取长度、查找,替换)

    在做shell批处理程序时候,常常会涉及到字符串相关操作.有许多命令语句,如:awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,大家知道,使用内部操作符会省 ...

  8. linux shell ansible 命令详解

    也可以参考ansible 模块介绍的其他文章:https://www.cnblogs.com/guxiaobei/p/8316903.html 安装ansible yum install epel-r ...

  9. linux shell seq命令详解

    seq: squeue  是一个序列的缩写,主要用来输出序列化的东西 seq常见命令参数 用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 ...

随机推荐

  1. mybaits foreach

    <select id="selectQuickConsultDoctorList" resultMap="BaseResultMap" parameter ...

  2. Awk使用方法简介

    ==================AWK=================== AWK简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得 ...

  3. http-bio-8080"-exec-6

    现象如下:   Tomcat7启动后,后台抛出如下异常,前台一直无法登陆   Exception in thread ""http-bio-8080"-exec-6&qu ...

  4. jQuery,Table表头固定插件chromatable存在的问题及解决办法

    在最近的项目中需要将表格的表头固定,搜寻了大量的资料,发现chromatable插件还是比较方便的.但是当我在一个页面中多次使用 chromatable固定对个表格的表头时问题就出现了,首先说明系统的 ...

  5. C++11左值引用和右值引用

    转载:https://www.cnblogs.com/golaxy/p/9212897.html C++11的左值引用与右值引用总结 概念 1.&与&&  对于在C++中,大家 ...

  6. Starling开源手势库AcheGesture

    http://news.9ria.com/2012/1220/25686.html AcheGesture -一个Flash的开源框架 特点: 提供7个基本的手势,包括:单击.双击.捏.来回滑动.猛击 ...

  7. 聊聊 JDK 阻塞队列源码(ReentrantLock实现)

    项目中用到了一个叫做 Disruptor 的队列,今天楼主并不是要介绍 Disruptor 而是想巩固一下基础扒一下 JDK 中的阻塞队列,听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见, ...

  8. 在一台服务器上搭建相对高可用HiveServer实践

    本文来自网易云社区 作者:刘杰 问题及原因 组里之前搭建了一个hiveserver提供给猛犸上的ETL程序调用,hiveserver隔三差五地挂掉重启,网上查了些资料,也咨询了猛犸那边维护hivese ...

  9. 《Beginning Java 7》 - 3 - Equalty 判等

    == 用于判断是否为同一引用. 比如对于 String: System.out.println("abc" == "abc"); // Output: true ...

  10. [CF700E][JZOJ5558]Cool Slogan (后缀自动机+线段树)

    题意翻译 给出一个长度为$n$的字符串$s[1]$,由小写字母组成.定义一个字符串序列$s[1....k]$,满足性质:$s[i]$在$s[i-1]$ $(i>=2)$中出现至少两次(位置可重叠 ...