1.算术表达式
((...))
语法可以进行整数的算术运算。
$ ((foo = 5 + 5))
$ echo $foo
10
((...))
会自动忽略内部的空格,所以下面的写法都正确,得到同样的结果。
((...))
语法支持的算术运算符如下。
+
:加法-
:减法*
:乘法/
:除法(整除)%
:余数**
:指数++
:自增运算(前缀或后缀)--
:自减运算(前缀或后缀)
注意,除法运算符的返回结果总是整数,比如5
除以2
,得到的结果是2
,而不是2.5
。
++
和--
这两个运算符有前缀和后缀的区别。作为前缀是先运算后返回值,作为后缀是先返回值后运算。
$ i=0
$ echo $i
0
$ echo $((i++))
0
$ echo $i
1
$ echo $((++i))
2
$ echo $i
2
$((...))
内部可以用圆括号改变运算顺序。
这个语法只能计算整数,否则会报错。
# 报错
$ echo $((1.5 + 1))
bash: 语法错误
如果在$((...))
里面使用字符串,Bash 会认为那是一个变量名。如果不存在同名变量,Bash 就会将其作为空值,因此不会报错。
$ echo $(( "hello" + 2))
2
$ echo $(( "hello" * 2))
0
上面例子中,"hello"
会被当作变量名,返回空值,而$((...))
会将空值当作0
,所以乘法的运算结果就是0
。同理,如果$((...))
里面使用不存在的变量,也会当作0
处理。
2.数值得进制
number
:没有任何特殊表示法的数字是十进制数(以10为底)。0number
:八进制数。0xnumber
:十六进制数。base#number
:base
进制的数。
$ echo $((0xff))
255
$ echo $((2#11111111))
255
3.位运算
$((...))
支持以下的二进制位运算符。
<<
:位左移运算,把一个数字的所有位向左移动指定的位。>>
:位右移运算,把一个数字的所有位向右移动指定的位。&
:位的“与”运算,对两个数字的所有位执行一个AND
操作。|
:位的“或”运算,对两个数字的所有位执行一个OR
操作。~
:位的“否”运算,对一个数字的所有位取反。^
:位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
4.逻辑运算
$((...))
支持以下的逻辑运算符。
<
:小于>
:大于<=
:小于或相等>=
:大于或相等==
:相等!=
:不相等&&
:逻辑与||
:逻辑或!
:逻辑否expr1?expr2:expr3
:三元条件运算符。若表达式expr1
的计算结果为非零值(算术真),则执行表达式expr2
,否则执行表达式expr3
。
如果逻辑表达式为真,返回1
,否则返回0
。
5.赋值运算
算术表达式$((...))
可以执行赋值运算。
$ echo $((a=1))
1
$ echo $a
1
上面例子中,a=1
对变量a
进行赋值。这个式子本身也是一个表达式,返回值就是等号右边的值。
$((...))
支持的赋值运算符,有以下这些。
parameter = value
:简单赋值。parameter += value
:等价于parameter = parameter + value
。parameter -= value
:等价于parameter = parameter – value
。parameter *= value
:等价于parameter = parameter * value
。parameter /= value
:等价于parameter = parameter / value
。parameter %= value
:等价于parameter = parameter % value
。parameter <<= value
:等价于parameter = parameter << value
。parameter >>= value
:等价于parameter = parameter >> value
。parameter &= value
:等价于parameter = parameter & value
。parameter |= value
:等价于parameter = parameter | value
。parameter ^= value
:等价于parameter = parameter ^ value
。
6.求值运算
逗号,
在$((...))
内部是求值运算符,执行前后两个表达式,并返回后一个表达式的值。
$ echo $((foo = 1 + 2, 3 * 4))
12
$ echo $foo
3
上面例子中,逗号前后两个表达式都会执行,然后返回后一个表达式的值12
。
7.expr命令
expr
命令支持算术运算,可以不使用((...))
语法。
$ expr 3 + 2
5
expr
命令支持变量替换。
$ foo=3
$ expr $foo + 2
5
expr
命令也不支持非整数参数。
$ expr 3.5 + 2
expr: 非整数参数
上面例子中,如果有非整数的运算,expr
命令就报错了。
8.let命令
let
命令用于将算术运算的结果,赋予一个变量。
$ let x=2+3
$ echo $x
5
上面例子中,变量x
等于2+3
的运算结果。
注意,x=2+3
这个式子里面不能有空格,否则会报错。let
命令的详细用法参见《变量》一章。