简介

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. Linux目录结构-上部

    第1章 目录结构 1.1 目录结构特点 倒挂的树状结构一切从根开始一切皆文件 1.2 目录结构 /bin            二进制文件  命令 /sbin           超级命令只有root ...

  2. 这事没完,继续聊spring cloud stream和kafka的这些小事

    上一篇文章讲了如何用spring cloud stream集成kafka,并且跑起来一个demo,如果这一次宣传spring cloud stream的文章,其实到这里就可以啦.但实际上,工程永远不是 ...

  3. Rust 入门 (五)

    定义并介绍结构体 结构体和我们前面学习的元组类似,结构体中的每一项都可以是不同的数据类型.和元组不同的地方在于,我们需要给结构体的每一项命名.结构体较元组的优势是:我们声明和访问数据项的时候不必使用索 ...

  4. 程序员的算法课(14)-Hash算法-对海量url判重

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  5. django中的restful规范

    基于django的原生restful规范 主路由:url.py from django.conf.urls import url, include from django.contrib import ...

  6. CCNA 之 七 路由协议 三 OSPF

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

  7. Nginx动静分离(Nginx+Tomcat)

    第一步:nginx构建 第二步:Tomcat构建 1.Tomcat基础点 (1)Tomcat 是基于java开发的web容器,用来发布java代码和jsp网页. (2)开发人员开发java web网站 ...

  8. Python之HTTP静态服务器-面向对象版开发

    利用面向对象的思想完成HTTP静态Web服务器的开发. 主要思路如下: 1.抽象出一个服务器类 1.1 编写类的对象属性 1.2 编写类的方法 注意: 在进行请求资源路径判断时,需要确认请求路径中是否 ...

  9. std::unique_ptr的用法

    std::ofstream("demo.txt") << 'x'; // 准备要读的文件 { std::unique_ptr<std::FILE, decltyp ...

  10. redis位图巧用,节约内存

    最近要做一个圣诞抽奖活动,需要记录每天用户签到的记录,以前一般都是用普通的字符串数据类型,每个用户的签到用一个 key // 用户10在活动第一天的签到key为record:1:10 $key = & ...