[转帖]Bash脚本编程学习笔记03:算术运算

bash,脚本,编程,学习,笔记,算术,运算 · 浏览次数 : 0

小编点评

**bash算术表达式** bash支持以下算术运算: * **加号 (+)**:将两个数字连接在一起。 * **减号 (-)**:将两个数字连接在一起,并将结果减去。 * **乘号 (*)**:将两个数字连接在一起,并将结果乘积。 * **除号 (/)**:将两个数字连接在一起,并将结果除以。 **优先级、结合性和值** * 运算符的优先级从左到右依次降低。 * 运算符的结合性从左到右依次从高到低。 * 运算符的值从右到左依次从低到高。 **变量默认类型** bash脚本默认变量类型是字符串型。这意味着无法直接执行算术运算。 **四种方法支持算术运算** 1. **内置命令** `let`:使用 `let` 关键字定义变量并执行算术运算。 2. **`$[ARITHMETIC EXPRESSION]`**:使用 `$[` 和 `]` 符号定义算术表达式并执行运算。 3. **`Arithmetic Expansion (Bash Reference Manual)`**:使用 `$(( ))` 符号进行算术表达式计算。 4. **外部命令** `expr`:使用 `expr` 命令进行算术运算。

正文

https://www.cnblogs.com/alongdidi/p/bash_arithmetic_expression.html

 

简介

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

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

1+2=3

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

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

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

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

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

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

方法一:内置命令let

let arg [arg ...]

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

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

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

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

方法二:$[ARITHMETIC EXPRESSION]

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

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

方法三:Bash算术展开

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

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

方法四:外部命令expr

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

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

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

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

 

总结

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

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

与[转帖]Bash脚本编程学习笔记03:算术运算相似的内容:

[转帖]Bash脚本编程学习笔记03:算术运算

https://www.cnblogs.com/alongdidi/p/bash_arithmetic_expression.html 简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence)、结合性(associativity)和

[转帖]Bash脚本编程学习笔记03:算术运算

https://www.cnblogs.com/alongdidi/p/bash_arithmetic_expression.html 简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence)、结合性(associativity)和

[转帖]Bash脚本编程学习笔记07:循环结构体

https://www.cnblogs.com/alongdidi/p/bash_loop_construct.html 本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文《Bash脚本编程学习笔记03:算术运算》中我有说明不要使用,不过自己忘记了。大家还

[转帖]Bash脚本编程学习笔记02:脚本基础和bash配置文件

脚本基础 参考资料:Shell Scripts (Bash Reference Manual) 不严谨地说,编程语言根据代码运行的方式,可以分为两种方式: 编译运行:需要先将人类可识别的代码文件编译成机器可运行的二进制程序文件后,方可运行。例如C语言和Java语言。 解释运行:需要一个编程语言的解释

[转帖]Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量 我自己接触Linux主要是大学学习的Turbolinux --> 根据《鸟哥的Linux私房菜:基础篇》(第三版) --> 马哥的就业班课程。给我的感觉是这些课程对于bash的讲解,理论上是不够的,但是限于时间、篇幅和精

[转帖]Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

https://www.cnblogs.com/alongdidi/p/test_exitStatus_positionalAndSpecialParameter.html 我自己接触Linux主要是大学学习的Turbolinux --> 根据《鸟哥的Linux私房菜:基础篇》(第三版) --> 马

[转帖]Bash脚本编程学习笔记05:用户交互与脚本调试

https://www.cnblogs.com/alongdidi/p/read_and_bash_debug.html 用户交互 在《学习笔记04》中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式。还有一种方式,是read命令。 [root@c7-server ~]# read nam

[转帖]Bash脚本编程学习笔记06:条件结构体

简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式。 if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现,返回值为0的话则执行CMD,否则就离开该条件结构体,脚本继续往下执行。 [root@c7-serve

[转帖]Bash脚本编程学习笔记08:函数

https://www.cnblogs.com/alongdidi/p/bash_function.html 官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在《Bash脚本编程学习笔记06:条件结构体》中最后所说的,我们应该把一些可能反复执行

[转帖]Bash脚本编程学习笔记09:数组

https://www.cnblogs.com/alongdidi/p/bash_array.html 数组简介 在bash脚本编程当中,变量是存储单个元素的内存空间;而数组是存储多个元素的一段连续的内存空间。 数组由数组名和下标构成,如下。 ARRAY_NAME[SUBSCRIPT] 数组按照下标