type
status
date
slug
summary
tags
category
icon
password
Property
算术表达式
((...))
语法可以进行整数的算术运算((...))
会自动忽略内部的空格,所以下面的写法都正确,得到同样的结果。这个语法不返回值,命令执行的结果根据算术运算的结果而定。只要算术结果不是
0
,命令就算执行成功。如果算术结果为
0
,命令就算执行失败。如果要读取算术运算的结果,需要在
((...))
前面加上美元符号$((...))
,使其变成算术表达式,返回算术运算的值。((...))
语法支持的算术运算符如下。+
:加法
-
:减法
*
:乘法
/
:除法(整除)
%
:余数
**
:指数
++
:自增运算(前缀或后缀)
--
:自减运算(前缀或后缀)
++
和--
这两个运算符有前缀和后缀的区别。作为前缀是先运算后返回值,作为后缀是先返回值后运算。$((...))
内部可以用圆括号改变运算顺序。$((...))
结构可以嵌套。这个语法只能计算整数,否则会报错。
$((...))
的圆括号之中,不需要在变量名之前加上$
,不过加上也不报错。如果在
$((...))
里面使用字符串,Bash 会认为那是一个变量名。如果不存在同名变量,Bash 就会将其作为空值,因此不会报错。如果一个变量的值为字符串,跟上面的处理逻辑是一样的。即该字符串如果不对应已存在的变量,在
$((...))
里面会被当作空值。变量
foo
的值是hello
,而hello
也会被看作变量名。这使得有可能写出动态替换的代码。foo + 2
取决于变量hello
的值。最后,
$[...]
是以前的语法,也可以做整数运算,不建议使用。数值的进制
Bash 的数值默认都是十进制,但是在算术表达式中,也可以使用其他进制。
number
:没有任何特殊表示法的数字是十进制数(以10为底)
0number
:八进制数
0xnumber
:十六进制数
base#number
:base
进制的数
位运算
$((...))
支持以下的二进制位运算符。<<
:位左移运算,把一个数字的所有位向左移动指定的位。
>>
:位右移运算,把一个数字的所有位向右移动指定的位。
&
:位的“与”运算,对两个数字的所有位执行一个AND
操作。
|
:位的“或”运算,对两个数字的所有位执行一个OR
操作。
~
:位的“否”运算,对一个数字的所有位取反。
^
:位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
逻辑运算
$((...))
支持以下的逻辑运算符<
:小于
>
:大于
<=
:小于或相等
>=
:大于或相等
==
:相等
!=
:不相等
&&
:逻辑与
||
:逻辑或
!
:逻辑否
expr1?expr2:expr3
:三元条件运算符。若表达式expr1
的计算结果为非零值(算术真),则执行表达式expr2
,否则执行表达式expr3
。
如果逻辑表达式为真,返回
1
,否则返回0
。三元运算符执行一个单独的逻辑测试。它用起来类似于
if/then/else
语句。第一个表达式为真时,返回第二个表达式的值,否则返回第三个表达式的值。
赋值运算
算术表达式
$((...))
可以执行赋值运算。$((...))
支持的赋值运算符,有以下这些。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
。
如果在表达式内部赋值,可以放在圆括号中,否则会报错。
求值运算
逗号
,
在$((...))
内部是求值运算符,执行前后两个表达式,并返回后一个表达式的值。expr 命令
expr
命令支持算术运算,可以不使用((...))
语法:expr
命令支持变量替换:expr
命令也不支持非整数参数:let 命令
let
命令用于将算术运算的结果,赋予一个变量。注意,
x=2+3
这个式子里面不能有空格,否则会报错。