简介

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;最后的$[...]没有找到其来源,可以不使用它。

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

最新文章

  1. SQL Server 存储中间结果集
  2. 《Entity Framework 6 Recipes》中文翻译系列 (31) ------ 第六章 继承与建模高级应用之自引用关联
  3. s5pv210启动debian出错提示bash: cannot set terminal process group (-1): Inappropriate ioctl for device
  4. Sql 数据引擎中删除用户名、密码信息
  5. [Swift2.0系列]Defer/Guard 基础语法
  6. 解决Jquery和prototype的兼容问题
  7. 深入hibernate的三种状态【转载】
  8. 50 Pow(x, n)(求x的n次方Medium)
  9. linux 下apache安装、启动和配置
  10. shell 脚本运算符
  11. vijos1034题解
  12. springdata 使用plql更新时候注意点 ?2 表示从方法中获取第二个形参的值 ?1表示从方法中获取第一个值
  13. 论文阅读笔记四十三:DeeperLab: Single-Shot Image Parser(CVPR2019)
  14. SQL 中的语法顺序与执行顺序
  15. 数据库的IO and 数据库优化问题
  16. html5-表单属性及<!DOCTYPE> 标签
  17. Java下LDAP操作的资料
  18. Contest 2
  19. 20190430-BootstrapのJS插件
  20. 批处理之FOR命令

热门文章

  1. Precision,Recall,F1的计算
  2. Kibana笔记
  3. 【Android - 控件】之MD - RecyclerView的使用
  4. 安装部署MySQL主从复制
  5. iOS13暂时关闭黑暗模式+应用内状态栏无法显示问题解决办法
  6. 创建raid5(3个raid2个备份)
  7. 成功build Maven但eclipse中依然显示该工程有错误
  8. luogu P1412 经营与开发 |dp
  9. Linux内核最顶层文档
  10. IPhone下json的解析 NSJSONSerialization