运算
2023-1-19
| 2023-8-2
0  |  阅读时长 0 分钟
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#numberbase进制的数
 

位运算

$((...))支持以下的二进制位运算符。
  • <<:位左移运算,把一个数字的所有位向左移动指定的位。
  • >>:位右移运算,把一个数字的所有位向右移动指定的位。
  • &:位的“与”运算,对两个数字的所有位执行一个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这个式子里面不能有空格,否则会报错。
  • 计算机基础
  • Linux
  • Shell脚本
  • 字符串行操作
    目录