bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


使用let、(())、$(())或$[]进行基本的整数运算,使用bc进行高级的运算,包括小数运算。其中expr命令也能进行整数运算,还能判断参数是否为整数,具体用法见expr命令全解

其中let和(())几乎完全等价,除了做数学运算,还支持数学表达式判断,例如数值变量a是否等于3:let a==3或((a==3)),但一般不会使用它们来判断,而是使用test命令结合条件表达式:test "$a" -eq 3。因此,本文只介绍let的赋值运算功能。

1.6.1 基本整数运算

[root@xuexi tmp]# str=
[root@xuexi tmp]# let str=str+ # 等价于let str+=
[root@xuexi tmp]# let str-= # 等价于let str=str-
[root@xuexi tmp]# echo $str

let也可以使用(( ))进行替换,它们几乎完全等价。且额外的功能是:如果最后一个算术表达式结果为0,则返回状态码1,其余时候返回状态码0。

如果想在命令行中做计算,则可以使用$(())或$[]。

[root@xuexi ~]# str=
[root@xuexi ~]# echo $((str+=)) [root@xuexi ~]# echo $[str=str-]

当然,在为变量赋算术值的时候也可以使用$(())和$[]。

[root@xuexi ~]# str=
[root@xuexi ~]# str=$((str+=));echo $str [root@xuexi ~]# str=$[str-=];echo $str

其实,在算数计算过程中,等号右边的变量是可以带上$符号的,但等号左边的变量不允许带上$符号,因为它是要操作的变量,不是引用变量。例如:

[root@xuexi ~]# let str=$str-         # 等价于let str=str-
[root@xuexi ~]# str=$(($str-)) # 等价于str=$((str-))
[root@xuexi ~]# srt=$[$str-] # 等价于str=$[str-]
[root@xuexi ~]# echo $((str=$str-)) # 等价于echo $((str=str-)),但不能写成echo $(($str=str-))
[root@xuexi ~]# echo $[str=$str-] # 等价于echo $[str=str-],但不能写成echo $[$str=str-]

还可以自增、自减运算。"++"和"--"表示变量自动加1和减1。但是位置不同,返回的结果是不同的。

x++:先返回结果,再加1

++x:先加1再返回结果

x--:先返回结果,再减1

--x:先减1再返回结果

假如x的初始值为10,则echo $[x++]将显示10,但在显示完后(即返回结果之后),x的值已经变成了11,再执行echo $x将返回11。

[root@xuexi ~]# x=;echo $((x++));echo $x

如果此时再echo $[x++]仍将返回11,但此时x已经是12了。

[root@xuexi ~]# echo $((x++));echo $x

再将x变量的初始值初始化为10,则echo $[++x]将显示11,因为先加1后再赋值给x,echo再显示x的值。++x完全等价于x=x+1,它们都是先加1后赋值。

[root@xuexi ~]# x=;echo $((++x));echo $x

同理自减也是一样的。

因此,在使用自增或自减进行变量赋值时,需要注意所赋的值是否加减立即生效的。例如:

[root@xuexi ~]# x=;y=$((x++));echo $y;echo $y

因为y=$((x++))赋给y的值是加1前的值,虽然赋值结束后,$((x++))已经变成11,但这和y无关。

所以,对于自增自减类的变量赋值应该使用先计算再显示的"++x"或"--x"的方式。

[root@xuexi ~]# x=;y=$((++x));echo $y;echo $y

总结下数值变量的赋值运算的方法:

let i=i-1

let i=$i-1

let i-=1

i=$((i-1))

i=$(($i-1))

i=$[ i - 1 ]

i=$[ $i - 1 ]

echo $((i=i-1))

echo $((i=$i-1))

除了变量可以数学运算,数组也一样支持数学运算,且和变量一样,都能支持自增和自减等操作。其实数组其实质就是变量,只不过变量在内存中是离散的空间,而数组在内存中是顺序的空间。

例如,数组arr_test[a]=10,则:

let arr_test[a]=${arr_test[0]} - 1

let arr_test[a]-=1

echo $((arr_test[a]++))

echo $[ arr_test[a]++ ]

其它运算方法都类似,就不赘述了。其实和变量相比,只不过变量名改成arr_test[a],引用数组变量时改为${arr_test[a]}。

1.6.2 bc命令高级算术运算

bc可用于浮点数的计算,是linux中的计算器。该命令功能丰富、强大的让人吐血,支持自定义变量、自定义函数表达式逻辑、支持科学计算等等。虽然功能丰富,但多数时候仅用它的基本计算功能。

以下是一个基本的功能示例:

[root@node1 ~]# bc
b 1.06. # 首先输出bc的版本信息,可以使用-q选项不输出头部信息
Copyright -, , , , , Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
pie=3.1415 # 可以变量赋值
pie** # 运算时不需要空格
28.2735
r=
pie*r*r
28.2735
pie*r^ # 可以使用幂次方
28.2735
r= /* 将半径设置为3 */ # 还可以使用C语言风格的注释

输入quit命令可以退出bc计算器。

还支持自增和自减的功能。

[root@node1 ~]# bc -q
r=
r++ r++ ++r ++r --r

bc运算器有一个内建的变量scale,用于表示计算的精度(其实是刻度),即小数位保留几位。默认刻度为0,所以除法运算的默认结果是整数。

/(+)

scale=
/(+)
3.250

更人性化的功能是可以通过命令替换来实现批处理模式的计算。

它的一般格式参考如下:

var=`echo "option1;option2;...;expression"|bc`

其中options部分一般设置精度scale,和变量赋值,expression部分是计算表达式,最后将它们放在反引号中赋值给变量。如:

[root@node1 ~]# area=`echo "scale=2;r=3;3.1415*r*r"|bc`

[root@xuexi ~]# echo $area
28.2735

由于是在命令行中指定,所以这样的使用方式限制较多。bc接受使用here string和here document的方式接收参数。最常做法是将它们放置于脚本中。

#!/bin/bash
# script for calculate something var1=haha
var2=hehe value=`bc<<EOF # 在反引号中使用here string的方式
scale=
r=
3.1415*r*r
EOF`
echo $value

当bc计算的结果小于1的时候,例如"0.1+0.1=0.2",它会显示".2"而不是显示"0.2",要想显示出前面的0,bc自身似乎没有做出相关选项。不过可以通过外部程序,如printf将其显示出来。也可以结合echo命令显示。

printf "%.2f\n" `echo "0.1 + 0.1" | bc`
0.30 echo `echo "0.1 + 0.1" | bc`
0.3

以下是计算1+2+...+10的几种不同方式,要求输出在屏幕上的结果为"1+2+3+4+5+6+7+8+9+10=计算结果",这是非常不错的例子。

[root@node1 tmp]# echo $(seq -s "+" )=`seq -s "+" |bc`
+++++++++=
[root@node1 tmp]# echo $(seq -s "+" )=$((`seq -s "+" `))
+++++++++=
[root@node1 tmp]# echo $(seq -s "+" )=$(seq -s " + " |xargs expr)  # 注意"+"和" + "
+++++++++= 

SHELL脚本--数学运算和bc命令的更多相关文章

  1. Linux shell 变量 数学 运算

    Abstract : 1)  Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...

  2. shell变量数学运算

    shell变量数学运算 #!/bin/sh # 本脚本说明shell脚本中变量运算的用法 # 错误的用法var=1var=$var+1echo $var 输出:1+1 # 第一种用法,letvar=1 ...

  3. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  4. shell脚本中判断上一个命令是否执行成功

    shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 示例 ...

  5. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  6. [shell]上一个命令执行完成,才执行下一个操作 | shell脚本中判断上一个命令是否执行成功

    shell脚本中判断上一个命令是否执行成功  shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 场 ...

  7. Shell bash 数学运算 bc

    1.bc命令可以完成浮点数的运算.其中 scale可以指定保留的小数点位数. 2.举例 例1: 例2:

  8. shell脚本编程-使用结构化命令(if/else)(转)

    11.1 使用if-then语句 格式如下 if语句会执行if行定义的那个命令,如果该命令的退出状态码是0,则then部分的语句就会执行,其他值,则不会   1 2 3 4 if command th ...

  9. shell执行数学运算

    整数: expr let $(()) $[] 浮点数: bc 1.使用expr ♦参与运算的成员和运算符之间必须有一个空格: ♦对于那些容易被shell错解的,在它们传入expr命令之前,需要使用sh ...

随机推荐

  1. CentOS 7 nginx 1.8.1安装

    OS版本:CentOS 7.2nginx版本:1.8.1所需包:openssl-1.0.2m.tar.gz zlib-1.2.8.tar.gz pcre-8.36.tar.gz nginx-1.8.1 ...

  2. 滚动公告--jq

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. dhcp服务简单配置

    dhcp服务搭建 注意事项: > 配置虚拟机虚拟网络编辑器,取消"使用本地DHCP服务将IP地址分配给虚拟机" > 虚拟机网络连接设置为"仅主机模式" ...

  4. python之路(十七)-javascript

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  5. Windows 10 IoT Serials 10 – 如何使用OCR引擎进行文字识别

    1. 引言 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方 ...

  6. Redlock:Redis分布式锁最牛逼的实现

    普通实现 说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx.后一种方式的核心实现命令如下: - 获取锁(unique ...

  7. FFmpeg开发实战(二):FFmpeg 文件操作

    FFmpeg 提供了丰富的API供我们使用,下面我们来讲述一下文件操作相关的API: FFmpeg 删除文件:avpriv_io_delete() FFmpeg 重命名文件:avpriv_io_mov ...

  8. ProgressBar 进度条开源项目总结

    在Android开发中,我们不免会遇到进度条展示的需求,以下是本人之前star的开源项目,供大家参考: 一.ArcProgressBar 开源项目地址:https://github.com/zenoT ...

  9. H5中用js让页面全屏

    概述 意外的发现一个网页有一个按钮能使网页全屏,查了下代码发现是H5的全屏api,于是就查了下资料,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: 利用js如何做到让页面全屏和不全屏功能 ...

  10. [Swift-2019力扣杯春季初赛]1. 易混淆数

    给定一个数字 N,当它满足以下条件的时候返回 true: 把原数字旋转180°以后得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, 1, 9, 8, 6 . ...