SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结。主要包括let、bc、expr、(())等。

1、let

使用格式:let 表达式,表达式必须是完整的表达式,即等号两边。只能赋值,不支持浮点数运算,不支持直接输出

$ var=
$ let var+= #var=12,中间不能有空格
$ let var=var+ #var=
$ let var*= #var=
$ let var/= # var=

无法计算浮点数,报错

$ var=2.5
$ let var+=
-bash: let: 2.5: 语法错误: 无效的算术运算符 (错误符号是 ".5")

2、bc

常用,支持浮点数运算

echo "1+1" | bc #
echo "1.5+1.5" | bc # 3.0
echo "3-1.2" | bc #1.8
echo "1.5*1.5" | bc #2.2
echo "10/3" | bc #
echo "scale=2;10/3" | bc #3.33

看到乘数和除数的精度不同了吗?设置其他参数测试下

echo "1.5*1.33333" | bc #1.99999
echo "1.5111111111111111111111*1.33333" | bc #2.0148097777777777777777
echo "4/5" | bc #
echo "1/2" | bc #
echo "6/5" | bc #

乘法输出结果的精度和相乘数最长的进度保持一致。整数相除结果下取整。当然,它是可以赋值的

var=$(echo "1+1"|bc) #var=2

3、expr

不支持浮点数运算,注意数字与计算符中的空格

expr  +  #
expr - #
expr \* #,注意*号前面有\,否则报错
expr / #
expr + #1+1,与预期不符
expr 1.0 + #输出语法错误
var=$(expr + ) #var=
var2=$(expr ${var} + ) #var2=

4、$(())

不支持浮点数运算,不支持窗口直接执行$(()),

var=$((1+1)) #1+1运算符前后中间是否有空格不影响计算
v1=10
v2=15
var=$((v1+v2))
var=$(($v1+$v2))
a=$(( 1 + 1.0 )) #提示语法错误

可以发现,在$(())中的变量带不带$取值符号都不影响计算。

5、awk

awk结合print的使用可以很好的各种完成数值计算,包括浮点数及精度控制。

$ awk 'BEGIN{printf 1.0/2.0}' #0.5
$ awk 'BEGIN{printf "5.2f%",10/3}' #3.33
$ var1=
$ var2=
$ awk -v v1=${var1} -v v2=${var2} 'BEGIN{printf "%5.2f\n",v1/v2}' #3.33

最后来看个实例,输出1~5的数值

#!/bin/bash

i=
MAX=
while [ ${i} -lt ${MAX} ];do
printf "${i}\n"
i=$(($i+))
done

输出结果


[ SHELL编程 ] shell编程中数值计算方法实例的更多相关文章

  1. mysql--SQL编程(关于mysql中的日期,实例,判断生日是否为闰年) 学习笔记2.1

    关于日期处理的实例: 从mysql给出的 example 这个是官方源码下载以及导入,http://dev.mysql.com/doc/employee/en/employees-installati ...

  2. shell编程系列7--shell中常用的工具find、locate、which、whereis

    shell编程系列7--shell中常用的工具find.locate.which.whereis .文件查找之find命令 语法格式:find [路径] [选项] [操作] 选项 -name 根据文件 ...

  3. shell编程系列6--shell中的函数

    shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...

  4. 【shell】shell编程(一)-入门

    如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux.说起来似乎shell编程很屌啊,然而不用担心,其实shell编程真的很简单.背景 什么是shell编程 ...

  5. 网络版shell之网络编程练习篇--telnet服务端

    网络版shell之网络编程练习篇--telnet服务端   以前写过一个shell命令解释器,对与shell命令解释器的执行流程有了清晰的认识,这段时间学习网络编程,至于网络编程的细节以及知识点,已经 ...

  6. 02、体验Spark shell下RDD编程

    02.体验Spark shell下RDD编程 1.Spark RDD介绍 RDD是Resilient Distributed Dataset,中文翻译是弹性分布式数据集.该类是Spark是核心类成员之 ...

  7. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  8. 能用Shell就别编程-海量文本型数据的处理

    对于txt文本类数据,优先采用shell脚本,实在不行才用Python,Java,MySQL 1) Shell命令行或脚本的处理速度极快,比Java快得多. 2) Shell代码量少,几个命令就能完成 ...

  9. .NET组件控件实例编程系列——5.DataGridView数值列和日期列

    在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会自动显示对应类型的列.当然我们自己可以手工选择列的类型,例如ComboBox列.Button列.Link列. ...

随机推荐

  1. UE4 Socket多线程非阻塞通信

    转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...

  2. jstat 详解

    最近项目里面使用到了多线程,有时候多线程会存在挂掉的情况,趁机好好学习总结一下JVM调优的方法. jstat使用: #jstat -help|-options #jstat -<option&g ...

  3. CentOS之RPM

    yum工具比RPM工具好用,所以直接介绍yum工具来管理RPM包. yum list |head -n 20 列出所有RPM资源. yum search vim  搜索RPM包vim yum inst ...

  4. Redis 穿透和雪崩

    Redis穿透 出现原因:频繁的查询一个不存在的数据,由于缓存不命中,每次都要查询持久层,从而失去缓存保护后端的意义 解决方法: 部署过滤器拦截: 将数据库中数据的存在的Id存入列表,放入缓存中,每次 ...

  5. 第9章 应用层(1)_域名系统DNS

    1. 域名系统DNS 1.1 主机名和域名的关系 (1)完全限定域名(Fully Qualified Domain Name, FQDN) = 主机名 + 域名 ①一个域名下可以有多个服务器/主机(如 ...

  6. for练习.html

    <script> 偶数 var str=""; for (var i = 1 ; i <= 100; i++){ if (i%2 == 0) { //str = ...

  7. ElasticSearch概述

    ElasticSearch 产生背景 Lucene 定义 ElasticSearch 定义  ElasticSearch vs Lucene ElasticSearch vs Solr Elastic ...

  8. 用vlan实现同一网段的的各部门之间有的可以通信有的不可以通信

    日前老师上课演示一个项目:实现公司同一网段的各个部门之间有的可以通信有的无法通信.我们用的是思科测试软件模拟操作,个人觉得很好用.       在刚开始做这个项目的时候我以为端口是对应的,如图,交换机 ...

  9. windows模拟linux部分功能

    --------------------------------------------分割线----------------------------------------------- 系统 wi ...

  10. 安全测试6_Web安全工具第一节(浏览器入门及扩展)

    今天来学习下浏览器的功能,浏览器是我们经常用到但是功能却很强大的一个东东,我们经常用到的无非是三种(谷歌.火狐.IE) 1.浏览器功能介绍: 下面以谷歌浏览器(Chrome版本为56)为例,介绍下,懂 ...