简介

Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence)、结合性(associativity)和值,详见Shell Arithmetic (Bash Reference Manual)

注意:如果乘号“*”在某些场景中失效,有可能是它被解释成了通配符,可尝试对其转义。

+=

在上面这个简单的算术运算中,1和2叫做操作数/运算元(operand),“+”加号叫做操作符/运算符(operator),1+2整个叫做算术表达式(arithmetic expression),对于算术表达式的求值过程叫做evaluate。

在bash脚本编程中,变量的默认类型是字符串型,因此是无法直接执行算术运算的。

[root@c7-server ~]# num1=
[root@c7-server ~]# num2=
[root@c7-server ~]# echo $num1+$num2
+

即便是使用declare命令显式声明变量为整型,也是不行的。

[root@c7-server ~]# declare -i num1=
[root@c7-server ~]# declare -i num2=
[root@c7-server ~]# echo $num1+$num2
+

在bash中,想要支持算术运算有以下四种方式:

方法一:内置命令let

let arg [arg ...]

每个arg,都是一个算术表达式。

[root@c7-server ~]# num1=
[root@c7-server ~]# num2=
[root@c7-server ~]# let sum=$num1+$num2
[root@c7-server ~]# echo $sum

一般都会使用一个变量来存储算术表达式的结果,let命令本身是不会将算术表达式的结果返回的。

[root@c7-server ~]# let $num1+$num2
[root@c7-server ~]#

方法二:$[ARITHMETIC EXPRESSION]

这种方式,马哥有提到,但是在bash的手册中似乎没找到。应该是一种非官方的方式,慎用。(后续在条件和循环结构体的博文中,涉及的算术运算很多都使用了这种方式,当时给忘记了,大家尽量避免使用这种方式)

[root@c7-server ~]# sum=$[$num1+$num2]
[root@c7-server ~]# echo $sum

方法三:Bash算术展开

这个是bash自身支持的shell展开中的一种。Arithmetic Expansion (Bash Reference Manual)

$(( ARITHMETIC EXPRESSION ))
[root@c7-server ~]# sum=$(($num1+$num2))
[root@c7-server ~]# echo $sum

方法四:外部命令expr

需要使用命令替换的方式来赋值。

[root@c7-server ~]# expr $num1 + $num2

[root@c7-server ~]# sum=$(expr $num1 + $num2)
[root@c7-server ~]# echo $sum

操作符的两边需要有空格,不然操作符无法被正确解释。

[root@c7-server ~]# expr $num1+$num2
+

总结

内置命令let和shell展开中的算术展开是bash所自带的算术运算方式,比较推荐使用这类方式;外部命令expr是来自于CentOS所提供的程序包coreutils;最后的$[...]没有找到其来源,可以不使用它。

在本实例中只展示了简单的加法运算,在实际使用当中会比较复杂,建议用户可使用一种方式(如算术展开)来熟练即可。

Bash脚本编程之算术运算的更多相关文章

  1. 高级bash脚本编程(三)

    高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...

  2. bash脚本编程知识储备

    bash脚本编程:     脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习)       ...

  3. Bash脚本编程学习笔记07:循环结构体

    本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...

  4. 脚本命令高级Bash脚本编程指南(31):数学计算命令

    题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...

  5. 高级Bash脚本编程指南(27):文本处理命令(三)

    高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...

  6. 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese

    <Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...

  7. 高级Bash脚本编程(二)

    高级Bash脚本编程(二) 退出 退出状态码 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理. 每个命令都会返回一个退出状态码,成 ...

  8. 高级Bash脚本编程(一)

    高级Bash脚本编程 Bash 它是能力很强的计算机语言,被称为解释性语言或脚本语言,它可以调用所有的UNIX命令和工具再加上公共程序. Bash中的特殊字符 注释(#) (除#!外,#!是用于指定当 ...

  9. Bash脚本编程总结

    bash脚本编程之用户交互: read [option]… [name …]  -p ‘PROMPT’  -t TIMEOUT bash -n /path/to/some_script  检测脚本中的 ...

随机推荐

  1. 《软件安装》centos 安装 mysql

    上期问题回顾 全球 IPv4 地址正式耗尽,IPv4地址大约42.9亿,按照理论来说,每一个联网的设备都需要IP地址,而现在全球联网设备远远不止42.9亿,那么,这么多设备是怎么处理联网的问题呢? 先 ...

  2. CCNA 之 七 路由协议 三 OSPF

    OSPF协议 OSPF开放式最短路径优先 全称:Open Shortest Path First 是目前使用最为广泛的路由协议,主要因为OSPF是开放式协议,和IGRP.EIGRP思科的私有协议不同. ...

  3. C# MVC 过滤器

    APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器 ...

  4. java8 按两个属性分组,并返回扁平List; stream排序

    --------------- java8 按两个属性分组,并返回扁平List /** * 设置大区小区分组排序 * @param dtoList */ private List<Perform ...

  5. input监听

    <h1> 实时监测input中值的变化 </h1> <input type="text" id="username" autoco ...

  6. 在文件夹下所有文件中查找字符串(linux/windows)

    在linux下可以用 grep "String" filename.txt#字符串 文件名grep -r "String" /home/#递归查找目录下所有文件 ...

  7. 第八次作业-非确定的自动机NFA确定化为DFA

    NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合. 步骤: 1. ...

  8. MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...

  9. PDF怎么删除页面?教你两个超级好用的方法

    在日常办公中,由于工作需要我们有时候会对PDF文件中的内容进行二次编辑,可能需要删除PDF文件中的一些页面.那么PDF怎么删除页面呢?小伙伴们还在为这个问题苦恼吗?那么今天小编就来教大家两个超级好用的 ...

  10. HDU-1698-----Just Hook

    In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. T ...