声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。
参考博客 :
原文链接:http://c.biancheng.net/shell/

Shell数学计算

  • Shell数学计算
  • 数学计算命令
    • 对整数进行数学运算: (()) / let / $[] /expr
      • Shell (())
      • Shell let命令
    • bc命令:一款数学计算器
      • 在 Shell 中使用 bc 计算器

Shell数学计算

默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数值或者变量)当做字符串,把+当做字符串连接符,最终的结果是把两个字符串拼接在一起形成一个新的字符串。

  • 在 Bash Shell 中,如果不特别指明,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

【典型反面案例】

[c.biancheng.net]$ echo 2+8
2+8
[c.biancheng.net]$ a=23
[c.biancheng.net]$ b=$a+55
[c.biancheng.net]$ echo $b
23+55
[c.biancheng.net]$ b=90
[c.biancheng.net]$ c=$a+$b
[c.biancheng.net]$ echo $c
23+90

数学计算命令

运算操作符/运算命令 说明
(( )) 用于整数运算,效率很高,推荐使用。
let 用于整数运算,和 (()) 类似。
$[] 用于整数运算,不如 (()) 灵活。
expr 可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。
bc Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。
declare -i 将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等,所以在实际开发中很少使用。

对整数进行数学运算: (()) / let / $[] /expr

Shell (())

(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算

((表达式))

表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。
对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。

可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。

常见写法

((a=10+66))
a=$((10+66)
((a>7 && b==c))
echo $((a+10))
((a=3+5, b=a+10))

【注意】:在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名


【举例】

[c.biancheng.net]$ echo $((1+1))
2
[c.biancheng.net]$ echo $((6-3))
3
[c.biancheng.net]$ i=5
[c.biancheng.net]$ ((i=i*2))  #可以简写为 ((i*=2))。
[c.biancheng.net]$ echo $i   #使用 echo 输出变量结果时要加 $。
10

【举例2】

[c.biancheng.net]$ ((a=1+2**3-4%3)) #  **是求乘方运算符 这里是2^3
[c.biancheng.net]$ echo $a
8
[c.biancheng.net]$ b=$((1+2**3-4%3)) #运算后将结果赋值给变量,变量放在了括号的外面。
[c.biancheng.net]$ echo $b
8
[c.biancheng.net]$ echo $((1+2**3-4%3)) #也可以直接将表达式的结果输出,注意不要丢掉 $ 符号。
8
[c.biancheng.net]$ a=$((100*(100+1)/2)) #利用公式计算1+2+3+...+100的和。
[c.biancheng.net]$ echo $a
5050
[c.biancheng.net]$ echo $((100*(100+1)/2)) #也可以直接输出表达式的结果。
5050

【举例3】利用 (( )) 进行逻辑运算。

[c.biancheng.net]$ echo $((3<8))  #3<8 的结果是成立的,因此,输出了 1,1 表示真
1
[c.biancheng.net]$ echo $((8<3))  #8<3 的结果是不成立的,因此,输出了 0,0 表示假。
0
[c.biancheng.net]$ echo $((8==8)) #判断是否相等。
1
[c.biancheng.net]$ if ((8>7&&5==5))
> then
> echo yes
> fi
yes

【实例4】利用 (( )) 进行自增(++)和自减(–)运算。

[c.biancheng.net]$ a=10
[c.biancheng.net]$ echo $((a++))  #如果++在a的后面,那么在输出整个表达式时,会输出a的值,因为a为10,所以表达式的值为10。
10
[c.biancheng.net]$ echo $a #执行上面的表达式后,因为有a++,因此a会自增1,因此输出a的值为11。
11
[c.biancheng.net]$ a=11
[c.biancheng.net]$ echo $((a--)) #如果--在a的后面,那么在输出整个表达式时,会输出a的值,因为a为11,所以表达式的值的为11。
11
[c.biancheng.net]$ echo $a #执行上面的表达式后,因为有a--,因此a会自动减1,因此a为10。
10
[c.biancheng.net]$ a=10
[c.biancheng.net]$ echo $((--a))  #如果--在a的前面,那么在输出整个表达式时,先进行自增或自减计算,因为a为10,且要自减,所以表达式的值为9。
9
[c.biancheng.net]$ echo $a #执行上面的表达式后,a自减1,因此a为9。
9
[c.biancheng.net]$ echo $((++a))  #如果++在a的前面,输出整个表达式时,先进行自增或自减计算,因为a为9,且要自增1,所以输出10。
10
[c.biancheng.net]$ echo $a  #执行上面的表达式后,a自增1,因此a为10。
10

【实例5】利用 (( )) 同时对多个表达式进行计算。

[c.biancheng.net]$ ((a=3+5, b=a+10))  #先计算第一个表达式,再计算第二个表达式
[c.biancheng.net]$ echo $a $b
8 18
[c.biancheng.net]$ c=$((4+8, a+b))  #以最后一个表达式的结果作为整个(())命令的执行结果
[c.biancheng.net]$ echo $c
26

Shell let命令

【结论】 多用(()),少用let和$[]
【注意】:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

let 表达式
let "表达式"
let '表达式'
等价于
((表达式))

【区别】

  • let 命令以空格来分隔多个表达式;
  • (( )) 以逗号,来分隔多个表达式。

【经典let错误】

[c.biancheng.net]$ a=10 b=20
[c.biancheng.net]$ echo $((a+b))
30
[c.biancheng.net]$ echo let a+b  #错误,echo会把 let a+b作为一个字符串输出
let a+b
[c.biancheng.net]$ echo let sum=a+b
let sum=a+b

【let举例】

[c.biancheng.net]$ a=10 b=35
[c.biancheng.net]$ let a+=6 c=a+b  #多个表达式以空格为分隔
[c.biancheng.net]$ echo $a $c
16 51

bc命令:一款数学计算器

Linux bc 命令可以很方便的进行浮点运算,当然整数运算也不再话下。

在终端输入bc命令,然后回车即可进入 bc 进行交互式的数学计算。在 Shell 编程中,我们也可以通过管道和输入重定向来使用 bc。

例如你不想输入 bc 命令后显示一堆没用的信息,那么可以输入bc -q


内 置 变 量 内置变量 内置变量

变量名 作 用
scale 指定精度,也即小数点后的位数;默认为 0,也即不使用小数部分。
ibase 指定输入的数字的进制,默认为十进制。
obase 指定输出的数字的进制,默认为十进制。
last 或者 . 表示最近打印的数字

【实例1】scale 变量用法举例:
精度=3 精度=10

【实例2】ibase 和 obase 变量用法举例:
【注意】obase 要尽量放在 ibase 前面,因为 ibase 设置后,后面的数字都是以 ibase 的进制来换算的


内 置 函 数 内置函数 内置函数

函数名 作用
s(x) 计算 x 的正弦值,x 是弧度值。
c(x) 计算 x 的余弦值,x 是弧度值。
a(x) 计算 x 的反正切值,返回弧度值。
l(x) 计算 x 的自然对数。
e(x) 求 e 的 x 次方。
j(n, x) 贝塞尔函数,计算从 n 到 x 的阶数。

要想使用这些数学函数,在输入 bc 命令时需要使用-l选项,表示启用数学库。


在 一 行 中 使 用 多 个 表 达 式 在一行中使用多个表达式 在一行中使用多个表达式
只要用分号;隔开就行

在 Shell 中使用 bc 计算器

在 Shell 脚本中,我们可以借助管道或者输入重定向来使用 bc 计算器。

借 助 管 道 使 用 b c 计 算 器 借助管道使用 bc 计算器 借助管道使用bc计算器

  • 管道是 Linux 进程间的一种通信机制,它可以将前一个命令(进程)的输出作为下一个命令(进程)的输入,两个命令之间使用竖线|分隔。
  • 通常情况下,一个命令从终端获得用户输入的内容,如果让它从其他地方(比如文件)获得输入,那么就需要重定向。

直接输出 bc 的计算结果:

echo "expression" | bc

将 bc 的计算结果赋值给 Shell 变量:

variable=$(echo "expression" | bc)

【举例1】

[c.biancheng.net]$ echo "3*8"|bc
24
[c.biancheng.net]$ ret=$(echo "4+9"|bc)
[c.biancheng.net]$ echo $ret
13

【实例2】使用 bc 中的变量:

[c.biancheng.net]$ echo "scale=4;3*8/7"|bc
3.4285
[c.biancheng.net]$ echo "scale=4;3*8/7;last*5"|bc
3.4285
17.1425

【实例3】使用 Shell 脚本中的变量:

[c.biancheng.net]$ x=4
[c.biancheng.net]$ echo "scale=5;n=$x+2;e(n)"|bc -l
403.42879

【实例4】进制转换:

#十进制转十六进制
[mozhiyan@localhost ~]$ m=31
[mozhiyan@localhost ~]$ n=$(echo "obase=16;$m"|bc)
[mozhiyan@localhost ~]$ echo $n
1F
#十六进制转十进制
[mozhiyan@localhost ~]$ m=1E
[mozhiyan@localhost ~]$ n=$(echo "obase=10;ibase=16;$m"|bc)
[mozhiyan@localhost ~]$ echo $n
30

借 助 输 入 重 定 向 使 用 b c 计 算 器 借助输入重定向使用 bc 计算器 借助输入重定向使用bc计算器

variable=$(bc << EOF
expressions
EOF
)
  • variable是 Shell 变量名
  • express是要计算的数学表达式(可以换行,和进入 bc 以后的书写形式一样)
  • EOF是数学表达式的开始和结束标识(你也可以换成其它的名字,比如 aaa、bbb 等)。
    【举例】
[c.biancheng.net]$ m=1E
[c.biancheng.net]$ n=$(bc << EOF
> obase=10;
> ibase=16;
> print $m
> EOF
> )
[c.biancheng.net]$ echo $n
30

Shell数学计算(算术运算,加减乘除运算)相关推荐

  1. Linux 下Shell脚本中的加减乘除运算

    在用shell脚本语言编程的时候,我们经常用到加减乘除等基本的数学运算操作,现在整理一下,放在这里,以备后用. Shell中常用的数学运算符有一下几个: +:对两个变量做加法.-:对两个变量做减法.* ...

  2. Unix Shell 数学计算命令

    1.使用赋值语句: 格式: let 赋值表达式 [tip]赋值表达式可以省略为: ((赋值表达式)) 例:给自变量i加1 let i=i+1 或 ((i=i+1))       ----------- ...

  3. Java实现Complex复数类及其常见数学计算

    Complex 数学计算:加减乘除.求模.辐角.平方根.倒数.相反数.共轭复数等 其他:字符串转复数parseComplex().复数转字符串toString()等 import java.util. ...

  4. shell 做加法运算_Shell数学计算(算术运算,加减乘除运算)

    如果要执行算术运算(数学计算),就离不开各种运算符号,和其他编程语言类似,Shell 也有很多算术运算符,下面就给大家介绍一下常见的 Shell 算术运算符,如下表所示.Shell 算术运算符一览表算 ...

  5. python中怎么计算_python中的加减乘除运算

    python中的加减乘除运算,是学习python入门的基础,是以后进行数学计算的关键部分.包括运算表达式的写法,运算规则,加减乘除,求余,求商等等. 工具/原料 python 电脑 方法/步骤 1 1 ...

  6. shell 中数学计算总结

    http://hi.baidu.com/syqust/item/978c943303d26d8bf4e4ad68 note:在shell的赋值=或者其他运算,不能用空格隔开 shell中的赋值和操作默 ...

  7. c语言循环计算分式加减乘除混合运算,计算()_分式的加减乘除混合运算及分式的化简_中学题库-沪江中学学科网...

    分式加减乘除混合运算:分式的混合运算应先乘方,再乘除,最后算加减,有括号的先算括号内的,也可以把除法转化为乘法,再运用乘法运算. 分式化简:在数学上,化简是十分重要的概念,一些复杂难辨的式子,很多时候 ...

  8. Shell脚本笔记(三)shell中的数学计算

    shell中的数学计算 一.使用方括号 #!/bin/bash a=10 b=29 c=88res=$[$a * ($c-$b)] echo $res 二.使用(()) echo $((1+9)) ( ...

  9. python数值运算答案_笨方法学Python 习题3:数字和数学计算

    数字和数学计算 print("I will now count my chickens") print("Hens",25+30/6) print(" ...

最新文章

  1. python工作招聘-python爬虫 智联招聘 工作地点
  2. DB1:数据库的创建和文件的修改
  3. vue项目创建,redis列表字典操作,django用redis的第二种方法
  4. 软件系统架构~软件架构概念
  5. activemq中怎么知道推送消息是否成功_如何优雅的使用activeMQ 安装、应用、安全认证、持久化...
  6. BZOJ1509: [NOI2003]逃学的小孩
  7. 单点登录原理与代码实现
  8. linux系统查看dns缓存,如何清空linux的DNS缓存
  9. 2022-05-30 无法验证是否已安装所需的Microsoft更新KB2919355
  10. qml如何发布程序_微信小程序如何发布?公司和个人注册流程科普
  11. iou(交并比)的概念
  12. springboot项目jar包发布的,如何线上修改jar包。
  13. 夜光:武汉加油,中国加油
  14. PMP证书怎么续证?PDU要怎么获得?超过有效期证书就作废了吗?
  15. Unix编程/应用问答中文版(转)
  16. Python学习 Day28 JS函数(二)
  17. Python每日练习
  18. 为什么嘀嘀们用不上区块链?
  19. 种植福田{培植福报}~福慧双修——悟透自己!
  20. 计算机科学文献中英文对照,计算机科学和技术英文文献.doc

热门文章

  1. 长,短,超短基线定位方式
  2. 【Linux 中国】横向对比 5 款微软 Office 替代品
  3. 2021-07-23 Week1 基于截图的钓鱼网站检测、中小微企业安全现状调查
  4. DES加密算法详细过程
  5. 画好漫画人物的表情有哪些技巧?
  6. 学习AJAX必知必会(2)~Ajax基本使用,设置请求行、请求体、请求头,服务端响应JSON数据
  7. 商业航班使用100%普适可持续航空燃料首飞;安凡尼酒店及度假村蓄势发力大中华区市场 | 全球旅报...
  8. ART世界探险(4) - 数据传送指令和桶型移位器
  9. 方正静蕾简体使用方法
  10. PPT投影时常用快捷键