与其他语言都大同小异。
算术扩展表达式
1、语法:(( ... ))
,可以进行整数的运算。
# 通过算术表达式定义一个变量
$ ((var1 = 10 + 10))
$ echo ${var1}
20
读取运算结果,需要在头部追加美元符:$(( ... ))
# 错误示范
$ echo ((10 + 10))
-bash: syntax error near unexpected token `('
# 直接输出
$ echo $((10 + 10))
20
# 运算结果赋值给变量
$ var1=$((1+1))
$ echo ${var1}
2
2、表达式中使用变量
var1=10
# 通过扩展获取变量值
$ echo $(( ${var1} ** 2 ))
100
# 直接通过变量名也是可以取到变量值的
$ echo $(( var1 ** 2 ))
100
# 若读取了一个不存在的变量,会被视为0处理
$ echo $(( tempVar + 2))
2
3、算术表达式支持运算符:
整数运算符
+
:加法-
:减法*
:乘法/
:除法(整除,返回结果总是整数)%
:余数**
:指数++
:自增运算(前缀或后缀)--
:自减运算(前缀或后缀)
除法:返回结果总是整数
$ echo $((5 / 2))
2
自增、自减:作为前缀时先计算在返回结果,作为后缀时先返回在计算结果。
# 自增
v$ ar1=1
$ echo $((var1++))
1
$ echo ${var1}
2
$ echo $((++var1))
3
# 自减
echo $((var1--))
3
$ echo ${var1}
2
$ echo $((--var1))
1
位运算:
数值的进制:Bash 的数值默认都是十进制,但是在算术表达式中,也可以使用其他进制。
- number:没有任何特殊表示法的数字是十进制数(以10为底)。
- 0number:八进制数。
- 0xnumber:十六进制数。
- n#number:n进制的数。
# 十六进制
$ echo $((0xff))
255
# 二进制
$ echo $((2#11111111))
255
<<
:位左移运算,把一个数字的所有位向左移动指定的位。>>
:位右移运算,把一个数字的所有位向右移动指定的位。&
:位的“与”运算,对两个数字的所有位执行一个AND操作。|
:位的“或”运算,对两个数字的所有位执行一个OR操作。~
:位的“否”运算,对一个数字的所有位取反。^
:位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
$ echo $((16>>2))
4
$ echo $((16<<2))
64
# 17的二进制:10001,3的二进制11
$ echo $((17&3))
1
$ echo $((17|3))
19
$ echo $((17^3))
18
逻辑运算:如果逻辑表达式为真,返回1,否则返回0。
<
:小于>
:大于<=
:小于或相等>=
:大于或相等==
:相等!=
:不相等&&
:逻辑与||
:逻辑或!
:逻辑否expr1?expr2:expr3
:三元条件运算符。expr1为真返回expr2,否则返回expr3。
$ echo $((3 > 2))
1
$ echo $(( (3 > 2) || (4 <= 1) ))
1
$ echo $(( 1 ? 2 : 3))
2
赋值运算:
var = value
:简单赋值。var += value
:var = var + value
var -= value
:var = var – value
var *= value
:var = var * value
var /= value
:var = var / value
var %= value
:var = var % value
var <<= value
:var = var << value
var >>= value
:var = var >> value
var &= value
:var = var & value
var |= value
:var = var | value
var ^= value
:var = var ^ value
4、更改计算优先级
先计算括号中的内容
$ echo $(( (1 + 2) * 3 ))
9
5、嵌套运算
$ echo $(( (2 ** 2) + 3 ))
7
$ echo $(( $((2 ** 2)) + 3 ))
7
6、只支持整数运算
$ echo $((1.5 + 1))
-bash: 1.5 + 1: syntax error: invalid arithmetic operator (error token is ".5 + 1")
expr 命令
该命令可以实现(( ... ))
这样的写法的整数计算功能,不过相比较写法上还是有许多需要注意的不同点。而且还支持字符串操作。详细写法现用现查。
let 命令
该命令声明变量时,可以直接执行算术表达式。
$ let var1=10
# 不同于 readonly,并不会对变量添加 -i 属性
$ declare -p var1
declare -- var1="10"
测试:
$ let var1=10
$ echo ${var1}
10
$ var1=10+10
$ echo ${var1}
10+10
$ let var1=10+10
$ echo ${var1}
20
说明,只有在声明赋值时才能使用算术表达式。
参数表达式如果包含空格,就需要使用引号:
let "var1 = 10 + 20"