SHELL脚本--数学运算和bc命令
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命令的更多相关文章
- Linux shell 变量 数学 运算
Abstract : 1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...
- shell变量数学运算
shell变量数学运算 #!/bin/sh # 本脚本说明shell脚本中变量运算的用法 # 错误的用法var=1var=$var+1echo $var 输出:1+1 # 第一种用法,letvar=1 ...
- Linux Shell脚本入门--cut命令
Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...
- shell脚本中判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 示例 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- [shell]上一个命令执行完成,才执行下一个操作 | shell脚本中判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 场 ...
- Shell bash 数学运算 bc
1.bc命令可以完成浮点数的运算.其中 scale可以指定保留的小数点位数. 2.举例 例1: 例2:
- shell脚本编程-使用结构化命令(if/else)(转)
11.1 使用if-then语句 格式如下 if语句会执行if行定义的那个命令,如果该命令的退出状态码是0,则then部分的语句就会执行,其他值,则不会 1 2 3 4 if command th ...
- shell执行数学运算
整数: expr let $(()) $[] 浮点数: bc 1.使用expr ♦参与运算的成员和运算符之间必须有一个空格: ♦对于那些容易被shell错解的,在它们传入expr命令之前,需要使用sh ...
随机推荐
- [译]使用explain API摆脱ElasticSearch集群RED苦恼(转)
"哔...哔...哗",PagerDuty的报警通知又来了. 可能是因为你又遭遇了节点宕机, 或者服务器机架不可用, 或者整个ElasticSearch集群重启了. 不管哪种情况, ...
- C语言中结构体(struct)的几种初始化方法
转自https://www.jb51.net/article/91456.htm 本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示 ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- CUDA 计算线程索引的一般公式
CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y) + blockIdx.y ...
- eslint 的 env 配置是干嘛使的?
这笔修改体现了 env 和 global 的关系: https://github.com/g8up/youDaoDict/commit/8b05616f 官方文档表述: https://eslint. ...
- android:动态申请权限(一)
环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...
- Runtime "Apache Tomcat v6.0 (3)" is invalid. The JRE could not be found. Edit the server and change the JRE location解决方案
使用eclipse,启动Tomcat时出现The JRE could not be found ,Edit server and change teh JRE location的错误提示! 原因:重装 ...
- Scala中的Implicit详解
Scala中的implicit关键字对于我们初学者像是一个谜一样的存在,一边惊讶于代码的简洁, 一边像在迷宫里打转一样地去找隐式的代码,因此我们团队结合目前的开发工作,将implicit作为一个专题进 ...
- 利用java解压,并重命名
由于工作需要,写了一个小工具,利用java来解压文件然后对文件进行重命名 主要针对三种格式,分别是zip,rar,7z,经过我的多次实践我发现网上的类库并不能解压最新的压缩格式 对于zip格式: ma ...
- 抄一篇maven的备忘
标注下来源:http://www.trinea.cn/android/maven/ 由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lif ...